技术沙龙第十一期-联盟链中的Rollup方案

区块链扩容方案

区块链自诞生一来,一直受性能问题困扰。

因为区块链跟传统的分布式系统(比如分布式数据库)有一个很大的不同,就是每个节点都是副本,要同步所有的数据并执行同样的处理,而传统的分布式数据库一般是三副本。这就导致分布式数据库增加节点可以提升性能,而区块链增加节点,不但不能提升性能,反而会降低性能(通信量变大)。

横向扩展不行,那还有纵向扩展,即提升节点的硬件配置。

可惜这一条路也被堵死了,因为在区块链里,去中心化是绝对的政治正确,提升节点的硬件要求,会把一部分人挡在外面,导致链更中心化了。

大区块方案其实就是间接的纵向扩展。因为区块扩大了,能打包的交易多了,但是出块间隔不变。加(工作)量不加价,对打工人的要求当然就更高了。

所谓开源节流,既然开源这边横竖都不行,自然只能节流了。怎么节流?把一部分工作推出去,担子轻省了,自然跑得就快了。

状态通道就是最早的这一类方案,类似的还有闪电网络,雷电网络等等,原理都差不多。

因为早期区块链(就是比特币)只有转账操作,这些方案也基本上只支持转账操作,所以也叫支付通道。

打个比方,比如5个同事去饭店聚餐,总共消费200元,AA一下每个人40。如果每个人都直接给老板支付40,加上找零什么的,老板一下就忙不过来了。有没有更省事的办法呢?老板说你们5个人先把200凑出来,没有零钱,相互找零都内部搞定,完了再一起给我。

这里老板就相当于区块链,5个人内部相互支付就是支付通道。

状态通道的缺点:

  1. 人不好凑。几个人是同事还好,几个陌生人就不能这么搞了。
  2. 相比而言资金还是有风险的。你给了同事50,同事要找你10,但是现在没零钱,说回头给你,结果回头就忘记了。但是老板是不敢这么做的,吃饭多收钱店都开不下去了。

接下来是侧链方案,有点类似于影分身,一个人工作压力山大,多召唤几个分身一起分担。这个方案跟状态通道不一样,这个是直接把整个链都搞了多套,说白了就是多链方案。

这类方案的问题是,工作倒是分担了,扯皮也跟着多了起来。山头林立,到底听谁的?

分片,Plasma都属于这一类的变种,为了弥补其缺点各种打补丁,搞得方案巨复杂,这里就不详述了。

终于,本文的主角Rollup出现了。

跟前面的横向扩展,纵向扩展类似。多链可以认为是横向扩展,而Rollup则是纵向扩展。所以Rollup被称为layer 2(两层)方案。

1
其实一般侧链,Plasma等也会被划入layer 2方案。但是我觉得它们的区别还是挺明显的,所以这里我并没有按照惯用的说法,请大家注意。

前面大家折腾了很久的多链方案之后,终于发现这些漏洞是按下葫芦浮起瓢,怎么都堵不住。专业的说法是,数据可用性和计算正确性无法同时保证。

因为Plasma想把数据和计算都平分到多条链里面,而Rollup则是分工一下,layer 1负责数据可用性,layer 2只负责计算。

Rollup

该方案对链的性能提升来自几个方面:

  1. 聚合器收集用户交易,然后批量打包发送到layer 1上,可以节省gas。在同样的gas limit下,区块可以打包更多的交易。
    • 对交易进行压缩。去除非必要字段,甚至直接数据压缩。
    • calldata的方式将交易发送到链上,这种存储形式的gas消耗更低。
  2. 链外计算,layer 1的负担减轻了。
  3. Arbitrum项目还提出了序列器方案,由中心化系统对交易进行排序,进一步提升系统性能。

当然这里面也是有安全问题的,因此还设置了复杂的挑战机制,通过举报有奖的方式来解决可能出现的欺诈问题。

联盟链中Rollup

然而,对于联盟链来说,Rollup提升性能方面的作用并不重要。

一方面,联盟链的性能压力不大;另外一方面,联盟链里没有gas,方案里那些节省gas的奇技淫巧根本没用。

那么我们为什么要花这么多精力去研究它呢?

因为Rollup方案有一个被忽视的,其实非常重要的作用,就是它提供了区块链进一步解耦的思路:

  1. 用户直接与聚合器进行交互,而不是链。用户接口和相应的数据结构(交易结构)与链解耦。
  2. 合约引擎与链解耦。
    • Layer 1链只提供存证功能,保证原始交易的数据有效性,和对计算结果的存证。
    • 合约部分将跟传统应用开发类似,开发者可以用更灵活的方式开发智能合约。
  3. 序列器提供了去中心化与中心化结合的思路。用户可以根据信任程度走不同的路径,甚至在信任的前提下,数据有效性可以由单一中心化系统保证,更好的与传统系统结合。

然后我们就可以让整个联盟链系统更加贴近应用场景:

  1. 用户接口可以更贴近应用,设计为更适合应用的方式。比如:
    • 数据结构可以针对特定应用优化。
    • 验证方式不一定使用数字签名,可以用更传统的用户名/密码等方式。
  2. 智能合约开发形式更接近传统应用。
    • 使用通用编程语言。
    • 智能合约是一个单独的系统,设计更加灵活。
  3. 实现去中心化和中心化相结合的方式,更加贴近现实场景。
    • 用户信任中心化系统时,可以走中心化系统,作为fast path
    • 用户不信任中心化系统的时候,走去中心化系统作为slow path

当然这里面还有很多技术挑战,比如:

  1. 用通用语言编写智能合约,怎么保证其执行的确定性?
  2. layer 2要证明计算的正确性,就要给出相应的密码学证据,是否有比以太坊基于默克尔树的方案更轻量的方案?
  3. 用户在不同的路径间切换时,如何处理回退等情况,如何让用户体验更好,甚至无感?

对具体方案有兴趣的小伙伴欢迎关注CITA-Cloud中相应的RFC,也欢迎大家一起来探讨相关的话题。

区块链的抽象

引入Rollup的思路之后,联盟链从抽象角度会变得更像可信计算和存证的结合。

这里的calleradd_server就是很传统的可信计算的关系。

可信计算已经发展出了非常多的先进技术,比如零知识证明之类。但是欺诈者足够无耻的话,你总是拿他没办法,而区块链可以以仲裁者的角色,填补上这个漏洞。