本文摘要:本文所用的数据和脚本都放到这个 github 代码库中:https://github.com/mandrigin/ethereum-mainnet-bin-tries-data什么是 “无状态以太坊”?
本文所用的数据和脚本都放到这个 github 代码库中:https://github.com/mandrigin/ethereum-mainnet-bin-tries-data什么是 “无状态以太坊”?如果您早已理解什么是 “无状态以太坊” 以及 “区块亲眼数据”,可以跳过这一段。为继续执行交易及检验区块,以太坊网络的节点必须理解整条区块链的当前状态 —— 也就是所有账户和合约的余额和存储数据。
这些数据一般来说是存储在 DB(数据库文件)里面的,在必须用作检验时才不会读取到一棵默克尔树中。无状态以太坊客户端的工作思路则略为有区别。顾名思义,无状态客户端就是不用于硬盘 DB 来继续执行区块(虽然客户端中有可能也保持着原始的状态)。
忽略,无状态客户端依赖 “区块亲眼数据(block witness)” —— 就是一段类似的数据,它不会跟适当的区块一起传播;享有了这段数据,客户端就可以修复出有一个(代表部分状态的)默克尔子树,该分支脚可用作继续执行该区块中的所有交易。你可以在这篇文章中写关于无状态客户端的更加了解的叙述:https://blog.ethereum.org/2019/12/30/eth1x-files-state-of-stateless-ethereum/当然咯,必须传播区块亲眼数据就意味著无状态客户端的网络拒绝要比普通节点更高。现在人们早已明确提出了很多减少亲眼数据规模的思路:用于 有效性/计算出来完整性 证明(还包括但不仅限于零科学知识证明)、重新加入更好的传输手段,等等。
其中一种办法是将以太坊的默克尔树根(即用来回应以太坊的默克尔树根)从十六进制改以二进制。这就是本文想探究的问题。为什么要用于二进制树根默克尔树根的众多优良特性是,检验树根值(就是一个哈希值)准确与否并不拒绝你具备整棵树所有的数据。
只需把所有省略的非空路径替代为适当的哈希值就可以可。那么用于十六进制默克尔树根有什么很差呢?设想整棵树都已填充数据(即树上的节点已完全没为零的子节点)。要检验一个区块,我们只必须一小部分默克尔树根节点的数据。那么,我们只需把其他路径的数据替代为哈希值就可以(让这棵子树根显得可以检验)了。
但是,每多重新加入一条哈希值,区块亲眼数据就不会大一些。如果我们改变为二进制默克尔树根,这个问题就可以获得减轻 —— 因为默克尔树上的每个节点都只有两个子节点,所以最少只有一个字节点必须被更换为哈希值。(换句话来说,我们可以早地开始 “切割成” 默克尔树根的路径,因为我们的粒度是 1 比特,而不是十六进制下的 4 比特。
)这样做到或许能大幅度减少亲眼数据的规模。我们再行举例说明一下。假设继续执行某个区块只不会影响一个账户:3B 路径下的 Acc1(二进制为 0011 1011)。
整棵树是全满的(树上的节点没为零的子节点)。-二进制状态树根与十六进制状态树根的较为-如果说二进制状态树根看上去有点可怕,那只是因为二进制树根我所画仅有了,但没把十六进制树根的所有取而代之哈希值的节点都所画出来。
来数个数:· 为创立出有一棵二进制状态树根,亲眼数据必须包括 8 个哈希值,7 个分支节点和 1 个账户节点。也就是亲眼数据中有 16 个元素。· 为创立出有一棵十六进制状态树根,我们只需 1 个分支节点,1 个账户节点,但必须 30 个哈希值。
也就是有 32 个元素。所以,假设哈希值和分支节点在区块亲眼数据中的所占的空间是一样大的(只不过哈希值所占到的空间要更大一点),网卓新闻网,在我们的例子中,用于二进制树所须要的亲眼数据大小只有十六进制下的一半。
看上去不俗。那么,理论上就是这样。
我们来想到实际情况是如何。我们必要拿以太坊主网的数据来看看吧。
开始实验再行说道最要紧的:我们怎么告诉自己建构出来的区块亲眼数据是简单的呢?测试方法如下:我们用于区块亲眼数据来分解一棵默克尔子树,在这棵树上运营适当区块中的所有交易,然后校验结果否与我们熟知的完全一致。只要交易都能顺利继续执行(Gas 够用,轨迹完全相同(they have the same traces),等等),我们就可以推断这个亲眼是充足充份的。
本文来源:必一运动·(B-Sports)官方网站-www.qdhnzc.com