什么是Rollup?--上篇

rollup顾名思义,就是把一堆交易卷(rollup)起来变成一个rollup交易,所有节点接收到这个rollup交易之后,不去执行被卷起来的逻辑,而只去接受这些逻辑的执行结果

太长不看版(tl;dr)

众所周知,以太坊是个虚拟机。

什么意思呢?

就是比特币中的交易长这样:

“如果小明的签名验证通过,小明转10元钱给小红的地址。”

而以太坊中的交易可能长这样:

“当小明的签名验证通过并且满足blablablabla条件时,将小明账户中的10元钱转到小红的账户上。”

这其中的blablablabla条件,实际上可以是任何逻辑或者任何程序,其中可以有条件判断,可以有循环,这些以太坊都支持。但问题就来了——要是有个不善良的矿工打包了个死循环放在区块里,岂不是能让所有的以太坊节点都死机?

为了防止这种事情发生,以太坊中设置了每个区块的Gas上限以及每个计算步骤所需要消耗的Gas量。

我们可以简单粗暴地把Gas理解成汽油。比如,一个条件判断需要10gas,一个签名验证需要100gas,一个状态读写需要10gas等等……然后,每笔交易都需要注明这笔交易需要使用的Gas(当然,还需要付钱)。比如说,在某笔交易之后,你注明“跑1000个gas的”,于是,以太坊的节点会执行这笔交易,但是当计算需要消耗的Gas超过1000了,不管交易的步骤执行没执行完都会停下来。

于是,死循环不会出现,比如你写了个死循环,但是每次循环会烧10gas,而区块的Gas上限是10000,你于是最多给这个程序买10000的Gas,那么所有节点会执行1000次循环把你给的Gas烧完就停下来,而不会无限循环下去。

640

而这个时候就引出了另一个以太坊和比特币不同的区别:

在比特币中,链上最宝贵的资源是空间——因为一个区块大小是1M,而平均10分钟才能出一个区块。

而在以太坊中,链上最宝贵的资源是Gas,因为每个区块的Gas是有上限的,而平均出块时间也是固定的,于是其实每单位时间能够做的计算步骤是有限的。

于是,当大量的人需要做交易,尤其是很多操作复杂的交易的时候,以太坊就会拥堵。而在当下DeFi交易盛行的时候,以太坊拥堵的问题就变得十分严重以至于开始影响使用了,一笔去中心化交易所的货币兑换交易的交易费在拥堵时可能会超过100美元,这无疑会让很多用户望而却步。

rollup顾名思义,就是把一堆交易卷(rollup)起来变成一个rollup交易,所有节点接收到这个rollup交易之后,不去执行被卷起来的逻辑,而只去接受这些逻辑的执行结果。因此这个rollup交易所需要的Gas会远小于执行这些交易的Gas。

通过这种把交易卷起来的方法,一个区块中就能装下更多的交易了,而TPS也就上去了。

但自然而然的,虽然扩容的目的达到了,但是这些卷起来的交易需要怎么执行呢?这些卷起来的交易和这些交易之后变更的状态(比如账户信息)都会被挪到链下的一个账本上,这个账本由一些专门的节点负责验证和维护,并定期将这个账本的状态做个摘要发到以太坊上。

简而言之,如果采用了rollup之后,就像是现在你看到的这篇文章的这个“太长不看”的段落一样,以太坊里会有一些专门的节点负责去给所有交易做计算,然后,把这些交易打包起来生成一个“太贵不用算”的摘要,告诉所有节点“这些是我们算完之后给你总结出来的结论,你们照着做就是了”

采用了rollup之后,区块大概会变成下图这个样子。原本需要很多Gas的交易现在只需要1000gas了,于是这个区块中就可以继续装更多的交易了。

640-2

rollup主要分成optimistic rollup和zk-rollup,两者在rollup的方法和原理上都十分不同,这点我们后面再详细讲。

Rollup是怎么来的

那么,大家已经知道rollup是什么了,但rollup具体是怎么实现的呢,这个要是真想讲明白,就不得不讲点历史小故事:这里我们就来说说rollup这种方法是怎么来的,以及为什么之前某个更简单的叫做plasma的方案失败了。

比特币与闪电网络

Plasma的关系实际上是比特币的闪电网络在以太坊里的映射。换句话说,以太坊想按照闪电网络的原理在以太坊上做一个链下技术,但是没做出来。

那我们先说说闪电网络是什么原理。

比特币闪电网络的基本原理类似储值卡:

  1. 交易双方,小明和小红,各锁定一笔钱,比如1000块在链上。然后,每个人手里都握有一个延时退款凭证,这个凭证的作用是“凭提交此证上链可以在两星期之后从链上拿回1000块钱”。
  2. 双方在链下进行交易,而这个交易的本质是更新双方的凭证。例如,小明给了小红100块,这笔交易的实质是小明的凭证变成“凭提交此证上链可以在两星期之后从链上拿回900块钱”,而小红的凭证变成“凭提交此证上链可以在两星期之后从链上拿回1100块钱”。
  3. 于是问题就来了——如果小明付完钱之后赖账怎么办?也就是说,小明如果还拿着“凭提交此证上链可以在两星期之后从链上拿回1000块钱”的旧凭证上链提款怎么办?所以说,其实双方在交易的时候,除了更新延时退款凭证之外,还要互相交换一个违约退款凭证,即:“如果链上对方发了失效的退款凭证,那么我可以凭借此违约凭证即时退回我的钱以及拿走对方的押金。
  4. 于是,双方的在1000块以内的交易就都可以被挪到链下,在交易双方之间安全进行,只要两个人都保持定期监测链上动态,看看对方有没有发起恶意的延时退款就行。

以太坊与Plasma

那么,这个方法能不能用于以太坊呢?

从逻辑上来讲是没问题的,但是操作起来的时候,由于以太坊和比特币在形式上的区别,以太坊的链下方案,即Plasma,它的样子和闪电网络非常不一样——

在闪电网络中:

  1. 交易双方在链上抵押押金。
  2. 双方的所有交易都在链下,仅需要被交易双方验证和记录。
  3. 一方想要退出,则将链下当下的“状态”提交到链上,等待一段时间才可拿回押金;在这段时间内,另一方可以提出异议并提交“欺诈证明”,来证明对方提交的状态并非最新状态并且拿走对方抵押的押金。

以上这种,被称为私人状态通道。

然而,由于以太坊是个虚拟机,你的账户状态有可能被任何节点调用,所以链下的交易就不仅仅是一条条“通道”了,而是一个“网络”,里面记录了所有节点的状态,并且每笔交易都会影响链下的这个“网络”的状态。而这个网络,任何普通的用户肯定是没有办法处理这么多交易并且随时更新状态。

于是,Plasma采用的逻辑是:

  1. 专门的验证节点在链上抵押押金。
  2. 验证节点负责验证和记录所有的交易。
  3. 任何人想要将自己的钱从链下转到链上,需要某个验证节点将链下的状态提交到链上,并等待一段时间;在这段时间内,任何其他节点都可以提出异议并提交“欺诈证明”,来证明该验证节点提交的状态并非最新状态并且拿走部分该节点抵押的押金。

但这时,在第三步就有了几个比较麻烦的问题——

在闪电网络中,交易双方都会盯着自己的链下交易状态,因为那相当于自己的钱包。如果对方试图退款时发布的状态和链下的最新状态不符,那都相当于从你钱包里偷钱,正常人都能做出相应的回应。

但在Plasma里,链下交易是个大网络,你光盯着自己的钱包没有用,因为你的钱会记录在一个巨大的数据库里。于是,一般用户没有能力随时盯着所有交易和状态的变化,就只能交给专业的验证者。尽管在理想的状态下,所有的链下状态也该是公开的,任何节点都可以自己维护一份,并且,如果发现了验证节点的作恶行为也可以反制并拿走作恶节点的押金。但这只是个美好的幻想,经济学告诉我们——没有稳定回报的机制是无法长期运行的。链下的交易数量庞大,而如果你不是验证节点,光靠监督其他验证节点指望着他们作恶来你来拿走押金这种激励是不现实的。

于是,令人担心的问题是——如果某一天如果Plasma所有的验证者都删库跑路了,谁那还能从哪找到这些状态呢?于是这些在链下的资金就永远无法被解锁了,这是第一个问题。

640-3

第二个问题是,在比特币里,双方交易的时候,每次交易会交换这个欺诈证明作为交易完成的标志。但在Plasma里,链下的任何交易都会改变这个“二层网络”全局的状态,不可能每次有交易都发给所有用户一个“欺诈证明”,那样太没效率了。于是,就只能是当验证者出现欺诈行为的时候,再去根据现在的链下状态生成一个“欺诈证明”。

打个比方:小明给了小红100块钱,在闪电网络里,小明其实每次给小红的都不是钱,而是一个“你凭借此条可以从链上我的押金里取走我的100块钱,但如果我试图赖账,你可以凭借此条从链上取走我的所有押金”的一个凭证。但在Plasma里,没法在每次状态变更的时候给所有人生成并且发放这个凭证,于是,如果小明伙同一个验证者试图赖账,小红得去链上申辩“你看小明公布的状态是这个时候的,但现在的状态是这样的”。

于是这个时候,大家要信谁的呢?小红就需要在链上再提供小明公布的状态到小红公布的状态的一个完整过程,也就是这期间发生的所有状态变化,也就是交易,来证明小明收买的那个验证者公布的状态确实不是最新的。而这就相当于又把这些链下的交易放回了链上,这就失去了链下技术的意义而且带来了安全风险——如果交易太多以至于根本来不及在申诉期发完,那么小红的钱就永远追不回来了。

Optimistic Rollup

于是,我们有了Plasma的一个升级方案,或者说是折中方案,叫做Optimistic Rollup(OR):

  • 以太坊:所有交易和状态都记录在链上。
  • Plasma:所有交易和状态都记录在链下。
  • OR:所有交易和一批交易处理之后的最终状态的摘要记录在链上,但交易的计算和具体状态变更放在链下进行。

相比于Plasma,OR解决了Plasma的两个最致命的问题:

首先,由于所有交易其实都被完整的记录在链上,只不过大家不去验证了而已。因此,Plasma的数据可用性问题就不存在了,因为即便原来的验证者跑路了,任何人都可以根据记录在链上的记录去验证一遍来成为新的验证者。此外,之前那种可能相当繁琐的申诉过程也不存在了,因为如果有人伙同验证者作恶,那么他们必然导致某批次交易之后的状态信息(比如账户信息)和这些交易本身对不上。而由于状态信息的摘要和交易都在链上,申诉方可以很方便地通过状态变更的摘要信息指出两者的不一致。

但这种这种方案自然是有代价的:原本,闪电网络或者Plasma这样的链下技术可以说是“无限扩展”的——比如说,闪电网络两个人的状态通道里可以发生10000笔交易,只要额度都比押金少,在链上始终都只有两笔交易,就是双方抵押押金开启状态通道的那笔,但在OR里,链上记录的交易仍旧是10000笔,一笔都没少。

用更科学的话说,不考虑申诉的情况,闪电网络里n笔交易对于链上资源的占用是O(1),也就是创建了通道或者说资产挪到二层网络之后后,二层网络里不管有多少笔交易都不会占用链下资源。而对于OR,链上资源的占用是O(n),从数量级上是没有提升的。也就是说,原本10000笔交易占用10000份的资源,现在10000笔交易还是占用10000份的资源。

于是,有人大概会问了——原来是这,那叫什么扩容呢?

原因在于,以太坊现在最大的瓶颈是Gas,而OR省了Gas。虽然仍旧占用10000份资源,但原本,一笔交易中可能需要涉及到若干计算,消耗大量的Gas,但如果采用了OR,虽然仍是10000份,但是每笔交易都仅仅储存在链上一个只读的部分,消耗的Gas是原来一笔交易的几十或者100分之一。

这样,虽然达不到“无限扩展”,但是,在最理想的状况下,也能将输出提高几十到200倍,而在现阶段,这相当于以太坊的速效救心丸——从长远的角度看,无疑“分片”带来的吞吐量提升更诱人,但是在现在,OR带来的性能提升是以太坊更急需的东西。

为什么有这么多Optimistic rollup?

OR的基本原理我们已经讲完了,那么现在圈子里那么多OR的项目都是在干啥呢?

实际上原理都是上面这个原理,但是做法上其实有很多可以权衡的地方,比如:

所有状态的摘要是一个区块传一个呢?还是一笔交易就传一个呢?还是在侧链上根据应用不同,把全局状态分个类,然后一个区块传几个呢?摘要传得多,平时占用的链上资源就多,但提交欺诈证据是申诉时所占用的资源就少,同时,如果有摘要出了问题,需要回滚的交易也越少。

同时,申诉也分两种,有的提交证据的时候是一次性的,有的提交证据的时候是交互式的。通常,前者证据的大小会更大一些,后者证据的总体大小小,但是申诉人得等官方上班(找个在线的以太坊矿工)。

于是,选择哪种方法,就取决于每个OR的项目采用的技术路线,以及他们对于申述的看法,也就是觉得这些验证节点是很不可能作恶呢,还是有作恶的可能;而这点怎么判断的,这又取决于这些节点的选取——他们是以太坊矿工中公开选取出来的,还是主要来自于某些专注某些应用(比如DeFi)的机构呢?

1_oVfQL3YniEKpZTmItcvPig

(图片引自Daniel Goldman的medium文章The State of Optimistic Rollup,https://medium.com/molochdao/the-state-of-optimistic-rollup-8ade537a2d0f

除了Optimistic rollup,下篇我们来聊聊另外一种rollup方案--zk-rollup。OR和ZR哪个更好?Rollup和分片哪个更好?想了解记得关注,我们下篇见。

加入Colacoder,和区块链资深研究者和开发人员,一起用通俗的语言,聊一聊圈内热点话题背后的技术和逻辑,欢迎投稿!

图片

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

  • 发表于 2021-04-19 09:19
  • 阅读 ( 2259 )
  • 学分 ( 20 )
  • 分类:Rollups

0 条评论

请先 登录 后评论
maxdeath
maxdeath

上海唯链科技信息科技有限公司 高级区块链研究顾问

40 篇文章, 1142 学分