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
追加新的共识校验规则,将另作提案和设计部署。