在以太坊生态系统中存在一个互操作性不可能三角。互操作协议只能拥有以下三种特性中的两种:
1.无需信任:拥有与底层域相同的安全性;
2.可扩展性:任何域都可以支持;
3.信息通用性 : 能够处理任意的跨域数据。
由于以太坊不可能三角,使方案主要分为链上扩容和链外扩容两类:
· 是对以太坊区块本身进行改造,姑且称之为Layer1方案,这里的主要解决方案是分片。
· 是改变我们使用以太坊的方式,将交易的执行和处理放在链下,以太坊本身只用来校验其交易有效性,提供安全性。这就是我们经常听到的Layer2。
上半年,Vitalik发表了一篇题为《Why sharding is great: demystifying the technical properties》(译为:为什么分片棒棒哒:解开技术属性的神秘面纱)。文中提到:“分片是以太坊可扩展性的未来,它将是帮助生态系统每秒支持数千笔交易并允许世界上大部分地区以可承受的成本定期使用该平台的关键。”文章通过定义以太坊分片的特定属性,与“流氓分片”划清了界限。 “分片”(Sharding)就是以太坊网络为了解决扩容问题而设计的一种技术方案,另一个技术方案是分层,本文在此不作详解。Sharding通过创建分片(新链)来减少网络拥塞,增加 TPS(Transactions per second),同时减轻验证者的负担,本质是横向分割数据库增加扩展性。 “分片”的大致设计思路是:将区块链网络中的每个区块变为一个子区块链,子区块链中可以容纳若干(目前为 100 个)打包了交易数据的 Collation(大概可以称为“校验块”,为了在分片的情景中将其与区块的概念区分开),这些 Collation 最终组成一个在主链上区块;因为这些 Collation 是整体作为区块存在的,所以其数据必定是全部由某个特定的矿工所打包生成,本质上和现有协议中的区块没有区别,所以不再需要增加额外的网络确认。这样,每个区块的交易容量就大概扩大了 100 倍;而且这种设计还有利于未来的继续扩展。整个扩展计划目前也被大致分为 4 个阶段。 Layer2的核心思想是将大批实际发生的交易放在链下执行和计算,再将其通过以太坊上极少量的交易进行交易最终有效性的验证。无论是State Channel,Plasma还是Rollup,实际上都遵循了这一原则。 现在谈起Layer2,很多人第一反应都是将其与Optimistic/ZK Rollup挂钩,但在这里我们先简单介绍一下状态通道和Plasma,这有助于我们理解为何Rollup最终胜出,成为当前我们谈论最多的Layer2解决方案。 这是一个状态通道最原始的结构,状态通道是一种已经存在很久的区块链扩展方案,其中最出名的应用是比特币的闪电网络。
- 应用场景
状态通道在某些简单场景如流支付中能够发挥很大的作用,其通过在链下对消息签名的方式对交易数据进行记录,将大量在逻辑上发生了的交易简化成了主链上的两笔交易。状态通道因为其成本较低,很适合一些微支付的场景,比如用ETH或者BTC买早餐咖啡等。
- 局限性
状态通道需要资金的发送方和接受方都进入这个通道来,而为了维护状态通道,支持比流支付更复杂的操作,大笔的资金需要被锁定。因此开发者们很快意识到状态通道无法作为可选的扩容方案之一。 二:PlasmaPlasma通常是一条链,它可以拥有与主链不同的共识机制,也可以拥有自己的矿工。但最重要的是Plasma链上会有一个叫做 “Operator” 的角色定期的根据子链上的状态转换,生成一棵默克尔树,并将这棵默克尔树的树根哈希值提交给主链做验证和记录。关于为什么默克尔树和其树根哈希值能够用作状态转换的验证,我们会在同样使用了这一应用的Rollup中讲到。通过这样的方式,无论在两次提交期间,子链上发生了多少笔交易,子链只需要将交易执行造成的状态信息提交到主链上即可。以下是使用Plasma机制的简单示意图:用户想要进入Plasma链需要在以太坊主链上做资产的映射,而当其需要将Plasma链上的资产转移或主链上时,需要经历一段时间的挑战期来供其他人使用欺诈证明机制来确认资产转移的有效性。欺诈证明意味着任何人在这段挑战期(通常是7天或者更久)内,都可以通过默克尔树校验的方式来提交证明用户资产的退出是不合法的。 2:问题但这带来两个问题:(1)想要验证这个提款的正确性需要有节点保存Layer2上的交易和状态信息,因为Plasma只会提交其状态转移的结果,而想要提交欺诈证明必须有Layer2上的信息,这将大大提升 验证者 这一角色的成本。 是所谓的 「 数据不可用」,他的意思是Plasma不会将其链上发生的交易数据发给主链进行存储,主链的节点无法获取到这些交易数据,无法通过主链本身的安全性为其做验证。当然有些解决方案会把这些数据提交到中心化存储或者IPFS上,但这对主链来说没有任何意义,因为用户使用Layer2的基础是信任主链本身的安全性。 三:Rollup我们可以看到Plasma一个很重要的问题是他的 “数据不可用” ,主链只会收到Operator提交的状态转移结果,其只能期待有人存储了链下的的交易和状态信息,通过欺诈证明机制来确保子链的提交真实性,它在这个过程中只承担了确认者的角色,其安全级别是较差的。 1:具体理解“数据不可用” 以太坊将其链上发生的所有数据都公开,所有人都可以查询。但Plasma不会提交这些交易数据到主链上,而只提交执行结果,因此其效率上的提升是很高的,但是这样做的代价是Plasma无法建立和以太坊主链同一级别的信任。 Rollup实际上可以算是原始主链处理方式和Plasma方式的折中,其会将数据提交给主链,但他会最大限度通过聪明的编码方式压缩这些数据,同时基于Rollup本身的特性适当删除和缩减一部分数据,只要保证最终的提交能够供任何人验证即可。 交易数据上链后,任何人都可以根据这个数据来校验Rollup提交的结果是否正确。因此,Rollup的安全性要比Plasma高。 总结一下,Rollup的核心优势是所谓的“数据可用性”,它会将数据提交给主链,这大大加强了安全性。
那么究竟Rollup是如何实现的呢? 2:原理首先Rollup在主链上,拥有一个(或者一系列相互关联的)合约:这个合约用来维护Rollup层中的状态记录,这个状态记录实际上是一棵默克尔树的根节点存储的哈希值,这个哈希值被称为state root。
而这颗默克尔树的叶子节点是Rollup中的账户状态信息。如果你不知道什么是默克尔树,以下是一个简单的例子:可以看到这是一颗二叉树,在二叉树的叶子节点上记录着当前rollup层账户的状态信息。 对于每两个状态信息(例如State 1/State 2),我们可以根据某种哈希公式计算出一个唯一的哈希值(eg: Hash(1,2) )来作为这两个叶子节点的父亲节点,依次一层一层往上类推,最终得到一个哈希值存储在根节点中。 你不需要知道怎样计算哈希值,你只需要记住几件事情。1.任意一个叶子结点的改变都会导致根节点的值变化(任何一个状态的变化都会导致Root hash发生变化)2.如果两棵树的根哈希值相同,那说明他们的叶子结点存储的信息完全一致(因此只需要对比两个根节点哈希值就可以确认底层状态信息的一致性)3.根据根节点的哈希值和指向某一个状态信息的路径,我们可以确认某一个状态信息存在于这颗哈希树中。 Batch通过 state root 我们可以得出一个账户状态的key-value map:其中key是账户地址,value则包含余额/Nonce/合约代码/存储(对于合约账户)等状态信息
当rollup上发生交易的时候,很显然的,这些账户的状态会发生改变,由此产生新的state root。 虽然这样可以非常准确和及时的反馈Rollup上最新的状态变化,但是如果每发生一笔交易就在主链更新一次state root,产生的成本反而会比将这些交易在Layer1上执行更高。 所以为了解决这个问题,rollup中产生的交易将被按批次打包汇总,同时根据这批交易全部执行完成后的状态,会产生一个新的state root。无论是谁将交易打包提交给主链上的智能合约,他都需要计算这个新的state root,并将其和上一个state root以及交易数据一并提交。
这一部分的打包被称为一个”batch”,提交者将batch提交给Rollup contract之后,主链会去验证新的state root是否正确,如果通过验证,则将state root更新为最新提交的state root,并最终完成一次rollup内的状态转移确认。
Rollup的实质以下是一个简化版本的Optimstic Rollup流程,可以看到和Plasma的最大的区别其实在于新增了交易数据的提交:所以,Rollup的实质是将一大笔实际产生的交易汇总成一笔主链上的交易, 这些交易由Rollup链来执行和计算,但会将数据提交给主链,同时由主链扮演一个“最高法院法官”的角色最终确认这些交易。由此我们利用了主链的共识和安全性,同时提升了实际上的交易效率,降低了交易成本。
可见,安全可靠的分片技术是未来区块链技术必然的发展方向。