NXTER.ORG

阿朵 vs 竞争,Pt.8:以太坊(区块链膨胀)

本文是将阿朵与具有类似功能或目标的其他区块链项目进行比较的系列文章的一部分。你可以在这里找到以前的帖子:

这篇文章是阿朵和以太坊之间的比较的续集。这一次,我探索了两个平台如何解决区块链膨胀的问题。令我惊讶的是,这两个平台在这方面比我最初想象的更为相似,不过当然也有显着的差异。

这个比较的关键是了解以太坊区块链是如何组织的。

以太坊的结构

像Nxt一样,以太坊跟踪每个新块的所有帐户的当前状态。和比特币一样,以太坊将每个区块的信息组织成一个Merkle树(实际上是其中的三个),并把它的根哈希存储在区块的头部。

这个工作到底如何?本文中的图表有助于说明。

 

Merkle树的叶节点(即底部的那些节点)代表存储在其中的所有实际数据。树叶上方的每个节点都存储两个孩子的加密哈希。(请注意,我在这里使用“节点”来引用树中的项目,而不是网络中的计算机。网络上的每台计算机都存储整个树。)

这个设计的特点是,即使单个叶节点只有一个字节的变化,其父节点的哈希值也随着变化,一直到最高节点的哈希值都跟随变化,称为“Merkle root”。从某种意义上说,Merkle根包含叶节点中所有信息的摘要。

简单地将所有的叶子节点分组在一起,并将它们同时进行哈希,就会产生类似的结果,但是树结构有第二个很好的属性,这就是说有可能证明叶子在树中而没有看到整个树。例如,在该图中,可以证明绿色交易已经被包括在其中,它的兄弟姐妹为黄色的,灰色的为父母,以及沿着路径回到根部的其他兄弟姐妹和父母。另一个用户可以计算树中每个级别的相关哈希值,然后将生成的Merkle根与存储在区块链中的值进行比较。这些“Merkle证明”是比特币简化付款验证(SPV)客户的基础,也是以太坊的几个扩展建议。

以太坊使用三个独立的Merkle树来记录每个块中的数据:一个用于块的交易; 第二个是这些交易的一组“收据”,代表每个交易的效果; 第三个用于记录所有帐户的即时状态,包括余额和相关数据。用每个块存储系统的整个状态听起来非常浪费,但是由于每个块只修改叶节点的非常小的子集,所以状态树的大部分分支不会每个块改变,并且每个新的状态树可以参考前一个的整个分支以最小的开销。这种方法存在一些技术上的复杂性,因此以太坊实际上使用一种稍微不同的数据结构,称为Merkle-Patricia树,但概念是相同的。

以太坊的快速同步节点

所有这一切中最重要的事实是,加密哈希函数的属性确保了用相同的根构造两棵不同的树实际上是不可能的。其结果是,存储在以太坊的区块头部的Merkle根的纪录足以设置网络时间验证相应的交易和交易状态。

换句话说,即使一个节点已经“忘记”了旧区块的内容,只要它保存了(更小)的区块头的存储,它就可以查询一个完整节点的给定块的内容,并验证自己全节点没有篡改任何数据。它只需重新计算相关的Merkle根,并与区块头中的对应值进行比较即可。(请注意,在这里和本文的其余部分,我已经切换回使用“节点”来引用网络上的对等体,而不是Merkle树中的项目。)

这个方法正是Go Ethereum(geth)钱包的快速同步选项的工作原理。为了执行快速同步,一个新节点首先下载并验证所有块头,从开始块开始(实际上,只有每隔100个块头必须被验证,详情参见GitHub链接)。由于区块头包含了工作证明,这一步足以表明网络在区块挖矿时网络对每个区块头部中的Merkle根达成了一致。

在最近的某个时候,比如说1024个块之前,节点从对等端获得完整版本的状态树,并根据相应区块头中的Merkle根进行验证。从这一点开始,节点从对等体下载完整的块并重放所有的交易,直到它到达最近的块为止,此时它就变成普通的完整节点。

虽然Go Ethereum目前不支持它,但随着时间的推移,节点也可能会不断修剪状态树,从而使必须存储的状态数据量保持最小。

阿朵子链修剪

如果你已经研究过Ardor的父子链架构,这个策略希望听起来很熟悉。Ardor在其子链方面采取了非常类似的方法。

简而言之,Ardor平台包含一个单一的股权证明父链,也称为Ardor,以及一组子链。父链只支持很少的交易类型,基本上只支持转移ARDR和锻造它们所需的交易类型。反过来,子链使用本系列前一篇文章中介绍的智能交易来处理在平台上进行的所有实际业务。

只有父链(ARDR)可以用来锻造。仅涉及子链硬币的交易不会影响锻造硬币的余额,所以它们对区块链的安全性不重要,也不需要永久保存。每个子链上的特殊“bundler”节点收集这些交易,将它们组合在一起,对它们进行哈希,并使用称为ChildChainBlock的特殊交易类型将哈希报告给网络。它们包括完整的交易数据以及每个ChildChainBlock交易,因此锻造者和其他节点可以验证子链交易是有效的并且确实产生报告的散列,但交易数据本身不存储在区块链中,并且在指定的时间通过它可以被删除。所有保留在父区块链中的是这些数据的哈希。

可选地,每个子链上的特殊存档节点可以存储该子链的事务的完整历史记录。在需要这个历史记录的情况下,节点可以检索它,哈希原始的交易包,并验证哈希与区块链上记录的哈希匹配。

希望,与geth的快速同步选项的比较在这一点上是清楚的:在这两种情况下,节点不需要存储绝大多数交易数据,以便验证网络在完成这些交易时是否批准了这些交易。在以太坊,它足以验证块头部的工作证明和任何给定的Merkle根的准确性,从而能够信任相应的状态树。Ardor稍微复杂一些,因为它使用了股权证明,但是将完整的ARDR交易记录与ChildChainBlock交易一起存储,可以确保节点可以从创世块开始验证每个块是否由合格的锻造者锻造。

比较两种设计

在这一点上,我希望你们同意我的看法,我们可以把以太坊和阿朵的以下几点相提并论:

  • 以太坊完整节点类似于Ardor节点,它也存储每个子链的完整历史记录。
  • 一个连续修剪状态树的以太坊快速同步节点类似于一个普通的Ardor节点,该节点存储完整的父链,但会删除所有的子链数据。
  • Ardor提供了运行存储整个父区块链的节点以及单个子链的存档交易数据的功能。这个功能目前在以太坊没有相应的功能。

当然,这些类比并不完美。具体来说,值得注意的是以太坊的区块头比Ardor上的完整的父链块要小得多。我还对Ardor用于跟踪系统的完整状态的快照和在父链中存储这些快照的哈希的机制进行了注释。

不过,我认为这个比较是有帮助的。这个列表中的第三项特别有趣,因为它似乎是两个设计之间最大的质的区别。在Ardor上,将每个子链的交易历史存储在一个单独的存档节点集中的功能允许对区块链数据库进行垂直分区。由于每个子链可能支持不同的业务或项目,因此按照子链定义的界限划分所有交易的总集似乎是一个自然的选择。在以太坊,或许最好的比喻是一个设计,用户可以像Golem一样为单个项目运行一个完整的节点,而不必同时为Augur和BAT以及其他数百个项目运行完整的节点。

在这一点上,让我觉得以太坊的Merkle树可能会很自然地适应这样的设计,“Golem完整节点”将搜索整个区块链的所有涉及GNT的交易,永久存储这些交易和状态转换的Merkle证据,并丢弃其余的数据。我承认我没有考虑过这个想法的含义,所以我不会在这里说更多。

无论如何,对于以太坊和Ardor的父子链架构,这一假设策略都不是区块链的真正区分,因为在这两种情况下,每个节点仍然必须处理来自整个网络的所有交易。这些设计划分了存储空间,但不是运行区块链所需的带宽或计算能力。一个适当的扩展战略必须解决所有三个瓶颈。

再说说分区…

分区

以太坊在链上扩展方面的长期愿景是分区:一种划分数据存储和处理交易的方法。目标是网络上的大多数节点必须仅从一个分区处理交易,将它们从验证和存储交易的负担中解放出来,而这些交易只会影响其他分区。

我甚至不会试图在这里研究以太坊团队的建议,因为这篇文章已经越来越长,但是如果你对这个话题感兴趣的话,我强烈推荐他们在GitHub上提供他们非常棒的sharding FAQ

但是,我提出分区的原因是,Ardor的开发人员建议他们正在探索如何将子链交易处理推向Ardor网络的专用子网。他们还没有提供技术细节,我不会在这里猜测它是如何工作的,但对我来说,这个想法肯定似乎是合理的。

如果开发者可以在这个想法实现,那阿朵平台看起来会很多像的以太坊团队的文档中描述的“分区区块链的基本设计”。本文的这一部分描述了一组“收集器”(bundler)节点,负责收集(绑定)来自单个分区(子链)的交易,验证它们,并将其哈希记录在主(父)区块链“collation header”(ChildChainBlock事务)中。“超级完整节点”(当前父链节点)将处理来自所有分区的所有交易; “顶级节点”(未来的父链节点)将只处理主链区块,而不是排序全部的内容; 和“单一分分区节点”(未来子链节点)将处理主链和单个分区上的所有交易。

几乎所有的复杂问题都来自于跨区通信,因此,当分区在很大程度上独立时,这种设计就能发挥最大的作用。正如我上面提到的,Ardor的子链自然可以实现这种分类,每个子链都支持一个单独的项目,项目之间的互动是允许的,但是比项目内的交易更少见。

结论

在这个早期阶段,这些想法当然是相当暂时的。尽管如此,这种可能性还是令人兴奋的。Ardor的设计已经包含了股权证明,以太坊团队为自己设定了一个单独的目标,并合理地划分了区块链的数据,这是任何分区解决方案的明显要求。在Ardor中值得注意的是Merkle证明,或者其他一些紧凑的方式,可以让分区之间相互信任地互相传递状态信息,但是看起来好像这些功能可以通过硬分叉构建到平台中。毕竟,协议中已经存在快照哈希和子链区块哈希,它将成为Merkle根。

但我们能对这两个项目的现状说些什么呢?也许我在研究和写这篇文章时学到的最有趣的事实是,以太坊实际上比我原先想象的要好得多。Go Ethereum的“快速同步”选项可以提供一些与Ardor的设计相同的优点,如果它最终结合了状态树修剪,类比将更接近。

另一方面,以太坊当前设计的主要缺点是网络上某处仍然必须有完整的节点,这些节点必须存储300+ GB以太坊区块链。随着它继续增长,运行一个完整的节点的成本随之增长,人们可以预期,相对于快速同步和轻节点的完整节点的比例自然会下降。结果,每个完整节点可能最终将处理来自其他节点的增加的请求量,进一步增加运行全节点的成本(在带宽和计算能力方面)。

即使没有分区,Ardor的设计也可以通过将以太坊单一的完整节点分成多组存档节点来缓解这个潜在的问题,这些存档节点只存储一个子链的当前状态。如果需要的话,可以同时存储多个子链的历史,但是几乎没有节点,或者根本没有节点,将被要求存储整个系统的完整历史。

不用说,扩展区块链是一个难题。在我为这个系列调查的几个项目中,Ardor和以太坊似乎提供了最引人注目的链式扩展的愿景。虽然我希望双方都能取得成功,但我必须承认,从每个项目已经实现其愿景已经取得的具体进展来看,阿朵在我看来似乎有一个微不足道的先机。

作者:Segfaultsteve

 翻译:fz1128

View this in: English Español

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.