RFC31:区块添加一个变长字段

RFC31 区块添加一个变长字段(https://github.com/nervosnetwork/rfcs/pull/224)

目前,区块块头是定长结构。序列化后为 208 个字节。

在之后很多设想考量中的扩展功能需要在区块中添加新字段。例如,基于 PoA 的 testnet 需要为签名准备 65 字节的位置,flyclient 也需要添加 64 字节的存放哈希。

在添加扩展有一些考量,如果直接添加到区块头中会增加区块头的体积,并且会让区块头从定长结构变成变长,在序列化上有更多开销;如果添加到 cellbase 中,又会给轻客户端类应用带来额外的开销,在验证时需要额外下载 cellbase 和 merkle-tree 证明。

所以在RFC31中提出这样一个提案,用新字段 extra_hash 替换重命名块头中的 uncles_hash,在区块中添加一个新的 extension 字段。

extra_hash 的具体定义为:

  • 当区块中 extension 为空时, extra_hash 与原先的 uncles_hash一致。
  • extension 不为空时 extra_hash = ckbhash(uncles_hash || ckbhash(extension)),|| 为字符串拼接。

关于 RFC31 的部署:

  • 对于 RFC31 设定激活的 epoch 之前的区块,其extension字段强制缺省,extra_hash 也必须和之前定义的 uncles_hash一致。

  • 对于 RFC31 设定激活的 epoch 之后的区块,其extension字段可以缺省,或者为 1~96 长的任意 bytes。限制 96 bytes 以防止超出预期的滥用。

目前 RFC31 不对extension字段做进步一解释和限制,将来需要对extension追加新的共识校验规则,将另作提案和设计部署。