数据不是排成一条线,而是排成一个方阵
大多数链把区块数据当成一条一维序列:先来的交易排前面,依次往后接。Celestia 不这样。它的规格文档对区块布局的说明从一句前提开始:整套数据可用性方案的核心,是把数据排进一个二维矩阵,再对每一行、每一列做纠删编码,这样节点不必下载全部数据,采样几行几列就敢对”数据已发布”下结论。矩阵边长 k 必须是二的幂,比如 1、2、4、8、16、32,因为纠删编码算法在这个条件下最顺。
谁坐哪一格:排序规则

方阵不是随便填的。官方规格给了几条硬规则。第一,数据按命名空间排序——每个 Rollup 应用有自己的命名空间,格子里的数据按命名空间值排成一列队,这让命名空间默克尔树的包含证明又小又快。第二,非 blob 数据(普通交易等)没有天然归属,被放进从最小值开始的一段保留命名空间,因此按构造,非 blob 数据在行优先顺序里永远排在 blob 数据前面。第三,不同命名空间的数据不许挤进同一个份额(share):宁愿浪费一点区块空间,也要保证每个默克尔叶子只属于一个命名空间。
规则之间还有摩擦。blob 的份额不能首尾直接相接——每条 blob 的份额承诺规则要求它从一个特定对齐位置起排,于是 blob 与 blob 之间要垫”命名空间填充份额”,它借用前一个 blob 的命名空间,只为把下一个 blob 顶到合法起点。规格同时说明,这些填充份额不携带有意义的数据,客户端可以忽略其内容。矩阵填满前的最后一段空隙,由”尾部填充份额”补齐,让总份额数恰好是完全平方数。
为什么要付这些”浪费”的代价
填充换回来三样东西。其一是采样可行性:数据在行、列两个方向都被纠删码扩展后,攻击者想隐瞒一部分数据就必须接近全网散布,随机采样才能给出有把握的可用性结论。其二是证明体积:包含某条 blob 的证明沿命名空间默克尔树走,只与相关行相交,与整块大小基本无关——这正是轻节点只下载自己关心的行就能核验的理论基础。其三是排序可推断:由于保留命名空间占住两端(尾部填充用的命名空间值在数值上排最后),即使将来引入新的用户命名空间版本,排序性质也不会被打破。
对做集成的人来说,这套布局有一个很实际的推论:同一个 Rollup 的 blob 在方块里未必连续,查询要按命名空间走节点提供的证明接口,而不是假设”按时间顺序扫原始字节”。文档给出的 SubtreeRootThreshold 常量还解释了另一种权衡:阈值调大,方块更紧凑、填充更少,但包含证明里的子树根更多、证明更大——紧凑和证明小是一对矛盾。
顺带一提,纠删扩展本身也有空间账:二维扩展后矩阵边长翻倍,奇偶份额落在原数据方阵的三个象限外侧,可用数据率约为四分之一。这正是”敢让你只采样几个格子”的物理代价——冗余不是浪费,而是把’数据是否齐全’从下载问题变成概率问题的原材料。
边界在哪里
第一,“不下载全部数据”不是魔法:安全性建立在纠删码扩展与足够多独立节点的随机采样上,采样数不足时结论强度会打折,具体安全参数以官方数据可用性采样文档为准。第二,方块尺寸上限、份额大小这类参数会随版本调整,引用具体数字前先看当前版本的规格文件。第三,布局解决的是”数据怎么放才能被便宜地验证”,不解决谁来排序、费用由谁出——那是 Celestia 共识层与其他模块的职责。本文只描述公开的规格设计,不构成任何投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。