本文转载自以太坊课程优秀学员的以太坊扩容方案解读(学员 Discord ID:0x5f37a86#3269),该学员报名了由TinTin 和 Arbitrum 联合出品的以太坊入门开发课程——《以太坊开发快速入门-轻松创建智能合约》,完成前两课的学习后,就已经能从区块链的底层设计出发,对以太坊的扩容方案进行了深度技术解读。以下是干货满满的原文👇
01
Why scaling
为什么以太坊需要扩容,在官方文档[1]中已经给出了详尽的原因:使用人数增加,达到容量限制,网络成本过高,为提升交易速度和吞吐量。
由于以太坊不可能三角(在以太坊生态系统中存在一个互操作性不可能三角。互操作协议只能拥有以下三种特性中的两种:无需信任:拥有与底层域相同的安全性;可扩展性:任何域都可以支持;信息通用性 : 能够处理任意的跨域数据。详见愿景[2]),使方案主要分为链上扩容和链外扩容两类。
On-Chain 链上扩容
Sharding,通过创建分片(新链)来减少网络拥塞,增加 TPS ,同时减轻验证者的负担,本质是横向分割数据库增加扩展性。
Off-Chain 链下扩容
为了保住安全性与去中性化,在 L1(以太坊上)抽象出了 L2,L2 是建立在以太坊之上的网络,比如侧链等。L2 继承了 L1 的安全性(如乐观卷叠、零知识卷叠或状态通道),从而可以在可拓展性方向进行扩展。卷叠即在 L1 之外执行任务,并在达成共识时在 L1 公开数据。目前 L2 扩容方案包括状态通道(State Channels)、侧链(Sidechain)、Plasma、Rollup、Validium。其中,扩容方案主要是 Rollup 和 Validium,状态通道、侧链、Plasma 已较少使用。
02
Rollups
Rollups 是最新、最广泛的二层扩容技术。
交易可分为三部分,输入数据、执行和世界状态改变。最消耗 Gas 的部分是交易执行和世界状态改变,执行部分消耗没有这么大。Rollups 的想法是将执行与存档分开,大量交易汇总为一个批次,并为该批次生成证明发布在主网上——即把开销小的部分放 L1(开销小的部分也能恢复出完整的交易),从而减少执行和改变世界状态所耗费的 Gas。
-
链下执行:将执行以及状态维护等消耗大量资源的操作放在链下
-
链上存档:链上只存交易输入(calldata)
为什么只把 calldata 放在 L1 上,就认为这笔交易是安全的?智能合约没办法多线程,如果是多线程,同样的输入可能会由于多线程带来不同的输出。矿工在输入一笔输入时,同一笔数据放在不同矿工上执行出来的数据不太一样,该矿工提议的一个区块在别的矿工那里就会不成立。因为状态改变对应的值不一样,可能导致网络分叉等一些问题,EVM 是单线程模型,把 calldata 放在 L1 上按照顺序记录、按照顺序执行一定能计算出 L2 上准确的状态。
分类
Rollup 又分为 Optimistic Rollup 和 ZK Rollup,前者参考了 Plasma 欺诈证明机制[3](默认所有交易有效,如怀疑有欺诈行为可提出挑战,并对欺诈进行证明),后者用零知识证明机制[4](证明者不提供任何有效信息就能使验证者相信这笔交易,一旦链上接受证明,就可以立即确认这笔交易是有效的)来确保安全性。
Optimistic Rollup
在扩展 NFT 方面有较大局限性,不能进行快速的 NFT 提款;其次,如果 Optimistic Rollup 中的 NFT 价值非常高,它可能会成为攻击目标,因为从Optimistic Rollup 中窃取资金的成本与潜在盗窃的规模无关。应用包括 Arbirum、Optimism、Boba Network 等。
ZK Rollup
它将链上的用户状态压缩存储在 Merkle 树中,将用户状态的变更转移到链下进行(链上直接处理成本较高,但是用链上合约验证零知识证明的 proof 是否正确成本是很低的,但同时也保证了链下状态共识的安全性),通过 zk-SNARK 的证明来保证该链下用户状态变更过程的正确性。NFT 系统中,ZK 解决了 Optimistic 的两个问题,一是用户的快速退出以及系统的安全性得到保障;二是每秒数千笔交易的速度使得更大的交易规模成为可能。但目前只有个别功能如转账、交易可以使用。应用包括 zkSync、Loopring、dYdX 等。
P.S. zk-STARKs 和 zk-SNARKs 是两种零知识技术,前者代表零知识可扩展的透明知识论证,后者代表零知识简洁非交互式知识论证,详细算法分析可参考此文[5],此处不再赘述。
一笔 rollups 会经过哪些步骤?
与L1大致流程差不多,用户发起交易,先向 L2 RPC Node 节点发送,节点把这笔交易中转给 sequencer 定序器,此时就类似 L1 矿工,但区别是 L1 的矿工需要参与共识竞争出块,但 sequencer 直接有出块权,直接把这笔交易打包进定序器区块链并给用户返还交易回执,用户的交易可以得到瞬时 confirm,而不像 L1 需要等待网络共识出块。因此用户在 L2 的交易比 L1 体验好。当 sequencer 执行多笔交易后会将交易压缩在一起提交到 L1 的 inbox,压缩的数据为交易的 calldata、交易的入参数据,这个 sequencer inbox 其实就是在 L1 上的合约,在 L1 上记录 calldata 的位置。
拆解如下
节点分类
全节点 fullnode,基本和 L1 fullnode 一样,没有出块权限,只有记录状态、向用户打开rpc通道的权限,用户通过全节点来发动交易并把交易转接到 sequencer。和L1的全节点区别是,L1的 fullnode 可以连接到网络中多个节点,因为L1毕竟需要共识来出块,就会涉及到广播,而L2出块是定序器来负责完成。因此全节点只需要连接到定序器就好了,那如果定序器出于一些原因连接不上怎么办?fullnode 还可以连接 inbox 合约,L2 只需要知道输入就可以推导出整个最终状态。因此,全节点也可以单独读取 L1 上的 inbox 合约拿到其中的 calldata,再把 calldata 排列起来重新执行获取最新的数据。
定序器 (sequencer),网络的记录权、出块权、交易排序权等。未来的定序器要做成去中心化的以防止定序器遇到的各种问题如抗 MEV(抗矿工可提取价值的一些操作)。
验器者 (validator),负责给网络状体背书(网络状体还是由定序器推进)。比如说定序器维护了一些状态,但这个时候有节点认为它想相信 inbox 合约里的东西,这个时候哪一方出了问题,用户再去调用多个 rpc 节点,恰恰调用到了有不同状态的 rpc 节点的时候,会怀疑有一方涉假,用户可以去看验证器有没有质押状态,质押的是哪个状态,用户就会相信验证器质押状态所获得的数据。验证器作假怎么办?多轮交互式欺诈证明,如果你证明你是对的、验证器是错的,那么验证器质押的资金都会变成你的,鞭策验证器只会去质押正确的状态。
两个合约
Inbox 合约,在 L1 上记录我在 L2 上交易的 calldata 的位置,仅传 calldata。
Rollup 合约,记录 rollups L2 协议的核心状态,比如有哪些验证者,验证质押状态,L2 到 L1 通信讯号的确认等等。
L2 相当于有两条链,一条是定序器链(抽象出来与其他区块链一样的链式数据结构),一条是 rollups 链(验证者质押链),平时所交互的链都是定序器的链(状态链)。区块链浏览器上看到的是定序器链的结果,状态被 sequencer 读取并出块,和L1 比较相似,以太坊上的 rollups 链和 L1 就不相似了,它主要是为了把验证者认为正确的状态质押进去并且连接前驱状态所被质押的节点。
另一个问题是,如下 104、106、109、111 这四个区块有共同的父区块,L1 上不同的区块有相同的父区块(103),它们的区块高度都是一样的,但在 L2 中有区别,所有的区块有特定高度。rollups chain 维护 L1,L1 智能合约是单线程,只能同时执行一笔交易,当多个区块同时打进去,它还是以顺序的方式处理区块并且按照顺序标号,这就是为什么不会出现重复区块高度(只是 rollups 区块的特点,不是 sequencer 区块的特点)
如果用户连接不到定序器怎么办?
因为是 L2,其最终目的是把 calldata 放在 L1。因此还有其他方法把交易放在 L1,比如给 L1 RPC 节点发送交易,L1 RPC Node 把交易发送矿工,矿工把状态写入delayed inbox,过了几分钟,这笔交易会重新被 sequencer 读取,或者被其他节点读取,将其正式纳入L2的状态。
为什么需要延迟一下(delayed inbox)?因为定序器在处理状态,delayed inbox 也在处理状态,万一此时 sequencer 没有把 delayed inbox 状态拿上来或者直接忽略了,所以需要给到几分钟的时间让定序器知道这笔交易,并且在之后的某个时间内将其纳入 L2 状态。
总结
-
交易数据在 L1
-
执行与存储在 L2
-
安全性得到 L1 的保障
-
Optimistic Rollup 欺诈证明使得 L1 进一步验证 L2 的准确性
其他扩容方案
03
State Channel
属于早期构思的 L2 方案。比如,核心:链下处理交易,只向主链提交证明。例如某竞猜智能合约的链下操作,A 创建某交易发送给 B,AB 互签名并留下副本返回给对方,每次他们的交易都是基于最后一个状态并通过签名的方式更新到一个新的状态,那么基于签名的顺序就可以知道所有交易的顺序。无论 AB 之间进行了多少笔交易,由于是链下进行,不需要支付 L1 上高昂的手续费,也不需要等待区块打包的时间,真正资产转移的过程只发生在最终执行划转的一刻。
缺点:需要所有参与者上线才能完成最终交易,参与者下线或被代表限制了状态通道的安全性、可扩展性。
应用:Celer Network、Liquidity Network、Raiden Network
04
Side Chain
核心思路是构建一条完全独立的链,有自己的共识模型、验证者、运营者,通常与 EVM 兼容,可拓展通用的应用程序,能与主链互相转移资产。
但缺陷也很显著,由于侧链不依赖于以太坊的安全性,只选择性地将区块头的快照发送至主链来防止分叉,但是验证者依然可以通过串谋来发动“无效状态转换攻击”,主链本就不可能验证侧链上的所有区块,只要超过50%的验证者串谋就可以创建一个无效区块来窃取资产。
应用:xDAI、Skale Network、Injective Protocol 等。
05
Plasma
应用:xDAI、Skale Network、Injective Protocol 等。
核心原理是“链中链”,在主链之上创建一系列智能合约作为主链与子链之间的通信媒介,合约中规定了子链的一些基本状态、规则等,子链是一个完全独立的区块链,可以有专门的矿工,使用与主链不同的共识算法。
交互:例如使用合约创建 token,数字资产必须在 L1 上,通过 Plasma 子链的智能合约才能将其转移到子链中,用户也需要在主链上购买资产再转移到子链上。合约首先将主链上的资产锁定并在子链上生成等值资产,用户就可以完全脱离主链在子链上进行交易,运行时子链的矿工打包区块,在适当的时机由 operator 将区块哈希值提交到主链作为子链状态更新证明。可见资产在子链上是不安全的,但如果这个过程中 operator 作恶,篡改交易,用户依旧能够取回资产,Plasmas 链中的参与者也可以随时提交资产证明,返回到主链。
优点:安全性高且可以实现无监管
缺点:退出机制复杂,提款挑战期过长,用户在此期间提供欺诈证明极大影响体验
应用:Matic Network(Polygon)
课程信息
本文的优秀学员作者,正是报名参加了TinTin 与 Arbitrum 打造的保姆级区块链入门课程——《0基础创建以太坊智能合约》。课程由 Arbitrum 联合 TinTinLand 共同开发,旨在为广大开发者提供一个学习和掌握区块链开发的完美解决方案。本次课程邀请到三位区块链核心开发专家 DODO合约工程师 Owen Liu 、DODO 数据团队负责人 Autark 、Arbitrum 亚太区集成工程师 Jason Wan 作为主讲老师,课程内容翔实易懂,非常适合想要在以太坊上创建DApp的开发者,更适合没有区块链基础的开发者通过课程来进入热门区块链行业,获得更多的区块链就业选择及更有前景的职业发展。
通过课程,大家从认识以太坊到入门 Solidity 及开发实践,再到前端与智能合约的开发部署、经典业务合约解析,并通过实操从 0 到 1 在 Ethereum 网络上创建属于自己的区块链产品!
课程的试听课已上线,感兴趣的开发者可以先试听第一课。让我们从与 DApp 应用交互开始,认识以太坊。
视频链接:https://hkr.h5.xeknow.com/s/4BAnRCw.com/s/2uP7zi
附上报名入学申请链接:
https://shimo.im/forms/9uVmcZ1CQHISsXkP/fill