ICS-23 向量承诺是什么?跨链桥证明状态的三条性质 图 1
ICS-23 向量承诺是什么?跨链桥证明状态的三条性质 · 图 1

为什么跨链验证需要一层”承诺”抽象

IBC 要让一条链上的轻客户端核实”另一条链某个状态路径上确实是这个值”,或者确认可它不存在。最直接的做法,是把某一种具体默克尔树的证明格式写死进轻客户端——但 Cosmos 生态的链并不共用同一棵状态树:有的用 IAVL 树,有的用简单的哈希合并树,将来还可能换其他结构,而 IBC 协议本身不想跟着改。ICS-23 就是为此把”怎么证”和”证什么”分开的规范:它定义了一类叫向量承诺的接口,规定任何想接入 IBC 的承诺构造必须提供哪些函数、满足哪些性质,内部数据结构则完全留给实现者。这份规范 2019 年 4 月提交草案,参考实现放在 cosmos/ics23 仓库、提供 Go 与 Rust 两种语言;配套的 ICS-24 主机要求明确把它列为依赖项——换句话说,一条链无论内部状态怎么存,接入 IBC 都得按这套接口对外出具证明。

三种角色与一组函数

规范把承诺体系分成三种角色:管理者是往承诺里增删条目的主体,通常是链自己的状态机;证明者负责出具证明,通常是中继者;验证者负责核验证明,通常是运行在另一条链上的 IBC 处理模块。围绕这套分工,规范要求实现必须提供一组固定函数:generate 从初始的键值映射建立承诺状态;calculateRoot 把全部状态压缩成一个定长的承诺根;set 与 remove 负责增删条目;createMembershipProof 与 createNonMembershipProof 分别生成”某路径的值是某值”与”某路径没有对应值”两类证明;verifyMembership 与 verifyNonMembership 则在给定承诺根的前提下做对应核验。还有一组前缀(prefix)机制值得注意:applyPrefix 把路径解释进某个存储前缀之下——同一条路径在不同模块名下含义完全不同,这个机制防的是”该记在甲模块的数据被塞进乙模块再证明”的张冠李戴。规范还定义了可选的批量验证函数,并给出一致性约束:批量核验的结果必须与逐条核验再取逻辑与完全相同,只是效率可能更高。

承诺根向两侧链上验证方出具包含与不包含证明的向量承诺结构

三条性质缺一不可

规范以安全参数 k 为基准,要求任何实现同时满足三条性质。完整性:被写进承诺的键总能被证明包含、没写进的键总能被证明不存在,验证者拒绝真证明的概率必须可以忽略。可靠性朝反方向发力:没写进的键不可能被伪造出包含证明,写进过的键也不可能被”证明缺席”。规范在这里交代了一个工程细节:默克尔树式的承诺要证明某个键不存在,通常靠字典序完成——证明该键名义上的两个邻居都存在且互为相邻,键本身缺席就被顺带证出。位置绑定是第三条:同一条路径只能打开出一个值,想用同一根、同一路径开出第二个值,成功概率必须可以忽略。IBC 的收发包确认逻辑建立在”这三条同时成立”的前提上,任何一条被实现破坏,另一条链上的模块就会把不存在的事实当成真。

边界在哪里

向量承诺只解决”状态证明的编码与核验”,至于”这个承诺根本身可不可信”,由轻客户端的共识验证层负责——证明有效但根选错了,全盘皆错。规范也明说承诺算法本身预期保持稳定,要引入新算法走连接与通道版本协商,而不是热替换。对读者而言可落地的核验动作是:看一条链的 IBC 实现是否与 cosmos/ics23 仓库定义的证明类型对齐;看它的证明体系里是否真的存在”非成员证明”这一类——只有包含证明的实现,撑不起 IBC 用”不存在”作证据的那半边逻辑。协议与实现仍在演进,接口细节以官方规范与实现仓库当前版本为准。

以上为协议机制说明,不构成任何投资建议;跨链资产转移伴随合约、共识与治理层面的多重风险,请独立核验后再做决定。