http://www.yzthzm.com

光绪之中华再起以太坊1.x:解析无状态客户端 金色财经

本文中我们将进一步详细阐释无状态客户端,无状态(stateless)是Eth 1.x研究的新方向,因此我们将进行一次相对深入的探析,以便对未来可能面临的挑战和可能性了然于胸。如果读者有兴趣进一步了解,我会尽量提供相关资源的链接。


光绪之中华再起以太坊1.x:解析无状态客户端 金色财经

什么是“状态”?

要解释无状态以太坊,我们首先需要理解“状态”(state)的概念。当我们提到“状态”时,一般是指“事务的状态”。

以太坊的完整“状态”描述了所有账户和余额的当前状态,以及在EVM中部署和运行的所有智能合约的集体历史。链上每个最终确定的区块,都有且只有一个状态,这是由网络中的所有参与者共同确认的。每当有新的区块被添加到链上,状态都会随之改变且更新。

在Eth 1.x研究语境中,我们不仅要知道状态是什么,还要知道它在协议(据黄皮书中的定义)和大多数客户端实现(如geth、parity、trinity、besu等)中是如何表现的。


光绪之中华再起以太坊1.x:解析无状态客户端 金色财经

什么是Trie?

以太坊所使用的数据结构叫作Merkle Patricia Trie。有趣的是,‘Trie’最初截取自‘retrieval’一词,但大多数人会将其发音为‘try’,以区别于‘tree’。回到正题,关于MPT数据结构,我们需要了解:

在trie的一端,是描述状态(值节点)的所有特定数据片段。数据可以是特定帐户的余额,也可以是存储在智能合约中的变量(例如某种ERC-20通证的总供应量)。Trie的中间则是分支节点,通过哈希运算将所有值串联在一起。分支节点是包含其子节点哈希的数组(array),每个分支节点随后再次经过哈希并归入其父节点的数组中。这一连串的哈希最终会到达trie另一端的一个状态根节点。


光绪之中华再起以太坊1.x:解析无状态客户端 金色财经

图源 blog.ethereum.org

在上面的简化图示中,我们可以看到一些数值,以及得到这些值的路径。例如,为了得到V-2,我们经历了1,3,3,4的路径。同理,V-3可通过路径3,2,3,3来获取。需要注意的是,本例中的路径长度始终为4个字符,并且要获取某个值只有一条可用路径。

该结构具有确定性和可加密验证的重要特性:生成状态根的唯一方法就是通过计算状态的每个单独数据段,如此一来,通过比对根哈希和前序哈希(Merkle证明),就可以轻松证明两个状态是相同的。反之,我们也不能用相同的根哈希创建两个不同的状态,任何使用不同值修改状态的尝试都将导致不同的状态根哈希。

以太坊通过引入新节点类型,扩展节点(extension nodes)和叶节点(leaf nodes)来提升效率,优化trie结构。通过将路径的一些部分编码为节点,如此一来trie就会更加紧凑。


光绪之中华再起以太坊1.x:解析无状态客户端 金色财经

图源 blog.ethereum.org

在这种优化后的MPT结构中,每个节点都需要在多个后续节点共享的路径压缩部分或值(若有必要,由路径的其他部分前缀)之间进行选择。其实是相同的数据和组织,但是这个trie结构只需要9个节点而非18个节点。看起来似乎更有效率,但事后看来,实际上这并不是最理想的。我们将在下一节讨论原因。

要获取状态的特定部分(例如账户当前的ETH余额),需要从状态根开始,沿着trie的路径从一个节点到另一个节点,直到达到所需的值。在每个节点上,路径中的字符用来决定下一个目的节点,就像是一个用于导航哈希数据结构的探测棒。

而在以太坊真正使用的版本中,路径是长度为64个字符(256位)的地址哈希,值是RLP编码数据[1]。分支节点是包含17个元素的数组(其中有16个是每个可能的十六进制字符,剩余一个则为值),而叶节点和扩展节点包含2个元素(一个是部分路径,另一个是下一个子节点的值或哈希)。要了解更多细节,可以浏览以太坊的wiki页面[2],或者,如果你喜欢亲自钻研,那么这篇文章提供了一个很棒的Python DIY trie练习[3](不幸的是这篇文章已经过时了)。


光绪之中华再起以太坊1.x:解析无状态客户端 金色财经

在数据库中使用Trie

读到这里我们应该提醒自己,trie结构只是一个抽象的概念。这是一种将以太坊状态的整体打包成统一结构的方法。该结构需要在客户端的代码中实现,并存储在磁盘上(或者分布在全球的数千个磁盘中)。这意味着要采用多维trie结构并将其嵌入到一个普通的只理解[key,value]对的数据库中。

在大多数以太坊客户端(turbo-geth除外)中,MPT是通过为每个节点创建不同的[key, value]对来实现的,其中value是节点本身,key是该节点的哈希。


光绪之中华再起以太坊1.x:解析无状态客户端 金色财经

图源 blog.ethereum.org

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。