这是meduim上一篇关于以太坊扩容技术的高质量文章,个人感觉说的非常清晰,因此翻译过来分享。
今年(2018)是以太坊基础设施建设之年,早期采用部分将测试网络的极限,重点关注以太坊扩展技术。以太坊还处于婴幼儿时代,既不足够安全也不具备扩展性。任何与该技术紧密联系的人都清楚这一点。然而去年ICO的炒作夸大了以太坊的能力。以太坊和web3技术承诺的一个安全易用的、受一套共同经济协议约束的去中心化网络才刚刚出现在地平线上,而且只有基础设施建设好了之后才能实现这一承诺。
构建基础设施和扩展以太坊能力的项目一般称之为以太坊扩容解决方案。它们有许多不同的形式,而且常常互相兼容或互补。本文将深入一类扩容方案:链下扩容或者说第二层扩容:
首先,我们将在一般意义上讨论以太坊面临的扩容挑战。
然后,我们将简单讨论以太扩容挑战的两种路径:链上扩容和链下扩容。
最后,我们将研究各种二层扩容技术,包括状态通道、plamsa、Truebit等。
本文重点在于让读者对以太坊二层扩容方案有一个全面而详细的了解,但不会深入到代码或具体实现。相反,我们将聚集于理解这些系统的经济学机制及所有二层扩容方案后面的共同洞见。
1.区块链公链的扩容挑战
首先,扩容不是一个单一的具体问题,它涉及一系列必须克服的挑战,以使以太坊能够为全球数十亿人的用户所用。最常讨论的挑战是如何提高网络的交易吞吐量。以太坊现在每秒只能处理15笔交易,而Visa卡的处理速度已经达到了45000tps。去年,一些应用——如“Cryptokitties"和临时的ICO——由于过于火爆导致整个网络拥堵和gas价格大幅上涨。
核心的限制在于,以太坊的每一笔交易需要网络中所有节点处理。以太网中发生的每一步操作——支付,Cryptokitty出生,部署新的ERC20合约——需要网络中每一个节点平行执行。这样的设计是为了保证区块链的权威性,网络中的节点不需要依靠其他人告诉他网络的现状,它们自己来搞清楚。这对以太坊交易容量的造成了致命的限制:整个网络的速度不会高于其中单点的速度。
我们可以要求网络中每个节点做更多的工作。如果我们翻倍区块的大小,即可要求网络中节点做双倍的工作。但这会导致去中心化特性的损失,因为这样对节点计算机的要求提高了,导致部分不同计算机不能参与到网络中来,使得挖矿集中到拥有巨大算力的矿工手中。为了避免中心化,区块链扩容方案应该避免增加单个节点的工作负担。
从概念上来说,我们可以采用两种方法来解决这个问题:
I、如果每个节点不需要平行处理所有操作如何?
第一种方法需要打破区块链前提:区块链中每个节点需要 处理所有操作。如果网络分为两部分,各自相对独立运行如何?A部分处理一批交易,B部分处理另一部分交易,整个网络的交易处理吞吐量相应增加了一倍,因为所有的交易现在同时由两个节点来处理。如果我们能够将区块链拆分成更多部分,那么区块链的交易处理容量将相应地增加许多倍。
这种扩容方技术叫”分片“,是Vitalik的以太坊研究团队提出的扩容解决方案。一个区块链分割成不同部分称之为分片,每个分片能够独立地处理交易。”分片“一般被认为是第一层扩容方案,因为它在以太坊基础协议本身上实现扩容。如果你想对”分片"技术更加了解,我建议你阅读这份FAQ和相关的博客文章。
II、如果我们把更多的操作挪到以太坊网络之外执行如何?
第二种扩容方案采用相反的方法:与以太坊链上扩容不同,我们直接在链下使用我们已经自己拥有的计算能力如何?以太坊链上基础层吞吐量不变,但实际上我们能够做更多的操作,包括交易、游戏状态更新或者简单计算?这第二种扩容方案背后的思想是链下扩容技术,包括状态通道、PLASMA和TRUEBIT。尽管他们解决的问题不尽相同,但他们都是通过链下操作而非链上来实现功能,同时保证足够级别的安全和完整性。
它们也被称之为第二层扩容方案,因为它们是建立在以太坊主链之上的。它们不需要更改以太坊基础协议,相反,它们是以简单的智能合约存在于以太坊上的,并与链下软件交互。
2、第二层扩容方案——加密经济解决方案
在深入第二层扩容方案之前,理解隐藏在后面使之可行的思想是极为必要的。公链最重要的力量在于加密经济共识。通过谨慎制定的激励措施及软件与加密技术的保护,我们得以建立一个计算机网络,借此就系统内部状态达成一致。这是中本聪白皮书中关键的思想,许多不同的公链设计包括比特币和以太坊的设计都应用了这一思想。加密经济共识给我们带来了确定性核心硬核——除非有像51%攻击这样的极端事件发生,我们知道区块链的如支付、智能合约等操作将按照写好的指令执行。
第二层扩容方案的思想是,我们可以以固定的方式锚定这个确定性核心硬核,并在此锚定上建立一个额外的经济机制。这个第二个经济机制能够扩展公链的应用范围,使得我们能够在链下互动,同时可以在需要的时候可靠地回溯至核心硬核。这些以太坊之上的第二层网络有时候不具备如以太主网操作一样的保证,但它们仍然具备足够的完整和安全保证应用,特别是它们仅仅损失极低的可靠性换取了更快的操作速度和更低的运行成本。
加密经济不是起始于中本聪的白皮书,也不会终结于中本聪白皮书——它是一项需要我们去学习如何应用的技术组合体。不仅是核心协议的设计,也包括拓展基础区块链功能的第二层网络的设计。
I、状态通道
状态通道是一种执行交易或状态更新的链下技术。虽然如此,状态通道中发生的事情依然保持高度的可靠性和完整性:如果存在任何差错,我们仍有回溯至建立在链上交易的确定性硬核的机会。大多数读者应该都熟悉支付通道的思想,这一思想已经提出了好几年了,而且近期已经在比特币的闪电网络实现了。状态通道是支付通道的更一般应用——它不能能应用于支付,还可应用于任何区块链的状态更新,比如智能合约内部变化。状态通道在2015由Jeff Coleman首次提出。
解释状态通道的最好方法是看一个例子。注意这只是一个概念性解释,我们不会涉及具体实现的技术细节。
想像一下,Alice和Bob想玩一个叫tic tac toe的游戏,游戏的赢家将赢得1个Eth。原来,需要在以太坊上布置一个智能合约实现游戏的规则,同时追踪游戏中所有人的动作。每次有人发起操作,他们就发送了一个交易至智能合约。当一个玩家赢得比赛时,智能合约将支付1个Eth给赢家。但是这些操作是非常低效和缓慢的。Alice和Bob处理他们的游戏时占用了整个网络,这实际超出了他们实际所需要资源。他们需要支付每一次操作,且在下一次操作前他需要等待区块被确认。相反,我们可以设计一个尽量少链上操作的系统,让Alice和Bob在这个系统上进行他们的游戏。他们可以在链下更新他们的游戏状态,同时确信他们能够回溯至以太坊主链。这样的系统我们称之为状态通道。
首先,我们在以太坊上建立一个能够理解游戏规则的智能合约,这个智能合约能够识别出游戏中的玩家如Alice和Bob。合约持有1Eth。
然后,Alice和Bob开始游戏。Alice创建并签署一个描述他的第一个动作的交易,然后发送个Bob,Bob再签署并发还他签署版本的交易,并为为自己保存一份备份。然后Bob创建签署一个描述她的第一次操作的交易并发送给Alice,Alice在签署发送回去,并保留一份备份。每一次他们都保存他们在游戏中的状态。每个交易中都包含有一个随机数,这个随机数仅用于我们识别动作的发生次序。
目前为止,一切都是在链下发生。Alice和Bob只是在内部网发送交易,尚未有任何东西上传至区块链上。但是,所有的交易都可以发送至仲裁智能合约,至它们是有效的以太网交易。你可以把这理解为两个人互相签署了一系列来来回回的区块链验证支票。没有钱从银行提取或储备,但每个人都有一叠可以随时支取的支票。当Alice和Bob完成了他们的游戏,比如Alice赢得了比赛,他们可以关闭通道并上传最后的状态至仲裁智能合约,只需要支付一笔交易费用。仲裁合约确认最终状态得到双发的认可,并经过一段时间间隔确保没有人能够合法地质疑结果后,将1eth奖励个Alice。
为什么仲裁合约需要等待一段质疑期呢?
想像一下,如果Bob没有发送真实的状态,而是发送一个表明他赢得比赛的更早版本的状态。仲裁合约只是一个哑巴合约,它不知道他接受的是否是最新的状态。质疑期给了Alice证明Bob对游戏最终状态说谎的机会。如果有一个更新的状态,她会保留有签名交易的副本,她可以提交个仲裁合约。通过确定随机数,仲裁合约可以宣布Alice提交的版本是最新的,而Bob欺骗测企图被驳斥了。
特点及限制
状态通道对很多应用都很有用,相比链上操作它会带来绝对的改进。但是,在决定该应用是否适用于通道化时,记住该项技术做了一些技术上的妥协是很重要的:
. 状态通道依赖于网络的可用性。如果Alice在质疑期间网络断线了(可能是Bob不顾一切的想赢得比赛,破坏她家的网络连接),他将不能在质疑期间回应。当然,Alice可以委托别人保存她的状态副本,并代表她的利益保证副本在质疑期的可用性。
. 当参与者在长时间内频繁更改他们的状态时,这项技术尤其有用。因为部署合约发起通道存在初始成本,如果一旦部署,通道内的单个状态更新成本是非常低的。
. 状态通道最好应用于那些参与者已知的应用。这是因为仲裁合约总需要识别出参与者是否属于该通道。我们可以添加或移除参与者,不过这都需要更新合约。
. 状态通道具有很强的保护隐私特性,因为每件事都发生在通道内部,而不是公开广播并保存在链上。只有打开和关闭交易需要公开。
. 状态通道具有即时完成的能力,这意味着参与双方只要签署了一项状态更新就可以考虑结束。如果需要,双方都可以得到他们可以在链上得到加强的保证。
在L4,我们建立了counterfactual:一个通用以太网络状态通道框架。模块化实现使得开发者不需要成为状态通道专家即可在他们的应用中使用状态通道。你可以在这里对这个项目了解更多。我们将在2018年第一季度发布一篇文章来描述我们的技术。
雷电网络是另一个著名的状态通道项目,该项目主要聚焦在建立支付通道,使用类似闪电网络的哲学。这意味着相比于你想交易的人开一条通道,你更可能与一个连接更大网络的实体打开一条单独通道,使得你可以与任何与这个实体连接的其他人进行免费支付。
除了Counterfactual和Raiden,以太网络上还有其他几种特定应用的通道技术实现。比如,Funfair为去中心化的赌博游戏建立了一个状态通道,Spankchain为成人表演者建立了一次性支付通道(他们为自己的ICO也建立了一个状态通道),HorizonGames在他们的第一个以太坊游戏建立了一个状态通道。
II、Plasma
2017年八月11号,Vitalik和Joseph发布了《Plasma:自动化智能合约》白皮书。这篇白皮书介绍了一种能够使得以太坊达到更大交易吞吐量的新技术。
与状态通道一样,Plasma是一种依靠以太坊保证安全性的链下扩容技术。但Plasma的思路不同,它通过链接到以太坊的子链实现扩容。这些子链又可以向下衍生出自己的子链,依次类推。因此,我们可以在子链上运行复杂的操作,运行几千用户的完整应用,而至保持与主链的最小交互。由于操作不需要复制到整个以太坊,Plasma子链能够运行更快,收费更低。
为了能过理解Plasma,我们举一个例子说明它如何工作。
想像一下你在以太坊创建了一个卡片游戏。这些卡片是一种不可伪造的ERC721通证,含有一些特性或属性可以给玩家用来对抗游戏。这种复杂操作在主链上进行是非常昂贵的,所以你决定在你的应用中使用Plasma技术。首先,我们在以太坊主链上创建一个智能合约作为Plasma子链的”根“。这个Plasma跟包含了子链的状态转换规则,记录子链的hash状态,成为用户在子链和以太主链之间转移资产的桥梁。
之后,我们创建子链。子链可以拥有自己的共识算法--在这个例子中,我们说它采用”授权证明“这种依赖诚实区块生产者的简单共识机制。区块生产者就像POW的矿工,它们是完成一些接收交易、形成区块、收集交易费等操作的节点。为了说明简单,这个例子里这只有你自己这一个实体生产区块--你的公司运行了一些节点作为你自己子链的区块生产者。
一旦子链创建并激活,区块生产者定期向根合同提交状态更新。这意味着它们可以有效宣告”我提交子链最近的区块是X“。这些提交记录在链上的根合同中,作为子链活动的证明。现在,子链已经准备好了,我们可以创建我们交易游戏的基础组件了。这些卡片本身是ERC721令牌,初始在以太坊上发行,然后通过Plasma根转移到子链中。这引入了一个关键点:Plasma使得我们扩展了与区块链资产的交互,但这些资产必须先在以太坊上建立。然后,我们在子链上部署实际的游戏应用智能合约,包含所有的游戏逻辑与规则。
当有用户玩这个游戏时,他们只与子链交互。他们可以持有资产,买卖资产,与其他玩家玩回合对抗,只要游戏允许你做的都行,而不需要直接与主链交互。由于只有少量节点处理交易,费用会很低,速度却很快。
但是这样安全吗?
通过将操作从链上移到链下,我们可以执行更多的操作,但是这样做的安全性如何?子链上的操作会被视为最后的操作吗?毕竟,我们刚才描述的操作都是一个实体操纵的节点验证的,这不是中心化了吗?公司难道不会任意地偷取我的资金和收集的卡片吗?
答案是,即使在这种一个实体控制区块生产的情况下,Plasma依然能给你一个最基本的保证:你总能提取你的资产回到主链。如果区块生产者非法操作,最坏的情况也只是他们迫使你离开子链。让我们看看一些区块链生产者可能作恶的方式,以及Plasma如何处理这些情况的吧。
. 首先,想像一下区块生产者试图说谎欺骗你——通过生产一个假的区块控制你的资金。他们是唯一的区块生产者,他们可以任意生产违背区块链规则的新区块。像其他区块一样,他们将提交这些含有区块证明区块至Plasma根合同。就像我们上面提到的,用户总有最后的权利提取资产回到主链。在这种情况下,用户将探测到图谋不轨的盗窃行为,然后在区块生产者试图使用他们盗取的资产之前将资产提取到主链。
Plasma同样创造了一种机制防止短期欺骗提取至主链。Plasma有一种机制,这种机制借助任何人都可发布的欺诈证明来显示区块生产者作弊了。这种欺诈证明包括以前的区块信息,允许我们按照子链的状态转换规则显示错误区块没有正确的从前一个状态转换过来。如果欺诈被证明了,子链将回滚至前一区块。甚至更好,我们可以构建一个任何欺诈区块生产者被罚没链上保证金的系统。
最后,区块生产者可以审查子链的用户。如果他们愿意,他们可以只是简单地排斥用户的交易,不打包至区块链,有效的阻止用户在子链上的任何操作。又一次,只是简单的提取我们的资产至主链即可以解决问题。
然而,提取资产本身具有一定风险。一个问题就是如果子链所有的用户同时提取资金会如何?发起大量提取操作时,以太主链可能没有能力在质疑期同时处理每个人的交易,用户可能流失自己的资产。尽管我们可以根据提交提取资金操作的数量延长质疑期等办法来阻止这种情况,仍然是个问题。
值得注意的是,大多数情况下不会存在一个实体控制所有生产节点的情况,这只是一个极端的例子罢了。我们可以创建由不同区块生产者实体组成的子链,这点就像公链的去中心化一样。在那种情况下区块生产者干扰的风险会小很多,所以用户同时提取资产的风险也会小很多。
现在,我们已经介绍了状态通道和Plasma,它们之间的不同值得我们注意。一个不同就是当通道各方达成共识时,状态通道能够即时地提取资产。当Alice和Bob同时关闭通道提取资金,只要他们对最后的状态都认同他们就可以立刻从通道中提取他们的资产。而在Plasma上则不可能,用户必须经过一段时间的质疑期才能提取资产。状态通道比Plasma的收费更低,也更快。这意味着我们可以在Plasma子链上创建状态通道。比如,在一个应用中两个用户交易一系列的小额交易。在子链级别建立状态通道将比直接在子链上操作便宜和快速的多。最后,注意这里只描述了部分内容,还有很多细节留待读者自行挖掘。Plasma本身处于很早期的阶段。如果你对Plasma现状感兴趣,你可以阅读itilik最近的提案最小可验证Plasma。这是台湾的一个小组完成的工作,你可以在这里找到他们。OmiseGO正在实现他们的去中心化交易所,他们也提交了他们最近的一次更新。
III、Truebit
Truebit是一项帮助以太网在链下完成复杂繁重计算任务的技术。它与状态通道、Plasma等增加网络吞吐量的技术的功能不同。如我们在开头部分所说,扩展是一个不止增加交易通量的多方面挑战。Trubit不会让我们完成更多的交易,但它将帮助以太坊上的应用完成更为复杂的操作,以一种仍然能被主链验证的方式。浙江使得我们能够完成在链上操作过于昂贵的动作。比如,来自其他区块链的有效简单支付验证,这种操作能够使得以太坊智能合约能够确认一个交易是否在另一个网络里发生。
让我们以一个例子来说明。想像一下你有一个昂贵的操作,比如SPV,需要在以太坊应用中执行。你不能在以太坊智能合约中执行它,因为SPV计算十分复杂。记住,在以太坊上任何操作都是有成本的。以太坊区块存在一个最大Gas的限制,制约了一个区块中能够做的操作。但是SPV计算太巨大,超过了一个区块所能使用的Gas的许多倍。
相反,你只需要付少量的费用让别人帮你做链下运算。那个你付钱帮你计算的人称之为求解者。首先,求解者在一个智能合约中抵押一定保证金。然后,你给求解者求解问题的描述,由他运算并返回结果。如果计算结果是正确的,他们的保证金可以返回;如果他们的计算不对,比如他们想欺骗你或犯了错误,他们将失去他们的保证金。
但是,我们如何知道结果是否正确呢?Truebit使用了一个称之为验证游戏的经济学机制。基本上,我们为称之为条件者的第三方提供激励去验证求解者的计算。如果挑战者能够在验证游戏中证明求解者错了,那么他们将获得奖励,而求解者失去他们的保证金。
因为验证游戏在链上进行,他不能简单地计算结果。相反,我们迫使求解者和挑战者识别它们之间不同的操作。实际上,我们将两者逼到一个角落中,找到产生不同结果的实际代码行。
一旦这个特殊的操作被识别,他就可以在以太坊上执行了。然后我们就在以太坊上的一个智能合约中执行这个特别的操作,处理一次即可发现究竟是哪一方说了真话,哪一方说了假话。
如果你对Truebit感兴趣,你可以度他们的白皮书,或者SImon的博文。
总结
第二层扩容方案共享了同一个思想:一旦我们有了一个公链提供的坚实硬核,我们就可以用它作为加密经济的锚,用于扩展区块链的应用。
现在我们已经研究了一下例子,对第二层扩容方案如何应用这种思想有了更多的具体认识。第二层扩容方案的经济学机制更像是一种互动游戏:他们通过创建激励鼓励各方互相竞争或者验证来运行。一个区块链应用可以假设一个宣告是可信的,因为我们已经创造了一个激励机制鼓励其他人去验证信息是否是伪造的。
在状态通道中,我们给所有参与方机会驳斥对方,借此确定通道的最终状态。在Plasma中,我们拥有欺诈证明和提取资金等手段。在Truebit,我们通过给挑战者激励验证求解者错误保证求解者说实话。这些方法都将帮助以太坊解决满足全球用户的扩容需求。像状态通道和Plasma,将增加平台的吞吐量;其他如Truebit,将使得智能合约完成复杂计算成为可能,打开了新的应用场景。
这里提到的三种方案只是加密经济扩容方案可能性空间的一小部分。我们没有包含像COSMOS和Polkadot这样的链间通信协议。我们应该期待去发明新的、未被期待的新的第二层扩容方案,改进现有的模型,提供在速度、完成性和负载三者之间达成新的平衡。
比任何第二层扩容方案更重要的是,潜在技术和机制的进一步发展使得它们在第一重要的地方成为可能:加密经济设计。
对于以太坊这种可编程的区块链来说,这些第二层扩容方案是他们长期价值的有力支撑。只有可编程区块链才能建立这些在第二层方案之下的经济学机制:你需要脚本语言编写程序驱动这个交互游戏。对于比特币这种有限的脚本语言来说,要做到这一点是很困难的。
以太坊使得我们能够建立第二层网络达到一个新的速度、完成性和运行成本的平衡点。这使得区块链能够完成更多的应用,因为不同的应用有不少的威胁模型,因此采用不同的第二层网络是十分自然的。对于高价值需要抵抗国家级别的侵袭的交易,我们可以在主网上进行;对于数字收集物交易,速度更为重要,因此我们采用Plasma。第二层网络使得我们可以不失去去中心化和完成性的前提下做出权衡选择。
更进一步来说,很难提前预测一种扩容方案需要那种脚本能力。当以太坊建立时,这些扩容方案还都不存在。但是由于以太坊是可编程的,它能够实现任何我们发明的经济机制。加密经济共识创造的确定性内核是区块链的优势,要完全利用这一优势的唯一方法,就是使用像以太坊这样的可编程区块链。