引介 | Layer 2 方案概览:从状态通道到 Roll Up_ROL:TROLLBNB币

虽然区块链得到了日趋广泛的采用,当代协议的负载量却十分有限,因此涌现出了许多Layer2协议,例如状态通道、侧链、Plasma和RollUp。本文深入探究了这些方案各自的技术细节和优缺点。

所有Layer2解决方案的核心思路都是让多个参与方通过某种方式实现安全交互,无需将交易发布在主链上,不过在某种程度上还是要利用主链作为仲裁方来确保其安全性。

不同的Layer2方案有不同的特征和优缺点。我个人最看好的Layer2方案是RollUp,会在下文详细阐述。

感谢Jones(PlasmaGroup)、TomClose(Magmo)、PetrKorolev和GeorgiosKonstantopoulos对本文初稿的审阅。

状态通道

我们先来看看入门级的Layer2方案——支付通道。支付通道是如今最广泛采用的Layer2方案。例如,闪电网络就是建立在支付通道技术上的。

支付通道是状态通道这个大概念下的一个具体实例。关于状态通道的发展史可以参见维基上的概述。状态通道是固定一组参与者之间的协议,用以实现安全的链下交易,其中支付通道专门用来支付。支付通道协议具体如下:两名参与者各自通过链上交易在链上锁定保证金,比方说,价值10美元的比特币。一旦锁定完成,参与者双方即可互相发送形式为的状态更新来实现转账,无需与主链进行交互,只要双方的余额都还为正值即可。

一旦参与者中有一方想要停止使用支付通道,可以执行“退出”操作:将最后的状态更新提交至主链,结算下来的余额会退给发起支付通道的两方。主链可以通过核实签名和最后结余来验证状态更新的有效性,从而防止参与者使用无效状态来退出支付通道。

这种“退出”模式存在一个问题,即主链无法验证支付通道是否提交了全部交易,也就是说,在提交了状态更新之后是否不再出现新的状态更新。我们可以考虑这样一个场景:

假设在初始状态下Alice有11美元而Bob有9美元,Alice向Bob发送了一个状态更新——向Bob转账7美元,并等待Bob向她提供服务,然后在7美元还没到账之前就退出了支付通道。由于主链不知道还有另外的状态更新,会将“退出”交易视为有效。

这个问题的解决方案是,在Alice发起退出交易之后,为Bob留出一段时间的“挑战期”。在此期间,Bob可以提交未完成结算的状态更新,里面包含Alice的签名,而且轮次数也高于Alice在退出时提交的状态更新。在上例中,Bob可以在挑战期内提交最后一个状态更新,也就是Alice向他转账7美元的状态更新,并且索要16美元的余额,而不是被Alice提交的状态搞得只剩下9美元。

虽然目前的退出机制设计非常安全,但是主要麻烦的一点在于:参与者可能得等待比较长的一段时间,通常是24小时,才能退出,而且需要频繁监控主链以确保他们的交易对手方没有使用过去的某个状态退出。可以通过WatchTowers技术将监视全网的任务委托给第三方。更多关于暸望塔的文章可以阅读这篇和这篇。

为了避免这种不必要的等待,双方可以通过许多实现来达成“协同关闭”。其中,参与者可以签署一个“结束证明”。有了这个证明之后,另一方无需等待挑战期结束即可退出。

支付通道可以广泛应用于任意的状态转换,而非仅仅局限于支付一途,只要主链可以验证这些状态转换的正确性即可。例如,状态通道可以用来下棋,棋手可以将各自的走棋作为交易发送给对方。

虽然存在不便之处,但是状态通道已广泛应用于支付、游戏等用例,因为这种技术具有即时确定性,无需参与者交纳除质押和退出费用以外的其他费用,而且在结构上相对简单。

虽然状态通道的广义定义较为简单,而且考虑到了所有极端情况,可以防止一方非法占有另一方的资产,但是实现起来比较复杂。Whiteboard系列中有一个视频来自Magmo团队的TomClose,深入分析了构建安全状态通道的复杂性。

状态通道网络

状态通道的另一个缺点是只能在两个参与者之间开设。你可以通过N/N多签机制在多个参与者之间维护一条状态通道。不过相比之下,具备相同功能的Layer2方案更为理想,使得彼此之间未开设状态通道的参与者也能直接进行交易。

状态通道还有一种很有趣的架设方法。如果Alice跟Bob之间有一条状态通道,Bob和Carol之间也有一条状态通道,那么Alice就可以通过Carol安全且自动地转账给Bob。这样就可以构建一个完整的状态通道网络,容许大批量的参与者彼此进行交易,无需在每一对参与者之间开设状态通道。

这就是闪电网络的设计思路。Whiteboard系列中有一个视频是DanRabinson讲解Interledger,深入分析了闪电网络的设计,可以点击这里查看。

侧链

侧链的核心思路是构建一条完全独立的区块链,有自己的验证者和运营者,可以与主链互相转移资产,而且会选择性地将区块头的快照发送至主链,从而防止分叉产生。有了这些快照,就可以有效防止分叉,即便侧链上的验证者串谋起来发动分叉攻击也没用。

从上图可以看出,侧链会生成区块并将它们的快照发送至主链。所谓的快照就是存储于主链上的区块哈希。侧链上的分叉选择规则是,合法的链必须构建在最近一个进行过快照的区块之上。在上图所示情况下,区块A的快照已经发送至主链,即使侧链上的验证者勾结起来,试图在区块A生成之后生成一条更长的A’<-B’<-C’链来发动双花攻击,侧链上的参与者也会忽略这条更长的链。

如果参与者想要将主链上的资产转移至侧链,他们就要将这部分资产“锁定”在主链上,并向侧链提供锁定证明。如果要解锁主链上的资产,就要在侧链上发起一个“退出”交易,并在该交易被打包上侧链之后提供退出证明。

虽然侧链可以利用主链的安全性来防止分叉,但是验证者依然可以通过串谋来发动另一种叫做无效状态转换的攻击。这种攻击背后的思路是,主链本来就不可能验证侧链上的所有区块。因此,如果有超过50%或66%的验证者串谋的话,他们可以创建一个完全无效的区块,窃取其他参与者的资产,并将这个区块的快照发送至主链,发起并完成一个“退出”交易,就可以成功偷走这些资产。

我们之前写过一篇关于分片机制下无效状态转换问题的概述。这个问题一对一对应到侧链语境下,侧链就相当于概述中的分片,主链就相当于概述中的信标链。

那篇概述中还提到了避免无效状态转换问题的解决方案,不过目前还没有践行。大多数侧链都是基于验证者串谋人数占比不超过50%的设想之上的。

Plasma

Plasma是一种可以实现“无监管”侧链的技术,换言之,即使侧链上所有验证者串谋起来作恶,plasma链上的资产也是安全的,而且可以退回主链。

最简单的plasma设计通常被称为PlasmaCash,只支持简单的非同质化代币,而且每个交易转移的资产只能是一个特定的常量。PlasmaCash的运行方式如下图所示:

每个区块都含有一个稀疏默克尔树,它的叶节点则包含某个代币所有权的变更。以上图为例,一共有4个代币处于流通中。在区块B中,代币1、3和4没有被换手,而代币2被转移到了Alice手中。如果区块D中包含一个由Alice签署的将代币2转移至Bob的交易,则区块D中的代币2会从Alice手中转移至Bob手中。

一个代币从主链转移到Plasma链上之后,如果一方要将这个代币转移给另一方,则需要提供这个代币的完整历史。在上例中,如果Bob想要将代币2转给Carol,那么之前每个区块内的交易情况就会作为条目记录在这个交易内,如果之前发生过所有权变更,需将相关默克尔证明记录在内,反之记为空值。

Plasma链会将所有区块头的快照发送到主链上,Carol可以验证是否所有的默克尔证明都跟之前通过快照发送至主链的哈希值相符,以及每个区块中的所有权变更是否有效。一旦这个交易被打包成区块放到plasma链上,Bob将代币2转给Carol的条目就会记录在默克尔树上,Carol就成了代币2的所有者。

因为Plasma是建立在运营者随时都能串谋作恶的设想上的,所以用户没法做到即时退出,而且需要有一个退出机制。尽管我们上文讨论的架构相对简单,但是退出机制非常复杂。Whiteboard系列视频中有一节是由来自LoomNetwork的GeorgiosKonstantopoulos分享的,深入分析了PlasmaCash的技术细节,介绍了LoomNetwork采用的退出机制,其中还提到了一个例子是,运营者可以通过隐瞒数据从诚实的参与者处窃取代币,或是发起攻击之后,DanRobinson提出了一个较为简单的退出机制,可以解决这个问题,然后又发现通过给区块重新排序可以打破这个机制。

总而言之,Plasma最大的优点是存储在plasma链上的代币安全性很高。无论发生了以下何种情况:plasma运营者创建了一个无效状态转换、plasma运营者发起扣块攻击、plasma运营者彻底停止出块,诚实的参与者都可以确信自己能够取回代币。在上述情况下,或者笼统地说,在任何情况下,代币都不会丢失。

缺点在于,在转移代币之时必须提供该代币的完整历史,另外就是退出机制非常复杂。

想了解更多技术细节的话,可以参见上文提过的LoomNetwork团队人员的分享视频,以及来自Plasma团队的BenJoines的分享视频。其中,Ben谈到了PlasmaCashFlow,这是一个比较复杂的PlasmaCash设计,能够实现任意金额的交易。

RollUp

正如我在讨论侧链时提到的那样,解决侧链的无效状态转换问题的方法之一是提供密码学证明来证明之前每次状态转换都是正确的。最近,MatterLabs就依据这种方法构建了一个叫做RollUp的技术,其构想最初是由BarryWhiteHat在ethresear.ch上提议的。

RollUp实际上是一条侧链,因此它会生成区块,并且将这些区块的快照发送到主链上。不过,RollUp上的运营者是无需信任的。也就是说,RollUp假定运营者可以在任何时候做出停止出块、生成无效块、隐瞒数据等恶意行为。

与一般的侧链相似的是,如果某个区块的快照已经发送至主链,那么RollUp上的运营者只能在这个区块之后发动分叉攻击。因此,一旦某个区块的快照发送到了主链上,这个区块就得到了最终确定,RollUp链上进行过快照的区块也是如此。

为了避免状态有效性问题,每当RollUp运营者要对某个区块进行快照之时,都要提供一个SNARK,证明链已经使用相关的一组交易执行了有效的状态转换。以下图为例:

RollUp链上有三个区块:A、B和C。它们的快照分别对应主链上的区块X、Y和Z。每到一个时间点,主链只需要存储RollUp链上最新状态的默克尔根。在区块A进行快照之时,发送到主链上的交易包括:

新状态S2的默克尔根h(S2)。

S2的完整状态数据,或区块中的所有交易。

一个zk-SNARK,证明在从状态哈希h(S1)到状态哈希h(S2)之间的所有交易都是有效的,并且这些交易都与中提供的数据相匹配。

该交易证实了zk-SNARK是有效的,并在链上存储了新的默克尔根h(S2)。重要的是,该交易虽然不会将A中的完整数据存储在状态中,但是会将其保存在调用数据内,以便日后调用。

事实上,将完整的区块存储在调用数据中的做法在某种程度上是个瓶颈,不过可以解决数据可用性问题。目前,MatterLabs构建的RollUp需要1分钟的时间来计算出一个交易的SNARK,每个交易需要消耗1Kgas,并占用主链上9个字节的调用数据。

在这样的设计下,除了离线之外,运营者不能做其他恶意行为:

不能隐瞒数据,因为对区块进行快照的交易必须提交完整的区块或者完整的状态作为证明,并验证交易内容是正确的,之后交易内容会保存在主网上的调用数据内。

不能生成含有无效状态转换的区块,因为必需提交一个zk-SNARK来证明状态转换的正确性,而无效区块是无法计算出zk-SNARK的。

无法发动分叉攻击,因为分叉选择规则始终认可最新进行过快照的区块所在的那条链,即使这条链不是最长链。

虽然这种Layer2方案没有显著扩大调用数据中的存储空间,但是实际消耗的可写存储量是恒定的,链上验证的gas成本低至1kgas/tx,是主链交易的1/21。

重要的是,假设RollUp上的运营者彼此合作的话,就可以实现即时退出,不会涉及到退出机制。这些特征使得RollUp链成了目前最炙手可热的Layer2方案之一。

结束语

我目前在开发一个名为Near的Layer1分片协议。一个常见的误解是Layer1分片协议与Layer2扩容方案存在竞争关系。实际上并非如此,分片协议的实现不会影响到Layer2扩容方案的使用。

Layer2为特定用例而设计,能够在维持较低成本的同时提供较高的吞吐量,即使是在Layer1区块链的扩展性有了显著提高的情况下。

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

金宝趣谈

[0:0ms0-3:963ms