数据层要回答”你没藏数据”
一条公共数据可用性链的区块里,往往塞着几十个 Rollup 提交的数据。一个只关心自己那条 Rollup 的轻节点提出两个要求:第一,我只下载我自己的数据;第二,数据服务方必须证明”关于你的命名空间,我没有少给”。普通默克尔树只能证明”某条数据在树里”,对第二种要求无能为力——服务方完全可以交出部分数据加一份合法的包含证明。Celestia 用命名空间默克尔树(Namespaced Merkle Tree,NMT)补上这块拼图:它是核心组件,替代了底层共识引擎原本存储区块数据的普通默克尔树。
树本身改了什么

NMT 做了两处改动。叶子按命名空间标识排序存放;哈希函数被替换成带命名空间的版本,每个节点除了正常的摘要,还携带其全部后代覆盖的最小与最大命名空间,输出形状是 minNs || maxNs || hash。于是一棵高度三层的树,根节点天然知道整块数据横跨哪些命名空间,中间每个节点也知道自己子树的命名空间区间。这些区间标签就是”完整性”的来源:普通默克尔树里兄弟节点只是一个三十二字节摘要,无法回答”那边还藏没藏我的数据”;NMT 节点则先把区间报出来,验证者再拿它与查询目标比对。参考实现里命名空间标识由一字节版本加二十八字节标识组成,证明节点按”最小命名空间、最大命名空间、三十二字节摘要”三段拼接,这些字段宽度原样写进了桥接合约的结构体定义。
包含证明如何顺带证明完整
当应用带着区块头里已有的数据根去查询某个命名空间时,服务方要交出匹配的叶子和一组证明节点。验证分两条线:一条是常规的默克尔区间证明,确认这些叶子确实挂在根下;另一条是完整性检查——位于起叶分支左侧的所有证明节点,其最大命名空间必须小于被查询命名空间;位于终叶分支右侧的所有节点,最小命名空间必须更大。这两个条件一旦不满足,比如兄弟节点的区间里还藏着查询命名空间的后代,就说明数据被截留了,客户端立刻能识别”给少了”。规范把这称为 inclusion 与 completeness 的双重校验。
查无此数据也要给凭证
如果查询的命名空间落在根节点的区间之内却没有任何消息,服务方不能空手而归,需要出具缺失证明(absence proof):给出一个哨兵叶子或某个更靠近根、命名空间区间与查询不相交的子树哈希的包含证明,同样配上完整性条件。规范还提供了更省字节的短版本缺失证明。若查询的命名空间干脆在根区间之外,则返回空证明即可。
它在整条流水线里的位置
NMT 让上层只取自己需要的数据成为可能:每个 Rollup 有自己的命名空间,执行层下载时忽略他人数据;规范的区块数据布局还让二维 Reed-Solomon 纠删编码得以实施,为数据可用性采样铺路——采样节点抽查的正是打过纠删冗余的分片矩阵,而轻节点对某个命名空间的信任最终回溯到区块头里那个携带区间标签的根。对以太坊侧的轻客户端桥接(Blobstream 一类方案)来说,验证一条数据经历三段证明:份额到行根的命名空间默克尔证明、行根到数据根的二叉证明、数据根元组到链上承诺的证明;查询接口把这三段都做成可按高度与份额区间请求的端点,跨行的数据会返回多组证明拼接。还要划清边界:NMT 根只证明数据完整可得,不证明任何状态转换正确——Rollup 的执行正确性仍然要靠自己的欺诈证明或有效性证明兜底;命名空间本身也不提供权限控制,谁能往某个命名空间写数据由链上消息与账户规则约定。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。