之前写的一篇关于 Layer 2 的文章,刚好 Nervos talk 论坛有关于 Layer 2 的板块,拿上来和大家分享一下,希望大家喜欢
经历了两年时间,从无到有出现了数十个、上百个不同设计的 Layer 2 项目,而大部分对 Layer 2 的认识仅仅就是“扩容方案”那么可有可无。
为什么公链就是性能那么低?为什么我们觉得分层设计才是未来加密经济的发展方向?到底什么才是 Layer 2 ,现有的方案是什么样的?这些问题,都是我们需要去理解的。希望这篇文章能够帮助你更好地理解 Layer 2。
2016 年 1 月,距离比特币创世区块诞生 7 年之后,一篇名为《The Bitcoin Lightning Network:Scalable Off-Chain Instant Payment》的白皮书发布,这是第二层扩容方案(Layer 2 Scaling Solutions,简称 Layer 2 )的开端;到 2018 年的年末,光是技术类型就已经有状态通道、Plasma、Truebit 等各类 Layer 2 方案,出现了 Celer Network、AlphaWallet、Raiden Network、Alacris 等等一众新星,在时间和资源都极度稀缺的情况下根据自己发现的需求,针对不同的场景给出自己的解决方案,准备迎接未来加密经济应用的爆发。
公链,不能治百病
区块链带来了强大的去中心化应用生态,无数人对它寄以厚望,希望区块链能够打破金融孤岛。2017 年上百个公链项目展开角逐,但到了 2019 年,大规模应用落地仍旧困难:区块链发展受到 Vitalik 提出的不可能三角的瓶颈性限制————也就是区块链系统设计无法同时兼顾可扩展性、去中心化和安全性,三者只取其二。
这个瓶颈是否属实?是否公链的性能真的那么低?以太坊、比特币确实可以将 TPS 做的很大,让每个节点处理更多的交易。甚至有人将它做简单的参数修改,就能作为一个吞吐量非常高的联盟链方案。但这个方案真的非常天真:TPS 提高带来的问题就是,由于带宽的限制,一般的节点甚至连同步数据都难以做到,更别说参与出块,随后小节点就被淘汰。这样损失的是去中心化:公链作为开放的协议,因为性能的需求实际上为大部分节点设置了不可进入的门槛,那如何做到开放?
去中心化只是一个手段,我们需要的实际上是公共可验证:一个没有足够多、足够分散的验证者(也就是节点)的区块链网络是难以构造信任的————这个网络可以少数人轻易被控制,我如何保证我的资产安全?
那么是否能够在保有去中心化和安全性的前提下,去追求更高数量级的吞吐量?
有人尝试新的区块链协议去打破不可能三角:一些团队开始研究 DAG,来取代「区块+链」的数据结构来做到上万甚至更高的 TPS。但是基于看似无序实则有序的图做交易顺序的判断是非常难,交易顺序难判断,如何避免双花?因此很多 DAG 项目引入相对中心化的方案,比如 IOTA 采用一个中心化的 Check Point,ByteBall 采用见证人机制,本质上都不是共识,而是中心化的方式————而这显然不能解决问题。
(如图Byteball 的 DAG 数据结构,在 Byteball 中交易会根据交易距离创世块的距离,再根据一种见证等级进行排序)
是否能够用分片技术,将网络分为不同的片区,处理各自的交易,来将性能十倍、百倍的提升?但实际上,分片技术在计算层面、存储层面、网络层面、共识层面都有问题需要解决,并且不同层面的分片问题联系起来又会有新的问题出现。这些问题解决之后,还有跨片区交易问题,如著名的「Train & Hotel Problem」。
「主要是跨 shard 交易比较复杂」,原来在以太坊 Research 团队研究 Sharding ,现在是 Nervos 首席架构师的 Jan 有一次说到。
这是一个很让人失望的结果,但我们必须知道,一切事物都有自己的边界,我们应该理解,公链不应该做所有的事情,它应该做它该做的事情:
它应是以最高效率达成全球共识的工具,能够以最低的成本来构建信任;但我们不得不承认的是,它可能是最贵、最低效的数据库。
作为共识的工具、信任的引擎,它不该放弃去中心化和安全性对可扩展性做妥协。那如此低的 TPS,该如何利用?
我们是否能够将大量的工作放到链下去解决,仅仅将最重要的数据提交到区块链上,让所有人都能够验证这些工作都是准确可靠的?
社会的发展带来的是更精细的分工,区块链的技术发展也如是——- 分层,本质上就是一种分工。公链不能做所有的事情,那么就让它来做它擅长的东西。由此,也就是第二层扩容方案的思路,我们称为“ Layer 2”,是构建在底层区块链(Layer 1)之上的基础架构,为丰富的区块链应用提供更好的可扩展性、隐私性和可用性。 Layer 1 来保证安全和去中心化,绝对可靠、可信;它能做到全球共识,并作为「加密法院」,通过智能合约设计的规则进行仲裁,以经济激励的形式将信任传递到 Layer 2 上。而 Layer 2 追求极致的性能,它只能做到局部共识,但是能够满足各类商业场景的需求。
Nervos 从一开始就决定做一个支持 Layer 2 的 Layer 1,我们着眼于安全和去中心化,为上层生态传递信任。今天我们能够说,我们预测的、百花齐放的 Layer 2 已经到来。
Why Layer 2 ?
试图用一层区块链方案解决所有问题的人,往往没有思考过一个很重要的问题:公链虽能够达成全球共识,公共可验证,但是否所有的信息都需要让所有人验证、知道?我们之间的日常交易是否需要让全世界的人审核?
如果我不做违法的事情,当然不会介意,但是这显然没有必要。我们只需要将最关键的信息让所有人验证、获取保障就够了。而 Layer 2 恰好就能满足这样的需求:我们将大量工作放到链下(Off Chain),仅将最重要的内容提交 Layer 1 链上(On Chain)进行验证,并且 Layer 1 能够保证 Layer 2 的安全。
因此,我们提出最核心的两个观点:
-
不是所有的东西都需要全球共识
-
公链就该做它应该做的事情,其他的事情完全可以链下完成
那什么样的方案能够被称为 Layer 2 ?
-
首先,应用的主要工作都是在链下;
-
其次,仅用 Layer 1 作为安全的锚点,保证链下环境的安全;
-
最后,和 Layer 1 尽量保有同样的风险模型(很遗憾,跨链和侧链方案并不符合这一条,因为它们将资产在一条链上锁定在另一条链上释放,资产进入了另一个安全性完全不同的环境)
显然,这里 Layer 1 和 Layer 2 的安全等级是不一样的:
Layer 1 的安全性是由去中心化(Decentralized)保证,这意味一组无中心的节点取代了可信第三方的角色。在这里:1.被接受的交易就会按照规定执行;2.交易次序是确定的;3.双花是禁止的。
但是 Layer 2 的安全等级远小于此,它的安全性需要通过 Layer 1 来保证,因此只需要达到「去信任」(Trustless):不保证交易在 Layer 2 上一定能够执行,但是能够保证若交易不被执行能够有一种方式让资产安全地从 Layer 2 撤回。
在下面的内容里,我们就为大家一一解释不同的 Layer 2 方案:状态通道、Plasma 和链下计算。
状态通道(State Channel)
我们常会面临的一个场景是,我们会和某一个人或者某几个人反复交互。比如家门口的咖啡厅,每天都去喝一杯咖啡并且用比特币支付,但是每次交易手续费就高的可怕,于是可以用支付通道技术,双方客户端之间建立一条通道,之后交易都在通道内部进行,最后到比特币区块链上做结算,如此只有在通道关闭和打开的时候需要手续费,这是第一个状态通道技术: Lightning Network 最初设计的场景。
本质上,状态通道是一个智能合约机制:区块链上的智能合约就像一个机器人,双方在通道中运行应用,最后将结果提交到机器人手里它会按照规则进行结算。
在状态通道中运行应用,会有如下的步骤:
-
参与状态通道的各方在区块链上部署智能合约,这个合约包含一个多重签名合约(仅在有各个参与方签名的情况下才能解锁),并存入一定的资金,一部分作为初始状态,一部分作为资产抵押防止作恶,通道开启。之后所有的行为都会在链下执行直到通道关闭。
-
应用会在各方客户端本地运行,每运行一步,双方在本地构建交易并签名,通过点对点网络或者简单的八卦协议的方式将交易发送给其他参与方并得到各方签名形成新的状态。新的状态更新包含:各方的最新状态(一般是状态的 Hash),各方的签名以及该状态的版本序号。同时各方保存运行过程中的每一次状态和签名。
-
应用结束,一方提交最终状态到区块链上的智能合约,并有一段时间的争议期。各方认为没有问题,争议期之后状态确认,状态通道关闭并根据最终状态在区块链上进行资产的结算。
原本在区块链中需要确认的「每一步」,变为只需要确认「结果」。
需要注意的是,状态通道中并没有一个第三方运行节点,接受交易、打包出块来提供服务。应用在本地执行,状态更新通过点对点网络传播,不需要共识机制,非常高效。
于是状态通道会有非常多的优势,首先就是即时确定性(Instant finality),只要各方签名通过状态更新,状态就被“确认”,而不需要如区块链上等待区块确认;其次,状态更新在链下,点对点通信能够保证隐私,仅最终状态会提交到区块链上;最后是低手续费,状态通道是事务性的,只在通道打开和关闭的时候需要区块链上结算清算的手续费,而其他时间,不管双方在通道内如何更新都是免费的。
那么状态通道是否安全呢?状态通道的安全性是由区块链上的智能合约来保证的。很可能出现的两类攻击模型:
- 状态通道中有一个非常乐观的前提,那就是用户保持在线,确保状态的更新。若用户掉线,参与通道的另一方能够通过提交旧的、对自己有利的状态到区块链上结算进行攻击。争议期的设计就是为了防止这个情况发生:在争议期内,用户可以提交最新的状态。由于每一次状态更新都有各方签名并带有版本序号,因此只要提交最新版本序号的状态到区块链上就能够证明提交旧状态的作恶,并将惩罚作恶者。
如果用户在争议期无法上线呢?不同项目给出了不同方案,如 Lightning Network 中的 Watch Tower 和 PISA 中的 Custodians,这些角色有经济激励来揭发提交错误状态的攻击者;Celer Network 的状态守护者网络帮助用户在下线的时候提交新的状态。
- 若出现一方不合作的情况,比如他输了游戏,不对自己认输的状态签名。这时另一方能够将状态的证明提交到区块链上,区块链将整个过程重新运行,得到结果。如果的确出现作恶的情况,作恶的一方会受到惩罚并承担应用在区块链上运行的成本。
此外在状态通道中还有很多的概念,如支付通道、广义状态通道等。
支付通道是最简单的状态通道,它的状态就是数字————在这个时刻,各方手里有多少 token。而状态通道中的状态更加丰富,可以是如 Celer Network 的五子棋游戏中双方下棋的落子情况,也可以是海战游戏中各方战舰的受损情况……
而广义状态通道是另一个概念。一般情况下,一个状态通道只能处理一类应用,因为在区块链上的智能合约只能处理某一类应用的执行和验证。在广义状态通道中制定了一系列的“标准”(如图其实是合约的功能 functions),在该标准下的应用能够在由同一个状态通道合约执行,由此广义状态通道能够允许用户在不关闭通道的情况下运行多种应用。举例来说,你可以在广义状态通道中先运行五子棋游戏,之后进行支付,然后打一轮扑克牌。其中运行的应用的状态更新都基于同一个标准,在区块链上的合约都能够处理。
(图中 V1、V2、V3 分别是不同的通道,但是在链上只需一个合约)
状态通道技术给了我们一个非常美好的愿景,它牺牲流动性(在合约中抵押资产)来换取无手续费和即时确定性,但是它仅仅适用于计算量很小、并且各方需要来回交互的应用,并且由于状态通道每一步都需要用户一致同意,就需要在通道开启的时候明确各位参与者,并且中途难以加入/退出,这让状态通道仅仅能够成为链下交易的扩容。
在采访 IC 3成员、伦敦皇家学院副教授 Patrick McCorry 的时候,我问他:
你觉得状态通道的第一个杀手级应用会出现在哪里?
“I would say Payment.“
“I don’t really see state channels as a scaling solution per se, but as a technique to run existing smart contracts/apps for free.
They won’t work for a whole host of applications, but they’ll truly excel for where they do work.”
我觉得是支付。我并不认为状态通道本质上是一个扩容方案,它仅仅是能够免费运行现有合约、应用的技术而已。它并不能为所有应用起作用,但是对于它能做的方面它会非常出色。
Plasma
提到 Plasma 首先要提到侧链的概念。侧链(Sidechain)是非常有效的扩容方案,但是侧链的问题在于,我们将资产映射到侧链之后,在侧链上运行交易我们需要信任侧链的验证者(Validator 也就是出块节点)————一旦侧链上节点作恶,我们将没有办法保护资产的安全性。因此严格来说,侧链并不是一种 Layer 2 方案,因为它的安全性并不是由 Layer 1 保障的。
那么能否将侧链 “Layer 2 化”呢?
回到我们之前定义的 Layer 2 的安全等级:去信任(Trustless)————我们不能保证交易在 Layer 2 上一定能够执行,但是能够保证若交易不被执行能够有一种方式让资产安全地从 Layer 2 撤回。
侧链 + 资产能够安全撤回的机制 = Plasma
2017 年 8 月发布的 Plasma 白皮书,由 Vitalik 和 Lightning Network 的 Joseph Poon 发表。
Plasma 是一系列在根链(Root Chain,在 Plasma 最初设计中它是一个树状结构,因此将 Layer 1 称为根链比较形象)上运行的智能合约,并且区别于状态通道,Plasma Chain 中能够运行智能合约————如果说状态通道是对交易吞吐量的扩容,那么它是对计算能力的扩容。
在链下会有验证者运行一条 Plasma 链,用户可以将自己的资产锁定在根链的合约中映射到 Plasma 链上得到更好的用户体验。根链上的合约要求 Plasma 链将每一个区块的 Merkle Root 提交到根链上作为“欺诈证明”(Fraud Proof),只有提交证明的 Plasma 区块才是被确认的。所有 Plasma 上的用户能够用自己保存的 Merkle Proof 来验证这个 Merkle Root 保证子链运行的安全性,必要的时候可以通过向合约证明自己的资产来快速退出。Plasma 链能够发行自己的代币,以此激励这条链的验证者保证它的运行,一旦出现仲裁并被证明作恶,Plasma 链验证者在根链合约中的保证金会被扣除。
根链上的合约就像机器人:它要求 Plasma 提交每个区块的证明(Merkle Root 的形式),并且在用户提交自己的资产证明的时候能够运行起来帮助用户将资产从 Plasma 中撤回根链。
最初的 Plasma 设计是树状的、链中链的结构,在根链上建立合约运行开设 Plasma 链,在 Plasma 链之上还能通过智能合约的形式建立新的 Plasma 链,此时在根链上开设的 Plasma 链称为父链(Parent Blockchain),其上的 Plasma 链称为子链(Child Blockchain),能够有更好的性能但是安全性会更弱。Plasma 这样的设计非常像现实中的法院:如果说根链(也就是公链)是最高法院,那么 Parent Blockchain 就像是省级法院,Child Blockchain 是地方法院一样,来保障基于这条区块链开设的 Plasma 区块链的安全性。欺诈证明从子链向下递交最后到根链上。
(Plasma 的树状结构)
用户需要从 Plasma 撤回资产,提交相关证明到上一层(根链/父链)的合约中进行请求,之后会有一段时间的争议期,主要争议两个内容:1、是否该笔资产已经被花费或者撤回;2、是否该证明是来自最新的状态,而不是旧的状态。争议期之后,资产会根据 UTXO/account (具体关系到 Plasma 实现的时候资产的表达形式)的新旧,优先从旧的开始撤回。
这是最初版本的 Plasma 设计,链中链的树状结构是非常抽象的,并且实现非常复杂,于是很快 Vitalik 提出了 Minimal Viable Plasma,也就是 Plasma MVP,MVP 的设计初衷是用简单的机制设计来提供 Plasma 设计中的基本安全特性。因此在 Plasma MVP 的设计中并不是“链中链”的形式而是一位验证者运营一条链的形式,每次产生区块都是在数据库中加入一组数据,并且将 Merkle Root 提交到根链(提交之后 Plasma MVP 区块才是确认)。在 Plasma MVP 中资产用 UTXO 的形式表达,并且它不能运行智能合约,仅仅作为资产交易,并且 TPS 在数千左右(预计 3000-5000)。
在资产安全性方面,Plasma MVP 设计了如下的资产撤回方案。在 MVP 中每一个 UTXO 根据区块号、区块内交易号和交易内输出号都有一个优先级,越是旧的 UTXO(说明长时间没有人对这个 UTXO 进行操作)会优先退出。此时若有人能够在资产撤回的争议期证明这个 UTXO 在之后的交易中被改变,该次撤回会被证伪。
另一个设计是 Plasma Cash,在 Plasma Cash 中每一个 token 有自己对应的一个 id,就好像 Non-fungiabe token 一样,交易保存在稀疏默克尔树中,每一个叶子就是对应一个 token,每一个区块都是一“棵”树,若本区块中某个 token没有转移,那么用空值表示。由此,用户只需要追踪属于自己 token ,证明交易变得非常迅速;并且,作恶者需要一个个窃取 token,作恶成本高,更加安全。
可以看到,虽然一开始 Plasma 设计是为了以太坊计算能力的扩容,但是目前实现的方案仅仅涉及到资产的转移:仅仅是很简单的 UTXO(如 Plasma MVP) 或者 NFT(如 Plasma Cash),却并不能运行智能合约,不能如 Vitalik 最早想做的那样:为以太坊做计算能力的扩容。
这里确实是遇到了瓶颈性问题,主要在于:为什么资产从 Plasma 上退出那么难?
如果在 Plasma 上构建智能合约,如 ERC 20 的资产。实际上资产并不是在用户的账户里,token 的状态是存储在合约中的,通过指针的形式指向账户,用户才能在钱包里看到自己 ERC 20 的资产。每次 ERC 20 token 的转账实际上是调用相关合约改变合约里 token 存储的状态。
那在 Plasma 中,一个合约中包含所有用户的资产,这些资产是否能一起退出?谁有权利让所有人资产一起退出?
每个人都是能够修改合约的整体状态,那么如何保证撤回时的争议期其他人修改状态,然后提交新的状态证明驳回这次撤回?
并且,合约运行完全在 Plasma 上,主链如何确认结果是正确的?(在以太坊上,这里涉及到 EVM in EVM 的问题,在以太坊虚拟机上验证 Plasma 上的 EVM 状态非常困难),目前可能还没有很好的方案。
Plasma 和 State channel 的区别
状态通道(State Channel) 和 Plasma 的最大区别在于,状态通道中没有第三方验证者的角色,它的状态更新是基于各方达成一致共识的前提下的,而 Plasma 中则有验证者的角色。在状态通道中一旦各方同意签名状态就能立即确认,在区块链的基础设施中仅状态通道能够做到即时确定性。Plasma 中用户还是需要等待区块确认(验证者需要提交 Merkle Root 到根链)才能确保自己交易的安全性。
链下计算
交易能够在 Plasma 和状态通道中快速运作,但是还有一类问题困扰以太坊,那就是大量的计算。在以太坊中设置了 800 万 Gas Limit,并以以太币作为度量,就是对「计算」这个稀缺资源的限制,运行合约进行计算价格十分高昂并且有区块大小的限制。Plasma 中也存在一样的问题。
那能否将计算任务放到链下处理并且保证安全性?
Truebit 和 TEE(Trust Execution Environment,可信执行环境)就是为解决链下计算问题出现的。
要注意的是,链下计算并不提高吞吐量,仅仅是将复杂任务放到链下处理,再将结果返回到链上。
Truebit 也是链上的智能合约,它的运行逻辑本质上是一种计算外包,用经济激励的形式来保证计算的安全。用户向服务提供者描述计算任务,并约定给予奖励,服务提供者将运算结果交给用户来提交到主链的合约作为结果。网络中会有很多挑战者,他们会检查服务提供者的结果,若发现问题,则做进一步对比,将不一致的代码行放到区块链上的智能合约上进行验证,验证成功能够有经济激励。这就是 Truebit 提出的“验证游戏”。
TEE 可信执行环境一般是硬件设备,可以处理交易的验证,如 ARM 生产的、处理指纹的 TrustZone,Intel 的 SGX。银行卡的芯片就是在 TEE 中运行。TEE 的硬件就是一种黑盒子,计算(一般是安全性要求比较高的计算)会在黑盒子里运行,然后返回结果,没人能够知道如何运行但是能够知道结果是正确的,它能够非常好的保护隐私。
但是它的安全性也非常明显,计算会引入不可预知的风险,并且安全性依赖于制造的厂商:如果一个黑盒子被攻破,那么所有同批次生产的都能够被攻破。
总结
在整个市场进入寒冬的 2018 年,我们反而看到了无数 Layer 2 团队开始出现,特别是状态通道,已经出现了数十个团队,针对不同场景、不同需求给出自己的解决方案。
(图片来自 CoinFund)
而 Plasma 也出现不同的解决方案,在 Ethresearch 上我们能够看到一张 Plasma 的“世界版图”:
(图片来自 Ethresearch)
链下计算,除了 Truebit 以外,Oasis Labs、TEEX、Stark、Transmute 等一众团队展开研究。
的确,如果一个由 Layer 1 保证去中心化和安全的智能合约来设定规则,一个 32 字节的 Merkle Root 哈希值或是最终状态的提交就能保证资产的安全,为什么所有应用要直接放在操作昂贵、资源稀缺的公链上?
Layer 1 保障安全性和去中心化,Layer 2 来满足性能的需求,Layer 1 为 Layer 2 传递信任,这是未来加密经济的基础设施。
从 2017 年的混乱,到 2018 下半年的冷清,分层设计的项目不断出现,Ethereum 也在周报中将 Layer 1 和 Layer 2 分开呈现,这几乎已经是被业界广泛认可的技术方向,终于,我们在混沌中找到了方向。
(如果你对更多的 Layer 2 方案感兴趣, Github 上有一个 Awesome Layer 2 的库,里面有非常多的资料,链接:https://github.com/Awesome-Layer-2/Awesome-Layer-2)
作者:Ryan,Community manager at Nervos Network
关于 Nervos Network:Nervos Network 是一个专门为 Layer 2 打造的 Layer 1 底层公链,致力于为未来加密经济构建基础设施。
参考:
[1]公众号:Nervos Network
[2]Josh Stark:Making sense of Layer 2
[3]Plasma:Scalable Autonomous Smart Contracts
[4]Counterfactual:Generalized State Channels
[5]CelerNetwork - Whitepaper
[6]The state of state channel:2018 edition
[7]Plasma World Map - the hitchhiker’s guide to the plasma