原文作者:Josh Stark
原文链接:
2018年,是专注于以太坊基础设施的一年。在这一年,大家对网络局限性进行了测试,重新把精力集中到扩容技术上。
以太坊还处于婴儿时期。今天,它还不够健全,也不具备可扩展性。任何了解这项技术的人,都清楚知道这一点。但是在过去一年里,由投机驱动的炒作,过分夸大了区块链的能力。以太坊与web3——一个安全、易于使用的分布式网络,受一套共识机制约束,并为数十亿人使用——仍在大家的视野范围内,在关键基础设施完善之前,都不会实现。
构建这一基础设施、扩展以太坊功能的项目,都被称作扩容方案。它们有许多不同形式,而且往往都是相互兼容或互补的。
本文中,我将深入探讨一种扩容方案:“链下”或者“layer2”。
l 首先,我将讨论以太坊(以及所有区块链)扩容挑战。
l 其次,我将谈到解决扩容问题的不同方案,并区分“layer1”和“layer2”。
l 第三,我将介绍layer2,并分析它是如何工作的,特别是状态通道(state channels)、Plasma、和Truebit。
本文的重点是让读者对layer2的工作原理有个全面而详细的理解。但我不会深入到代码研究和特定的使用场景。相反,我们专注于构建这种系统的经济机制,以及所有layer2技术的原理。
1. 公有链的扩容挑战
首先,必须要知道,“扩容”不是单一的、具体的问题。它是以太坊在服务全球几十亿用户之前,必须要解决的问题。
首先就是交易吞吐量方面。目前,以太坊每秒可以处理15笔交易,相比之下,Visa处理速度可以达到45000笔/秒。在过去一年里,一些应用程序——像Cryptokitties发展的很好,导致整个网络运行速度也开始放缓,交易价格增加。
像以太坊这样的公有链,要求网络中每一个节点参与处理每一笔交易,其主要局限也正在于此。以太坊上的每个操作——转账,Cryptokitty的诞生,ERC20合约的生成——都必须由网络中的每个节点一起执行。这是设计时决定的,也是使公有链足够权威的原因之一。节点不需要从外部得知区块链的状态,它们自己可以解决。
这对以太坊的交易吞吐量设置了一个基本限制:它不能高于从单个节点获得的数据的速度。
我们可以要求每个节点做更多的工作。如果我们将区块大小加倍,这将意味着每个节点所做的工作量大约是现在工作量的两倍。但这是以牺牲去中心化为代价的:需要节点做更多的工作,那么功能较弱的计算机(如消费者设备)可能会退出网络,而挖矿权利将集中到强大的运营商手上。
我们需要一种方案,既能不增加单个节点的负荷,又能处理更多交易。
从概念上讲,我们可以采取两种方法来解决这个问题:
1) 如果每个节点不必并行处理每个操作呢?
第一种方法,颠覆前提:如果我们可以构建一个区块链,链内节点都不必参与处理每笔交易呢?如果网络被分成两个部分,可以半独立地运作呢?
被分开后,A区可以处理一批交易,B区也可以处理一部分。这可以把区块链交易吞吐量提高一倍,因为我们现在设定每两个节点可以同时工作。如果我们把区块链分成许许多多不同区域,那吞吐量会提高许多倍。
这就是“分片(sharding)”背后的理念,是由以太坊V神和其他科研人员提出来的。一个区块链被分成许多不同的“片”,每个“片”都可以独立处理交易。分片一般是指layer1的扩容方案,因为它是在以太坊的基层协议上实现的。
2) 如果为以太坊建立协议层网络呢?
第二种选择和第一种恰恰相反:与其增加以太坊自身的能力,不如在其基础之上采取措施。以太坊区块链基本层的吞吐量不变,但实际上我们可以执行更多操作,比如交易、状态更新或简单的计算。
这就是“链下”技术背后的原理,像状态通道,Plasma,Truebit。虽然每一种技术旨在解决不同问题,但它们都需要在保证安全性的前提下,进行“链下”操作。
这也被称作layer2,因为它们事建立在以太坊主链之上的。它们不需要在基础层上进行改变,相反,它们只是作为与链下软件交互的智能合约存在的。
2. Layer2是数字经济解决方案
在细说layer2解决方案之前,先来了解一下其背后的原理。
公有链的基本力量在于数字经济共识。通过仔细调整激励措施,并将其与密码学结合,从而从系统内部达成共识。这也是中本聪白皮书中提到的重点,这点现在已经被应用到许多不同的公有链中,包括比特币和以太坊。
数字经济共识给了我们一个硬核——除非像51%攻击这样极端事件的发生,否则所有操作(包括支付,或者智能合约)都将按书写程序执行。
Layer2背后的原理是,我们可以将这个确定性内核作为一个锚——在此基础之上附加其他经济机制。Layer2可以将公有链的效用扩展到链外,让我们在链外互动成为可能,这些互动在需要的时候仍然可以返回到主链。
这些层都是建立在以太坊主链之上的,所以它并不能像链上操作一样安全。但是仍然可以确保它们是最终地、安全地、实用地——特别是只需要牺牲一点操作权限,就可以提高运作效率,降低手续费用。
数字经济学并不是由中本聪的白皮书开始,也不会就此结束——这是我们正在尝试应用的技术而已。不仅在核心协议的设计上,也体现在旨在扩展底层链功能的layer2的设计中。
Ⅰ. 状态通道(State channels)
状态通道指的是“链下”处理交易和其他操作的一种技术。然而,发生在状态通道内事物仍然由很高的安全性和终结性:如果出了什么问题,我们仍然可以选择回到链上交易。
很多读者都知道支付通道,这个已经出现许多年了,最近也在通过闪电网络(lightning network)在比特币上实施。状态通道是支付通道更为普遍的形式——它们不仅可以处理支付,也可以处理区块链的“状态更新”——就像智能合约的更改。2015年,Jeff Coleman首先提出状态通道。
来看一个例子,可以更好解释状态通道的工作方法。请注意,这是一个概念性的解释,这意味着我们不会进入特定的技术细节。
想象一下,Alice和Bob玩三子棋游戏(tic tac toe),赢家可以获得1ETH作为奖励。最简单的办法,就是在以太坊上创建一个智能合约,将三子棋游戏的规则写入智能合约内,并追踪每一名玩家的棋子移动。每次玩家移动棋子时,就给合约发送一次。当一个玩家生出,按规则,合约将支付1ETH给胜出者。
这虽然可行,但是效率低、速度慢。Alice和Bob的整个以太坊网络都在为这个游戏运行,造成资源的浪费。玩家每移动一步棋,都要支付一笔费用,并且,他们还要等矿工完成验证,才能进行下一步。
这时候,我们就可以设计一个系统,让Alice和Bob的互动尽量在链下进行。Alice和Bob可以在链下更新状态,并在需要的时候,回到链上交易。我们把这种系统称之为“状态通道”。
首先,我们在以太坊主链上创建一种智能合约作为“法官”,并将游戏规则写入合约,并识别出Alice和Bob是本次游戏的两个玩家。再给这个合约设置1ETH的奖励。
紧接着,Alice和Bob开始互动。Alice开始走第一步,签名后发送给Bob,Bob也会签名,并将自己签名后的版本发回,自己保存一份福本。然后Bob走一步,签名后发送给Alice,Alice也签名后发回,自己保存副本。每次,他们都会更新自己的状态。每次互动都会包含一次“随机数nonce”,这就可以给每次互动按时序排列。
至此,所有操作都不是在链上发生。Alice和Bob只是在互联网中发生了交易,但是所有交易都可以上传至合约——换句话说,它们依然是有效的以太坊交易。你可以理解成,这两个人是在来回写着区块链认证的支票。银行没有存款或者取款,但是每张支票都可以随时存入。
如果Alice和Bob的游戏结束,比如说Alice赢了,他们可以上传最终状态(交易清单)并关闭通道。这样,只用支付一次交易费用就可以了。合约可以确保“最终状态”有双方签名,并等待一段时间,以确保结果可靠,最后把1ETH的奖金支付给Alice。
为什么需要这个等待时间?
假设Bob上传的不是最终版本,而是他赢过了Alice那个版本。但是合约只会执行指令,无法知道哪一个是最终版本。这个时候,设置一段等待时间,可以让Alice提供证据证明自己提供的是最终版本。
Alice提交双方签名的交易副本,合约通过交易的nonce确定Alice提交的是最终版本,驳回Bob的请求。
特点和限制
状态通道适用于很多应用程序,并对传统的链上操作进行了许多升级。但是,在引入状态通道之前,还必须考虑其他因素:
l 状态通道依赖可用性。如果Alice在过程中断网了(假设是由于Bob迫切想要获得奖金,而破坏了Alice家的网),那么她可能无法及时提交状态信息。即便如此,Alice可以付钱,让其他人保存她的交易状态,并作为她的代表,维持数据的可用性。
l 如果用户要进行许多次状态更新,并且持续时间很长,那么这种状态通道就特别适合。这是因为虽然在创建时需要一笔费用,但是之后维护成本就会特别低。
l 状态通道适用于那些用户固定的应用程序。因为合约必须知道通道内的所有实体。虽然可以对人员进行增加或者移除,但这都需要对合同进行更改。
l 状态通道具有很强的隐私属性。因为所有操作都发生在“内部”通道中,而不会在链上公布,也不会记录在链。只有交易的开始和结束状态是公开的。
l 状态通道具有即时的终结性。也就是说,一旦双方对状态签名了,就可以认为是最终的。必要的话,也可以“强制”在链上执行。
在L4,我们正在构建一个Counterfactual:一个基于以太坊的状态通道框架。我们计划完成通用的、模块化的模板,并允许开发人员在其应用程序中使用状态通道,而不需要自己成为状态通道专家。
另一个值得关注的状态通道项目是Raiden,改项目的目标是建立一个支付渠道,使用的是与闪电网络类似的模式。这意味着,与其与特定人员开设通道,你还可以与一个较大的频道网络开设通道,使你可以与连接到同一频道的其他任何人交易,并无需手续费。
除了Counterfactual,Raiden之外,还有几个基于以太坊的的应用程序。例如,Funfair为了它们的去中心化平台建立的状态通道(“Fate channels”),Spankchain为成年演员建立了单向支付通道(他们也为ICO创建状态通道),Horizon游戏为他们的以太坊游戏创建了状态通道。
Ⅱ. Plasma
2017年8月11日,Vitalik Buterin和Joseph Poon发表了名为《Plasma:自主智能合约》的论文。这篇文章引入了一种全新的技术,可以提高以太坊的处理效率。
与状态通道一样,Plasma是一种处理链下交易的技术,需要依赖以太坊底层技术去对其安全性进行保障。但Plasma的切入点不一样,它可以允许在以太坊主链上创建“子链”(“child” blockchain)。这些“子链”,反过来,也可以创建它们自己的“子链”,以此类推。
其结果是,我们可以在子链级执行许多复杂的操作,运行包含数千名用户的应用程序,并且只用与以太坊主链进行很少的交互。Plasma可以运行的很快,并收取较低的交易费用,因为整个过程不需要在以太坊主链上发生。
我们先来看一个例子,好理解Plasma是如何运作的。
让我们想象一下,你正在以太坊上创建一个交易卡片游戏。这些卡片就是ERC 721令牌(比如Cryptokitties),但它们具有某些特性和属性,让用户可以进行博弈——比如《壁炉石》(Hearthstone)或《魔法的聚会》(Magic the Gathering)。在链上执行这些复杂的操作是很昂贵的,所以使用Plasma是很好的选择。
首先,我们在以太坊主链创建一套智能合约,作为服务于我们Plasma子链的“Root”。Plasma Root包含我们子链的“状态转换规则”(比如“不能双花”),记录子链状态的哈希,并充当一种“桥梁”,允许用户在以太坊主链和子链之间进行互动。
然后,我们创造我们的子链。子链可以有自己的一套共识机制——在本例中,那就是授权证明(PoA),这是一种依赖可信区块生产者的共识机制。区块生产者类似于工作量证明中的矿工——它们是接受交易、生成区块、收取交易费的节点。打个简单的比方,假设你是生成区块的唯一实体——也就是说,你的公司运行几个节点,这些节点是我们子链的区块生产者。
一旦子链被创建或者激活,区块生产者就对root合约做出承诺。意味着他们实际在说“我作证,子链中的最新区块是X。”这些承诺都被记录在Plasma root,以证明子链中发生的交易。
现在,子链已经准备好了,我们可以创建交易卡游戏的基本组成部分。卡片是基于以太坊主链的ERC 721,通过 plasma root转移到子链。这就引入了一个关键点:plasma允许我们与基于以太坊的数字资产进行大规模交互。然后,我们再在子链上部署游戏应用的智能合约,把游戏逻辑和规则都写进合约里。
游戏用户其实只是与我们的子链交互。他们可以持有资产(ERC 721 token),与以太交易,与其他用户游戏,从来不用与主链直接互动。因为只有少量节点需要处理交易,交易费用会低很多,操作速度也会更快。
但这怎么确保安全呢?
将更多的操作转移到子链上,主链就可以处理更多交易。但是要怎么保障它的安全呢?在子链上发生的交易是最终的吗?毕竟,我们刚刚还说,会有一个实体公司控制区块的生成。这不就是中心化吗?这个公司能随时盗走你的资金或者游戏卡吗?
简单地说,即使一个公司拥有子链区块生成100%的控制权,plasma也为你提供了一个基本保证,你可以随时将你的资金和资产取出,放回主链。如果一个区块生产者出现恶意行为,最坏的打算是,它会强迫你离开子链。
让我们看看区块链生产者会有怎样的恶意行为,再看plasma会做出怎样的对策。
首先,想象一下,一个区块生产者会怎样欺骗你——通过创建一个假的新区块来控制你的资金。他们是唯一有权力生成区块的,因而他们可以不按照区块链的法则来创建区块。与其他区块一样,他们也会公布一份包含该区块证据的Plasma root契约的承诺。
如上所述,用户是有保证的,他们可以撤回他们的资产回到主链。在这种情况下,用户(或者更确切地说是代表他们行事的应用程序)将检测到企图盗窃的行为,并在区块生产者尝试使用他们“窃取”的资产之前退出。
Plasma 还创造了一种机制,以防止欺诈退出主链。Plasma包括一种机制,任何人(包括你)都可以向root合约发布欺诈证据,证明区块生产者作弊。此欺诈证明将包含有关前一个块的信息。根据子链的状态转换规则,虚假块不符合以前的状态。如果欺诈被证实,子链将被“退回”到前一个区块。更好的是,我们构建了一个系统,在这个系统中,任何签下虚假区块的区块生产者都会因丢失一张链上存款而受到惩罚。
但提交欺诈证据需要获得基本数据,即用于证明欺诈的块的实际历史。如果区块生产者也没有分享先前区块的信息,以阻止Alice向root合约提交欺诈证据,该怎么办?
下,Alice需要取出她的资金,离开子链。实际上,Alice向root合约提交了一份“资金证明”。在等待一段时间之后,任何人都可以质疑她的证明(例如,为了证明她在后来的有效区块中花了这些钱),Alice的资金被移回以太坊主链。
最后,区块生产者可以审查子链的用户。如果他们愿意,区块生产者可以有效地阻止用户在子链上执行任何操作。也就是简单地将我们所有的资产撤回到上面所述的主链上。
然而,取款本身也存在风险。如果子链上的所有用户要在同一时间取出自己所有的资产,以太坊主链可能没有办法承受这个压力。也有许多技术可以阻止这件事发生,如延长提款的响应时间。
事实是,一个公司掌控100%区块生成权是非常极端的情况,一般不会发生这种情况。也就是说,子链和公有链一样,是去中心化的。因而上诉提到的风险会比较小。
现在我们已经谈到了状态通道和Plasma,将两者比较一下。
l 一个不同之处是,当同一通道内的所有用户都同意退出时,状态通道可以即时退出。比如说,如果Alice和Bob都同意关闭一个通道,并取回他们的资金,他们就可以立即拿回资产。这在Plasma上是不可能的,在Plasma中,用户必须等待一段时间,才能退出。
l 状态通道也比Plasma更便宜,更便捷。这意味着我们可以将两者结合起来,在Plasma子链上建立状态通道。例如,在一个app上,两个用户可以进行系列小额交易。在子链上创建状态通道,比直接在子链上进行交易,会更便宜高效。
l 最后,本文可能遗漏了一些细节。Plasma还处在早期,你可以看看V神最近提出的“最小可行的Plasma”。还有一个台湾团队也正在做这件事。OmiseGo也在这个方向上努力。
Ⅲ. Truebit
Truebit是帮助以太坊完成繁重计算的链下技术。而状态通道和Plasma是扩大吞吐量的,所以这也是Truebit的不同之处。Truebit不会提高交易吞吐量,但是它会让基于以太坊的应用程序做更复杂的事情。
有些操作计算成本太高,无法在链上执行。例如,验证来自其他区块链的简单支付验证(SPV)证明,这可以让以太坊智能合约“检查”一项交易是否发生在另一条链上(如比特币)。
想象你需要在基于以太坊的app上执行一些昂贵的计算(像SPV证明)。你不能把它简单的作为以太坊主链智能合约的一部分,因为SPV计算太贵了。事实上,在以太坊上做所有计算都很贵,因为总是需要所有节点都要参与到计算中。
然而,你可以给某个人(解决者)支付一点费用,让它完成链下计算。
首先,解决者往智能合约存入一笔费用,然后,你把需求告知解决者。他进行计算,然后把结果反馈给你。如果计算结果正确,他的押金会被退回。如果计算出错(他出错或作弊),就会损失自己的押金。
那我们怎么知道结果正不正确呢?Truebit使用一种叫“验证游戏”的经济机制。从本质上讲,我们创造了一种激励机制,鼓励“挑战者”来验证解决者提交的结果。如果挑战者能够通过验证游戏,证明解决者提交了一个错误的结果,那么他们就会得到奖励,而解决者则会失去他们的定金。
因为验证游戏是在链上执行的,它不能简单地计算结果(这将破坏整个系统的目的,因为如果我们能够在链上进行计算,我们就不需要Truebit)。相反,我们强迫解决者和挑战者确定他们不同意的具体操作。实际上,我们正在努力使双方对结果产生异议。
一旦操作被认定,就足以在以太坊主链上运行。然后,我们通过智能合约来执行细节。
结论
Layer2有个共同的内核:一旦有了一个公有链提供的确定性硬核,我们就可以将它用作扩展块链应用程序有效性的数字经济系统的锚。
我上面提到一些例子,可以让我们更具体地了解layer2的应用场景。layer2所使用的经济机制往往是交互式的游戏:它们通过为不同的参与者创造竞争或“检查”的动机来发挥作用。区块链应用程序可以假定一个给定的声明可能是真的,因为我们已经为另一个方提供证明它是假的信息创造了强大的动机。
在状态通道中,我们确认渠道的最终状态的方式是——让各方有机会“反驳”对方。在plasma中,它是我们如何管理欺诈证据和取款。在Truebit中,它是我们如何确保解题者讲真话——通过给验证者一个激励来证明解题者是错的。
这些系统将有助于解决大规模全球用户群缩放所涉及到的一些挑战。一些工具,比如状态通道和Plasma,将增加平台的事务吞吐量。其他的工具,比如Truebit,将使得有可能将更困难的计算作为智能契约的一部分,从而打开新的用例。
这三个示例仅代表了用于数字经济扩容方案的一小部分。我们甚至还没有涉及到像Cosmos或Polkadot这样的“区块间协议”的工作。我们还应该期望创造新的和意想不到的layer2系统,以改进现有的模型,或在速度、终结性和成本之间提供新的权衡点。
比任何特定的layer2更重要的是进一步开发底层技术和机制:数字经济。
这些layer2解决方案需要建立在可编程区块链之上,如以太坊:你需要一种脚本语言来编写程序。对于比特币这样的区块链,这就困难得多(或者在某些情况下基本不能实现),因为这些区块链只能提供有限的脚本。
我们可以在以太坊上构建layer2,并可以在访问速度、终结性和成本之间达到平衡。这使得底层区块链对于更广泛的应用程序来说更加实用。对于高价值的交易,建议使用主链。对于交易数字收藏品,速度更重要,我们可以使用plasma。Layer2让我们在不损害底层块链的情况下进行这些权衡,保持去中心化和终结性。
在设计以太的时候,Plasma和Truebit还没有被发明出来。但由于以太坊是完全可编程的,它几乎能够实现我们发明的任何经济机制。