技术沙龙第十一期-联盟链中的Rollup方案
区块链扩容方案
区块链自诞生一来,一直受性能问题困扰。
因为区块链跟传统的分布式系统(比如分布式数据库)有一个很大的不同,就是每个节点都是副本,要同步所有的数据并执行同样的处理,而传统的分布式数据库一般是三副本。这就导致分布式数据库增加节点可以提升性能,而区块链增加节点,不但不能提升性能,反而会降低性能(通信量变大)。
横向扩展不行,那还有纵向扩展,即提升节点的硬件配置。
可惜这一条路也被堵死了,因为在区块链里,去中心化是绝对的政治正确,提升节点的硬件要求,会把一部分人挡在外面,导致链更中心化了。
大区块方案其实就是间接的纵向扩展。因为区块扩大了,能打包的交易多了,但是出块间隔不变。加(工作)量不加价,对打工人的要求当然就更高了。
所谓开源节流,既然开源这边横竖都不行,自然只能节流了。怎么节流?把一部分工作推出去,担子轻省了,自然跑得就快了。
状态通道就是最早的这一类方案,类似的还有闪电网络,雷电网络等等,原理都差不多。
因为早期区块链(就是比特币)只有转账操作,这些方案也基本上只支持转账操作,所以也叫支付通道。
打个比方,比如5个同事去饭店聚餐,总共消费200元,AA一下每个人40。如果每个人都直接给老板支付40,加上找零什么的,老板一下就忙不过来了。有没有更省事的办法呢?老板说你们5个人先把200凑出来,没有零钱,相互找零都内部搞定,完了再一起给我。
这里老板就相当于区块链,5个人内部相互支付就是支付通道。
状态通道的缺点:
- 人不好凑。几个人是同事还好,几个陌生人就不能这么搞了。
- 相比而言资金还是有风险的。你给了同事50,同事要找你10,但是现在没零钱,说回头给你,结果回头就忘记了。但是老板是不敢这么做的,吃饭多收钱店都开不下去了。
接下来是侧链方案,有点类似于影分身,一个人工作压力山大,多召唤几个分身一起分担。这个方案跟状态通道不一样,这个是直接把整个链都搞了多套,说白了就是多链方案。
这类方案的问题是,工作倒是分担了,扯皮也跟着多了起来。山头林立,到底听谁的?
分片,Plasma
都属于这一类的变种,为了弥补其缺点各种打补丁,搞得方案巨复杂,这里就不详述了。
终于,本文的主角Rollup
出现了。
跟前面的横向扩展,纵向扩展类似。多链可以认为是横向扩展,而Rollup
则是纵向扩展。所以Rollup
被称为layer 2
(两层)方案。
1 | 其实一般侧链,Plasma等也会被划入layer 2方案。但是我觉得它们的区别还是挺明显的,所以这里我并没有按照惯用的说法,请大家注意。 |
前面大家折腾了很久的多链方案之后,终于发现这些漏洞是按下葫芦浮起瓢,怎么都堵不住。专业的说法是,数据可用性和计算正确性无法同时保证。
因为Plasma
想把数据和计算都平分到多条链里面,而Rollup
则是分工一下,layer 1
负责数据可用性,layer 2
只负责计算。
Rollup
该方案对链的性能提升来自几个方面:
- 聚合器收集用户交易,然后批量打包发送到
layer 1
上,可以节省gas
。在同样的gas limit
下,区块可以打包更多的交易。- 对交易进行压缩。去除非必要字段,甚至直接数据压缩。
- 以
calldata
的方式将交易发送到链上,这种存储形式的gas
消耗更低。
- 链外计算,
layer 1
的负担减轻了。 Arbitrum
项目还提出了序列器方案,由中心化系统对交易进行排序,进一步提升系统性能。
当然这里面也是有安全问题的,因此还设置了复杂的挑战机制,通过举报有奖的方式来解决可能出现的欺诈问题。
联盟链中Rollup
然而,对于联盟链来说,Rollup
提升性能方面的作用并不重要。
一方面,联盟链的性能压力不大;另外一方面,联盟链里没有gas
,方案里那些节省gas
的奇技淫巧根本没用。
那么我们为什么要花这么多精力去研究它呢?
因为Rollup
方案有一个被忽视的,其实非常重要的作用,就是它提供了区块链进一步解耦的思路:
- 用户直接与聚合器进行交互,而不是链。用户接口和相应的数据结构(交易结构)与链解耦。
- 合约引擎与链解耦。
Layer 1
链只提供存证功能,保证原始交易的数据有效性,和对计算结果的存证。- 合约部分将跟传统应用开发类似,开发者可以用更灵活的方式开发智能合约。
- 序列器提供了去中心化与中心化结合的思路。用户可以根据信任程度走不同的路径,甚至在信任的前提下,数据有效性可以由单一中心化系统保证,更好的与传统系统结合。
然后我们就可以让整个联盟链系统更加贴近应用场景:
- 用户接口可以更贴近应用,设计为更适合应用的方式。比如:
- 数据结构可以针对特定应用优化。
- 验证方式不一定使用数字签名,可以用更传统的用户名/密码等方式。
- 智能合约开发形式更接近传统应用。
- 使用通用编程语言。
- 智能合约是一个单独的系统,设计更加灵活。
- 实现去中心化和中心化相结合的方式,更加贴近现实场景。
- 用户信任中心化系统时,可以走中心化系统,作为
fast path
。 - 用户不信任中心化系统的时候,走去中心化系统作为
slow path
。
- 用户信任中心化系统时,可以走中心化系统,作为
当然这里面还有很多技术挑战,比如:
- 用通用语言编写智能合约,怎么保证其执行的确定性?
layer 2
要证明计算的正确性,就要给出相应的密码学证据,是否有比以太坊基于默克尔树的方案更轻量的方案?- 用户在不同的路径间切换时,如何处理回退等情况,如何让用户体验更好,甚至无感?
对具体方案有兴趣的小伙伴欢迎关注CITA-Cloud中相应的RFC,也欢迎大家一起来探讨相关的话题。
区块链的抽象
引入Rollup
的思路之后,联盟链从抽象角度会变得更像可信计算和存证的结合。
这里的caller
和add_server
就是很传统的可信计算的关系。
可信计算已经发展出了非常多的先进技术,比如零知识证明之类。但是欺诈者足够无耻的话,你总是拿他没办法,而区块链可以以仲裁者的角色,填补上这个漏洞。