特殊cell
每个cell都有其自己的类型,由一个从 -1 到 255 的整数编码。
类型为 -1 的cell是普通
cell,所有其他类型的cell称为异构
或特殊
cell。
特殊cell的类型存储在其数据的前八位中。如果特殊cell的数据位数少于八位,那么它是无效的。
目前,有 4 种特殊cell类型:
{
Prunned Branch: 1,
Library Reference: 2,
Merkle Proof: 3,
Merkle Update: 4
}
裁剪分支
裁剪分支是代表已删除cell子树的cell。
它们可以有 1 <= l <= 3
的级别,并且包含恰好 8 + 8 + 256 * l + 16 * l
位。
第一个字节始终是 01
- cell类型。第二个字节是裁剪分支级别掩码。然后是 l * 32
字节的已删除子树的哈希,之后是 l * 2
字节的已删除子树的深度。
裁剪分支cell的级别 l
可能被称为其德布鲁因指数(De Bruijn index),因为它决定了裁剪分支是在构造哪个外部默克尔证明或默克尔更新时被修剪的。
裁剪分支的更高哈希存储在其数据中,可以这样获得:
Hash_i = CellData[2 + (i * 32) : 2 + ((i + 1) * 32)]
库引用
库引用cell用于在智能合约中使用库。
它们始终具有 0 级,并包含 8 + 256
位。
第一个字节始终是 02
- cell类型。接下来的 32 字节是被引用的库cell的 representation hash 。
默克尔证明
默克尔证明cell用于验证cell树数据的一部分属于完整树。这种设计允许验证者不存储树的全部内容,同时仍能通过根哈希验证内容。
默克尔证明恰好有一个引用,其级别 0 <= l <= 3
必须是 max(Lvl(ref) - 1, 0)
。这些cell恰好包含 8 + 256 + 16 = 280
位。
第一个字节始终是 03
- cell类型。接下来的 32 字节是 Hash_1(ref)
(如果引用级别为 0,则为 ReprHash(ref)
)。接下来的 2 字节是被引用替换的已删除子树的深度。
默克尔证明cell的更高哈希 Hash_i
的计算方式类似于普通cell,但使用 Hash_i+1(ref)
代替 Hash_i(ref)
。
默克尔更新
默克尔更新cell始终有 2 个引用,并且行为类似于两者的默克尔证明。
默克尔更新的级别 0 <= l <= 3
是 max(Lvl(ref1) − 1, Lvl(ref2) − 1, 0)
。它们恰好包含 8 + 256 + 256 + 16 + 16 = 552
位。
第一个字节始终是 04
- cell类型。接下来的 64 字节是 Hash_1(ref1)
和 Hash_2(ref2)
- 被称为旧哈希和新哈希。然后是 4 字节,表示已删除的旧子树和新子树的实际深度。