为了使证明尺寸较小并能快速处理惩罚,仍需要做一些事情,亏得让它们变得越发普及也会有助于我们的事情。
· HASH 是暗示子树哈希值的节点。
(0xcafedeca,0x0202020202020202),
BRANCH(14)
叩谢
一些用例需要在用户之间通报(键,值)元组。譬喻,为了节减空间,轻型客户端仅存储各默克尔树的根。因此,为了与状态举办交互,用户需要汇报轻客户端本身的状态是什么样的,以便轻客户端可以执行操纵并计较新的状态根。为压缩数据,该建构必需可以或许将多个账户的状态变革打包成单个证明。
为能重建出正确的数据树,最后一部门被编码为供仓库器执行的一系列指令:
BRANCH(13)
· EXTENSION(ext)划定应将仓库顶部的节点配置为扩展节点(在 geth 中又称 shortNode)的子节点,整个子树的前缀由半字节 ext 的序列暗示;
用户此刻可以证明他们知道树的当前状态。他们可以将证明发送给中继器或任何想要确保用户知道他们本身状态的人。
LEAF
有了这样的证明方法,用户就可以只存储他们感乐趣的数据,并在他们想与区块链举办交互时证明所有权。这就是所谓的轻客户端。
这些键值对所构成的数据树暗示如下:2. 哈希值的列表,与树的原始分支一一对应
Turboproof 的意义
该措施至此终止,而且仓库的顶部存有树的最终版本。该树与图 6 中的树具有沟通的根哈希,而且很简朴就能验证两个键均存在。
(为清楚起见,键被缩短为 12 个字节,而不是凡是的 32 个字节,而且值配置为 8 个字节,而不是巨细不受限制)
这些默克尔树存储(键,值)对。请留意,键的根基单元是半字节(4 个 bit),而不是一个字节。这些默克尔树具有 3 种范例的节点:
· 叶子节点:这些是(键后缀,值)对,它们始终是默克尔树的终端节点。
因此,我们需要编码布局信息的要领。
以太坊状态数据正在增长。在撰写本文时,状态数据已增长到约占 20 GB(不包罗所有索引和其他须要的成果,如插手还需膨胀 10 倍)。对付手机来说,这个量级已经太大了。想让所有人都能会见网络,就必需担保不那么强大的设备也能会见网络。
问题是如何序列化数据:给定一个哈希表列表和(键,值)对列表,人们如何找出树的布局?譬喻,仅给出以下输入:
HASH
1. 地点树是从地点到账户数据的映射。
也大概建出下面这样的数据树:
想深一步,人们可以构思用这种 “无状态” 的方法来维护主链(这一打算与 Serenity 无关),用户只需生存链上状态中跟本身有关的部门,并在需要时宣布这些信息。这将有助于阻止状态所需空间的一连增长,并使所有人都能利用以太坊。LEAF
(0xdeadbee0,0x0404040404040404),
· BRANCH(i)划定需要建设一个新的分支节点,而且之前结构的节点应存储为新分支节点的第 i 个子节点。然后将新节点存储在仓库中;
举个例子,以下的树有一组叶子节点,分支节点以及扩展节点:
· 扩展节点:“捷径节点”,让所有子节点共享一个民众前缀。有了扩展节点,就不会建出许多只有一个叶子的分支节点了。(依照默克尔树的计较法则)只要在该证明中提供的哈希值就是原值的哈希值,那么按照图 2 中的信息计较出的树根哈希值将与图 1 中的树根哈希值一致。2. 智能合约的数据也存储在一棵数据树中,该树就是由从 32 字节内存地点到 32 字节的值的映射组成的。
以太坊的状态数据利用十六叉(hexary)帕特里夏树(patricia tree)(或简称 trie)来存储的。数据存储有两个条理:
假设整个状态由以下 4 个(键,值)对构成:
我们的证明将是针对两个键 0xcafecafe 和 0xcafedeca 的。不需要用到的两个叶子节点将被转化为哈希值。然后将证明序列化为:
· 哈希也按深度优先顺序举办序列化。只有一个哈希值,代表 0xd* 子树
EXTENSION([0xa, 0xf, 0xe])
· 暗示子树的哈希值。
ADD(14)
一些例子
3.“布局信息”,即仅利用提供的哈希和叶子如何重建立的指令列表。
树
· (0x1234,0x0000)和(0x4567,0x2222)的(键,值)对(键和值长度被缩短以使生成的图片更具可读性)
的状态数据正不受限制地快速增长,长此以往,将只有少数大型公司才气承担运行节点的本钱。应 Alexey 的要求,本文描写了我对 turboproof 证明系统的领略,该技能将来有大概会应用在多种轻客户端上。
在前面的示例的基本上,这是树中同时存在(0x1234,,0x0000)和(0x4567,0x2222)的证明:
Turboproof
人们大概重建出下面这棵树:
· 用于重建立的指令集:
仰赖于 Alexey Akhunov 和 Sina Mahmoodi 的投入和反馈,这篇文章才得以写就。
-图2. 证明图1中的树包括(0x1234,0x0000)和(0x4567,0x2222)。除了这两个值以外的子树所存储的值都用原值相应哈希值替代。(在本图中,这两个子树都是简朴的叶子节点)。 –
重建立
Alexey Akhunov 的提案仍在拟定中,而我这篇独立的文章也想略尽绵薄,为界说整个观念做点事情。这里先容的办理方案与我和 Sina Mahmoodi 相助的 rust 实现相对应。Turboproof 分为三个部门:
· 节点以深度优先的顺序序列化:
让我们跟从这个措施。
-图1. 一个 Trie 编码以下键值对:(0x1234,0x0000),(0x1111,0x1111),(0x4567,0x2222)和(0x4569,0x3333)。在此示例中,键和值已缩短为 2 个字节,以提高可读性。标签为 0 到 15 的行暗示分支节点,延伸出来的箭头所指的半字节是其子节点的前缀。第 17 个条目(索引 16)未利用,因此未显示。 [5,6] 的那一行是扩展节点,这意味着其子节点必需以这两个半字节为前缀。终端节点是叶子,左边的两个具有前缀(为的是记录键),右边的两个不需要前缀,因为按照指向它的路径就能获得完整的键。-
· LEAF 暗示应从证明的叶子序列中弹出一个叶子节点;
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。