Verkle树是一种承诺方案,类似于默克尔树,但目击者却较小。它可以用矢量承诺代替默克尔树中的哈希,这使得更广泛的分支因素更有效。
感谢Kevaundray Wedderburn对该帖子的反馈。
概述
有关Verkle树的工作方式的详细信息,请参阅:
这篇文章的目的是解释 草稿关闭树EIP。它针对想要实施Verkle树并正在深入研究EIP的客户开发人员。
Verkle树对树结构引入了许多更改。最重要的变化是:
- 从20个字节键转换为32个字节键(不要与32个字节地址相混淆,这是一个单独的更改);
- 帐户和存储的合并;最后
- Verkle Trie本身的引入,它使用向量承诺而不是哈希。
作为Verkle树的向量承诺方案,我们使用 佩德森的承诺。 Pedersen承诺基于椭圆曲线。有关Pedersen承诺的介绍以及如何使用内部产品参数将其用作多项式或向量承诺 这里。
我们正在使用的曲线是 Bandersnatch。之所以选择此曲线是因为它是性能,并且还因为它将允许BLS12_381中的有效snarks在将来推理有关Verkle树的推理。这对于汇总以及允许升级可以将所有见证人压缩成一个实用性的snark,而无需进一步的承诺更新,这对于汇总可能很有用。
Bandersnatch的曲线顺序/标量字段大小为 p = 1310896879378154761986193512704649145933091555589344057025178640330672968767672801,这是253位素数。因此,我们只能安全地承诺最多只能钻头252位,否则该字段会溢出。我们为Verkle树选择了256个分支因子(宽度),这意味着每个承诺都可以承诺每个承诺每个256位252位的值(或确切,整数为止, p -1)。我们将其写为 提交(v₀,v₁,…,v₂₅₅) 致力于列表 v 长度256。
verkle树的布局
Verkle Tree EIP的设计目标之一是访问相邻位置(例如存储几乎相同地址或相邻代码块)便宜。为了做到这一点,关键包括 干 31个字节和一个 后缀 一个字节,总计32个字节。设计关键方案是为了使“关闭”存储位置映射到相同的茎和不同的后缀。有关详细信息,请查看 EIP草案。
然后,Verkle树本身由两种类型的节点组成:
- 扩展节点,代表具有相同茎但后缀不同的256个值
- 内部节点,最多有256个孩子,可以是其他内部节点或延伸节点。
对扩展节点的承诺是对4个元素向量的承诺。其余职位为0。它是:
c₁和c₂是对所有词干等值的所有值的另外两项承诺 干。我们需要两个承诺的原因是值具有32个字节,但是我们只能存储每个字段元素252位。因此,单个承诺不足以存储256个值。因此,C₁将后缀0至127的值存储,而C₂存储128至255,其中将值分为两个,以适合场大小(我们稍后再进行。)。
扩展和承诺C₁和C₂被称为“扩展和搭配树”(简称EAS)。
图1 在Verkle树上行走的代表钥匙 0xfe0002abcd..ff04:该路径通过3个内部节点,每个节点有256个儿童(254、0、2),一个延伸节点代表 abcd..ff 以及两个后缀树的承诺,包括 04,v₄。注意 干 实际上是键的第一个31个字节,包括通过内部节点的路径。
对值叶节点的承诺
每个扩展和后缀树节点包含256个值。由于一个值为256位宽,我们只能将252位安全地存储在一个字段元素中,因此,如果我们只是尝试过,将丢失四个位,因此将一个值存储在一个字段元素中。
为了解决这个问题,我们选择将256个值的组分为两组,每个组为128个值。组中的每个32字节值分为两个16字节值。因此,值vᵢ∈𝔹₃₂将其变成v⁽ˡᵒʷᵉʳ⁾ᵢ∈𝔹₁₆和v⁽ᵘᵖᵖᵉʳ⁾ᵢ∈𝔹₁₆,因此v⁽ˡᵒʷᵉʳ⁾ᵢ++v⁽ᵘᵖᵖᵉʳ⁾ᵢ=vᵢ。
添加了一个“叶标记”,以区分从未访问过的叶子和被0s覆盖的叶子。 从verkle树删除了任何价值。这是即将到来的州到期计划所需的。该标记设置为第129位,即如果访问了vᵢvᵢ=V⁽ˡᵒʷᵉʳ⁾ᵢ=V⁽ˡᵒʷᵉʳ⁾ᵢ=V⁽ˡᵒʷᵉʳ⁾ᵢ +2¹2,并且如果从未访问过Vᵢ,则V⁽ˡᵒʷᵉʳ⁽ˡᵒʷᵉʳ= 0。
然后将两项承诺C₁和C₂定义为
扩展节点的承诺
对扩展节点的承诺由“扩展标记”组成,即数字1,两个子树承诺C₁和C₂,以及 干 导致该扩展节点的密钥。
与Merkle-Patricia树中的扩展节点不同,该节点仅包含将母体内部节点桥接到子内部节点的钥匙部分,词干覆盖了整个键。这是因为Verkle树设计了无状态的证据:如果将新键插入“将”扩展为两部分,则不必更新较旧的兄弟姐妹,从而可以提供较小的证明。
内部节点的承诺
内部节点具有其承诺的更简单的计算方法:节点被视为256个值的向量,这是其256个子树中每个词根的(字段表示)。对空子树的承诺是0。如果子树不是空的,那么内部节点的承诺为
cᵢ是内部节点的孩子,如果孩子为空的,则为0。
插入树上
图2是将新值插入树的过程的例证,当茎在几个初始字节上碰撞时,这会变得有趣。
图2 值v₁₉₂在位置插入 0000010000 … 0000 在位于位置的Verkle树中 0000000000 … 0000。由于茎在第三个字节上有所不同,因此添加了两个内部节点直至不同的字节。然后插入另一个“延伸和搭配”树,带有完整的31字节茎。初始节点未触及,并且C²₀具有与插入之前C⁰₀相同的值。
较浅的树木,较小的证明
Verkle树结构使树木较浅,从而减少了存储的数据量。然而,它的真正力量源于证明较小的证据的能力,即证人。这将在下一篇文章中进行解释。