以太坊的状态数据于是以不受限制地快速增长,长此以往,将只有少数大型公司才能开销运营节点的成本。不应 Alexey 的拒绝,本文叙述了我对 turboproof 证明系统的解读,该技术未来有可能会应用于在多种重客户端上。以太坊区块链的状态数据用于十六叉(hexary)帕特里夏树根(patricia tree)(或全称 trie)来存储的。数据存储有两个层次:1. 地址树根就是指地址到账户数据的同构。
2. 智能合约的数据也存储在一棵数据树中,该树根就是由从 32 字节内存地址到 32 字节的值的同构包含的。这些默克尔树根存储(键,值)对。请注意,键的基本单位是半字节(4 个 bit),而不是一个字节。
这些默克尔树根具备 3 种类型的节点:· 叶子节点:这些是(键后缀,值)对,它们一直是默克尔树根的终端节点。· 分支节点:内部节点,并且此节点及其所有子节点分享完全相同的后缀。每个分支节点有 17 个条目。
前 16 个条目对应于子节点的键后缀的第一个半字节。如果不存在,则第 17 个条目是与键后缀关联的值· 拓展节点:“捷径节点”,让所有子节点分享一个公共后缀。
有了拓展节点,就会辟出有很多只有一个叶子的分支节点了。荐个例子,以下的树有一组叶子节点,分支节点以及拓展节点:-图1. 一个 Trie 编码以下键值对:(0x1234,0x0000),(0x1111,0x1111),(0x4567,0x2222)和(0x4569,0x3333)。
在此示例中,键和值已延长为 2 个字节,以提升可读性。标签为 0 到 15 的行回应分支节点,伸延出来的箭头所指的半字节是其子节点的后缀。第 17 个条目(索引 16)并未用于,因此并未表明。[5,6] 的那一行是拓展节点,这意味著其子节点必需以这两个半字节为后缀。
终端节点是叶子,左边的两个具备后缀(为的是记录键),右边的两个不必须后缀,因为根据指向它的路径就能获得原始的键。-在实际应用于中,这个模型是以太坊很多效率问题的根源,但是它也被证明有很强的韧性。
序列化值一些用例必须在用户之间传送(键,值)元组。例如,为了节省空间,轻型客户端仅有存储各默克尔树根的六根。因此,为了与状态展开交互,用户必须告诉他重客户端自己的状态是什么样的,以便重客户端可以继续执行操作者并计算出来新的状态根。
为传输数据,该建构必需需要将多个账户的状态变化包成单个证明。在前面的示例的基础上,这是树中同时不存在(0x1234,0x0000)和(0x4567,0x2222)的证明:-图2. 证明图1中的树包括(0x1234,0x0000)和(0x4567,0x2222)。除了这两个值以外的子树所存储的值都用原值适当哈希值替代。(在本图中,这两个子树都是非常简单的叶子节点)。
-(依照默克尔树根的计算出来规则)只要在该证明中获取的哈希值就是原值的哈希值,那么根据图 2 中的信息计算出来出有的树根哈希值将与图 1 中的树根哈希值完全一致。问题是如何序列化数据:等价一个哈希表格列表和(键,值)对列表,人们如何找到树根的结构?例如,仅有得出以下输出:· (0x1234,0x0000)和(0x4567,0x2222)的(键,值)对(键和数值长度被延长以使分解的图片极具可读性)· 回应子树的哈希值。
人们有可能修复出有下面这棵树:也有可能辟出有下面这样的数据树根:因此,我们必须编码结构信息的方法。TurboproofAlexey Akhunov 的议案仍在制订中,而我这篇独立国家的文章也想要略尽绵薄,为定义整个概念做到点工作。这里讲解的解决方案与我和 Sina Mahmoodi 合作的 rust 构建比较不应。
Turboproof 分成三个部分:1. 叶子节点的表格2. 哈希值的列表,与树根的完整分支一一对应3.“结构信息”,即仅用于获取的哈希和叶子如何修复树根的指令列表。为能修复出有准确的数据树根,最后一部分被编码为供堆栈器继续执行的一系列指令:· LEAF 回应应向证明的叶子序列中弹出有一个叶子节点;· BRANCH(i)规定必须创立一个新的分支节点,并且之前结构的节点不应存储为新的分支节点的第 i 个子节点。
然后将新的节点存储在堆栈中;· ADD(i)规定,不应将堆栈顶部的节点设置为堆栈上坐落于其下方的分支节点的第 i 个子节点;· EXTENSION(ext)规定不应将堆栈顶部的节点设置为拓展节点(在 geth 中又称 shortNode)的子节点,整个子树的后缀由半字节 ext 的序列回应;· HASH 是回应子树哈希值的节点。
本文来源:半岛平台官网-www.hptonerdeal.com