尽管区块链的应用越来越普及,但现有协议的性能仍然非常有限。近来不少所谓的第二层扩展(Layer 2)协议如雨后春笋般涌现,这其中比较有名的有:状态通道(State Channels),侧链(Side Chains),Plasma和Roll Up。本文将简要介绍这几种技术并罗列每种技术的优势和劣势。
第二层扩展技术的核心思想是让交易者不在区块链主网(也就是第一层 Layer 1)而在其它通道进行交易,但仍然利用主网进行仲裁,保障交易的安全。
不同的第二层扩展方案(以下简称“L2方案”)有不同的特性和优劣势。
状态通道(State Channels)
我们以一个简单的支付通道为例进行讨论。支付通道是L2方案中应用最广泛的。闪电网络就是一个典型。
支付通道是状态通道的一个具体实例。状态通道是在一组固定数量的交易者(通常为两个)之间搭建协议使其互相能安全地交易,交易在链下进行。具体地说,当两个交易者在支付通道中进行资产交易时,流程是这样:双方先在区块链主网上往各自的账户存储足额的资产,比如价值10美元的比特币(注:存储资产的交易为链上交易)。然后双方在进行后续交易时就不再在主网上进行,而只进行状态更新,这种状态更新的格式类似于【交易回合,交易金额,数字签名】。只要双方各自账户显示的余额都大于零双方就可以一直以这样的方式交易下去。
一旦有一方想终止支付通道,可执行“退出”的动作,将最后的状态更新提交到区块链主网,并对各自账户的最终余额进行结算。区块链主网负责验证提交的状态更新是否有效,双方的账户余额是否有效,这样就保证了双方交易的安全和有效。
在这个过程中有个问题:当一方执行“退出”动作时,区块链主网无法验证状态更新提交之后双方是否还有新的状态更新发生。我们看下面的例子:
图中在某一个时点Alice有11美元,Bob有9美元,Alice执行了“退出”动作,之后Alice给Bob发送了一个状态更新,指示向他支付7美元。但此时区块链主网就无法知道Alice发送给Bob的这个支付7美元的状态更新,并且会视Alice的这个“退出”动作有效。
对此,业界提出一个补充方案:当一方执行“退出”动作后,给另一方一定的时间对执行“退出”前提交的最后的状态更新进行质疑。另一方可以拿出一个新的状态更新(包含更高的交易回合数以及对方的数字签名)进行质疑。具体到上例中,在Alice提交了状态更新后,Bob可以在规定的时间内向主网提交一个新的状态更新,显示Alice又给他转账了7美元。
尽管这套包含“退出”操作的方式是安全的,它仍然有一个比较大的问题:交易的参与者可能要被迫等待一段时间才能真正退出,而这段等待时间通常为24小时,并且需要经常监测主网,关注是否对方试图提交一个过时的状态然后执行退出操作。对此一个新的要素:瞭望塔(WatchTower)被加入到这个方案中作为第三方负责监测区块链主网。
另外,如果交易双方进行过多次交易,建立了某种程度的互信,可以共同签署一份“结论证明(conclusion proof)”让任何一方执行退出动作后,另一方无需再等待便可结束交易。
由于区块链主网能验证状态,因此支付通道技术也可被用于仲裁状态的变更。比如棋类游戏就可以用类似的状态通道实现:对弈的双方可以将他们下棋的步骤作为状态更新提交给主网进行验证。
尽管存在诸多问题,但状态通道还是广泛用于支付,游戏等场景中。由于这种技术能即刻确立不可更改的状态(“finality”)(即一旦对方确认了状态,该状态即被认可且不能更改),因此在交易过程中除了开始预存资产以及最后执行退出动作要在区块链主网上进行而支付费用外,其它步骤和交易则完全没有费用,并且通道的构造也相对简单。
状态通道在框架和概念上看起来简单,但在实际实现中要考虑到多种边际情况以防止一方非法盗取另一方的资产,因此在细节上相对复杂很多。
状态通道网络(State Channel Networks)
状态通道还有个缺陷:它只适用于两方交易。我们看另外一个例子:如果Alice和Bob之间有一个状态通道,Bob和Carol之间有一个状态通道,那么Alice便能通过Bob给Carol转账。这样我们能构筑一个状态通道网络,使得网络中没有直接构建通道的双方都可以这样间接交易。
这便是闪电网络的核心思想。
侧链(Side Chain)
侧链的核心思想是单独构造一个有自己矿工的区块链,这个区块链连接到一个主区块链。资产可以在侧链和和主链之间自由流动。侧链对本链中区块的区块头进行快照提交到主链以防止分叉。当侧链中有矿工想合谋进行分叉时,快照可以用来对付这种不轨行为。
在上图中,侧链产生区块,系统将侧链产生的区块进行快照然后提交到主链。一个快照就是区块的哈希值,快照会被存储到主链上。如果侧链中因为分叉出现多条链,那就看哪条分叉链是基于最新的快照产生的。上图中,矿工分叉出了一个A’<-B’<-C’的新链,试图双花。如果区块A被快照存档进主链,那么A延续的这条链将被视为是唯一有效的侧链。
如果用户想把数字资产从主链移到侧链,他就要在主链锁定资产,并向侧链提供证据证明他在主链锁定了资产。当他要释放锁定在主链的资产时,要先向侧链发起退出的动作,并向主链证明他退出了侧链。
尽管侧链能利用主链防范分叉,侧链上的矿工仍然有机会合谋发起被称为是“无效状态转换”的攻击。这种攻击利用的是主链无法验证侧链上所有区块这个不足,因此如果超过50%或66%(取决于侧链的设计机制)的矿工参与合谋,那他们就有可能创建一个无效的区块,从其它账户盗取资产,然后将此交易快照上传到主链,完成攻击。
我们曾经有一篇文章详述了分片机制中的无效状态转换问题,那篇文章中提到的每一个问题都存在于侧链中。把两种情况进行类比,侧链就类似于分片,主链就类似于以太坊的信标链(beason chain)。
在那篇文章中我们也提出了一些解决方案,但都还没有实现。在现有的侧链方案中,项目方都假定起码有50%(或66%,取决于设计机制)以上的矿工不会作弊。
Plasma
Plasma是一种“无监管职责(non-custodial)”的侧链(通常被称为“plasma chain”)。在plasma chain中即便所有的矿工都参与合谋作弊,链上的资产也能保证安全并被转移到主链。
用Plasma技术实现的一个最简单的应用被称为“Plasma Cash”。这个应用目前只支持NFT代币,并且在每笔交易中只支持转账一定数额的代币。它的运作方式如下图所示:
每一个区块中包含一个稀疏默克尔树(Sparse Merkle Tree)。在这种树中,它的叶子包含代币所有权的变更信息。举例来说,上图中,有四种代币在流通,区块B中代币1,3和4没有换手(也即叶子为NIL),代币2属于Alice。如果区块D包含一笔Alice签名的交易,把区块发送给Bob,那么代币2的所有权也会变更为Bob。
在Plasma中一个用户要把一个代币转账给另一个用户,他需要提供这个代币所有曾经的交易历史。在上例中如果Bob想给Carol转账,则那笔转账交易需要包含若干区块的入口信息,每个入口信息都指向一个区块,该区块中包含代币所有权变更信息的默克尔树证明。
Plasma chain把区块头都进行快照存档在主链上,这样Carol就能验证快照中所有哈希值对应的默克尔树证明是否有效,以及每一次该代币的所有权变更是否有效。一旦这笔交易被打包进一个plasma chain的区块中,那么这个区块的入口信息也会被写进一个默克尔树中,证明Carol现在是这个代币的主人。
由于我们假设在Plasma中矿工是有可能集体作弊的,因此退出动作不能立即生效(矿工所进行的快照操作可能是伪造的),而需要一定的退出机制。上面讨论的Plasma Cash即是如此,需要一套退出机制,并且这套机制相当复杂。我在和Loom Network的Georgios Konstantopoulos的一次深度交流中,他展示了Loom Network设计的一套退出机制。我们发现矿工可以通过拒绝某些数据盗取资产或发起攻击。后来Dan Robinson提出一套更简单的退出机制。
总之,Plasma最大的优势就是存储在它链上的资产都是安全的,即便在矿工进行了“无效状态转换”,拒绝已经产生的区块,停止生产新的区块时,一个诚实的参与者也可以安全地取回他的资产。
它的劣势就是要转账代币时必须提供代币所有的转账交易历史,并且退出机制比较复杂。
Roll Up
当我们讨论侧链时,我们解决“无效状态转换”的方式是提供每一个状态转换的证明。Matter Labs团队对此给出的方案被称为“Roll Up”,并最早由Barry White Hat在ethresear.ch上发表。
Roll Up也是一种侧链方案,它也会产生区块,并把产生的区块进行快照存档到主链上。Roll Up中的矿工可以是完全不值得信任的,这意味着在任何时点矿工都可能停止产生区块,制造无效区块,拒绝区块等发出各种恶意行为。
与通常的侧链类似,Roll Up中的矿工也无法对已经作快照存档的节点之前的节点进行分叉。因此,一旦主链上的一个区块包含了侧链区块的快照存档,并且该主链区块被确认,则快照中的侧链区块也被确认。
为了解决无效状态转换的问题,每当Roll Up矿工对一个区块进行快照时,他必须提供该区块所包含的所有交易的零知识证明,如下图所示:
上图中有三个区块在Roll Up链上:A,B和C。它们分别被快照到主链上的区块X,Y和Z。在每个时点主链都只需存储Roll Up链上当时的状态的默克尔树的根。当区块A被快照时,一个交易便会被发送到主链,这笔交易包含:
1. 最新状态S2的默克尔树根h(S2);
2. S2的完整状态信息或区块中的所有交易信息
3. 一个零知识证明(zk-SNARK)证明从状态S1到状态S2的变化过程中所有的交易都有效。并且这些信息与上述条件2中的交易信息吻合。
这笔交易验证这个零知识证明后,会将新的默克尔树根h(S2)存到主链上。这里要指出的是,这笔交易并不会将A的完整信息全部存到主链上,而会存在call data中,以便日后需要时取用。
尽管把区块的完整信息存在call data中会造成瓶颈,但它解决了数据有效性的问题。现在Matter Labs的方案中为一笔交易产生一个零知识证明大概要花1分钟,每一笔交易在以太坊上大概耗费1K gas,占以太坊call data 9个字节。
这种设计杜绝了任何矿工作恶的可能:
1. 矿工无法拒绝数据,因为一笔进行快照的交易需要提供完整的区块信息或完整的交易状态信息作为参数并验证内容,而该内容在主链上永久存储。
2. 矿工无法产生一个包含无效状态转变的区块,因为他必须提交一个能证明状态转变的零知识证明,而这个零知识证明是无法从无效区块中得到的。
3. 矿工无法分叉,因为唯一有效的区块链永远要以最新的快照作为标准。
在这个方案中,虽然不少数据仍然要存储在以太坊的call data中,但实际占用的可写存储空间还是恒定的(非常小),所消耗的以太坊费用只有1K gas/tx,这比一般的交易费少了21倍。
重要的是,在Roll Up方案中,矿工如果想退出挖矿可以即刻退出而无需等待一段时间。这些优势让Roll Up看起来是目前诸多L2方案中最令人兴奋的。
Outro
我(本文原作者)在Near协议项目组工作,该项目是以太坊主网的一种分片协议。目前有一种误区认为以太坊主网的分片和第二层扩展方案之间存在竞争关系。实际上并不是这样,即便分片实现了,L2方案仍然是可用的。
就算分片实现后,以太坊的性能极大提高,由于很多L2方案都是基于特定应用场景设计的,因此在这些场景中,使用L2方案仍然会更便宜,更高效。
参考链接:https://nearprotocol.com/blog/layer-2/