前言
“可扩展性、去中心化、安全性”被称为区块链的不可能三角,以太坊强调去中心化与安全性,这使得以太坊处理交易的速率非常慢。目前已知的BTC处理交易的TPS大约为7,以太坊的TPS约为27。较慢的速率导致在交易量暴增的情况下,会出现网络拥堵与gas费较高的情况。
以太坊的效率与gas费较高成了亟需解决的问题,开发者也提出了各种各样的方案,包括:闪电网络、侧链、plasama、L2等。其中以L2中的zk rollup最引人关注(也有另一种基于op rollup),其中更是有被称为zk四大天王----polygon、starkware、scroll、zksync,每一个项目都拿了巨额融资。
zk rollup的底层技术都是零知识证明,这里简单介绍下:零知识证明(Zero-Knowledge Proof,简称ZKP)是一种加密协议,它允许一方(证明者)向另一方(验证者)证明某个陈述是真实的,而无需透露任何有关该陈述的其他信息。这种证明的关键特性是“零知识”,即验证者在验证过程中不会获得任何额外的知识,除了证明者确实知道某个秘密或某个陈述是真的。零知识证明有两个主要特性:隐私和压缩。隐私是指零知识证明可以隐藏一些信息并证明某个陈述是正确的,压缩是指通过零知识生成的证明将远远小于证明的陈述逻辑的大小。
在L2中,零知识的作用是L2需要通过零知识证明向L1上的合约证明发生在L2上面的批量交易是正确的、合法的。这里就使用了零知识的压缩特性,当然隐私性在这里也是有用的。
下面就来介绍基于zk rollup L2的典型实现。
zkrollup L2的通用实现
L2的实现原理就是将大量应直接发生在以太坊上的交易,在L2进行“汇总”并通过单个 ZK 有效性证明向以太坊网络证明这些交易发生的有效性。通过“打包”的方式大大降低gas费,同时提升以太坊的TVL。
我们接下来以一个用户使用流程的角度来说明整个zkrollup的技术实现原理:
- 用户在使用L2网络之前,首先需要在以太坊主网通过调用L2部署的合约进行质押,质押的ETH将被放进合约的“保险箱”。
- 质押成功后,该账户会同步到L2网络,之后用户就可以在L2进行操作了
- 用户在L2进行交易, L2对应的节点将执行用户提交的交易,并将多个交易信息打包给到zk prover。prover根据交易信息输出证明与对应的状态转换hash
- 状态转换hash与证明会同步到L1对应的智能合约中,智能合约通过校验提交的证明是否合法来决定是否更新状态hash。
- 如果用户需要取走自己的ETH,需要在L2发起申请,交易会同步到L1,并在L1上根据其余额从“保险箱”中转账给具体用户对应的余额。
这里比较重要的一点是:如果用户需要在L2上进行交易,需要在L1上进行质押,质押成功后,对应的账户+余额会同步到L2网络,之后用户就可以在L2上进行交易。可以类比下中心化的交易所:你存钱到交易所,然后在交易所内进行交易,其实都是交易交易所展示在你账户上的一个数字,加加减减,而真正的用户的资产是交易所统一管理的,只有在进行提现的时候,你的账户上的余额才会具体“转换”为具体的资产。L2也是同样的道理,在L1上通过合约锁定用户资产,“展示”在L2上面一个数字,用户在L2上面进行数字的加加减减,批量处理后将最终加减的结果同步到L1。当用户发起提现时,就根据加减的数字余额,将相等的L1上真实的余额转账给L1上对应账户的用户。
图示:
主要组件
上面是大致的L2交易流程的介绍,下面再介绍下L2具体的模块。
L1链上合约
如前文所讲,链上合约的主要作用包括如下几项:
- 接受用户质押,并同步用户账号、资产到L2.
- 用户的保险箱。保存有所有质押用户的资产。
- 保存状态hash,一般是所有用户状态(可以理解为余额)的merkle root。这个merkle root代表该时刻所有用户的资产状态。
- 验证L2提交的证明,并更新对应的状态hash。
L2 node(定序器)
将L2也想象为一条链,那么定序器就类似于一个节点,不过该节点大多数情况下是中心化的,也就是说节点只有这一个,一般由L2对应团队来维护。
它接受用户的合约部署、交易,并进行校验,执行。这里需要注意的是:L1同步的账户与余额,即是同步到定序器,定序器根据这些账号与状态来对用户在L2上发起的交易进行校验与执行。
因为定序器是中心化的,可能会出现定序器作恶的情况,例如可能会出现:某用户提交的交易被定序器恶意拒绝的情况。所以目前L2开发者也在不断推出去中心化的定序器。
定序器“收集”执行一批交易后,会将合法的交易打包给到证明器去做证明。
L2合约
既然类比L2是一条链,那么链上就需要跑合约(这些合约使L1同步下来的账户有更加丝滑的体验)。因为以太坊是老大哥,所以一般的L2一般都是兼容以太坊的EVM,当然也有绕一圈的:L2的合约是自己写的,但是可以将对应的solidity代码转译为可以在自己L2上跑的字节码。例如starkware,L2有自己的智能合约语言cairo,但是也尽量在兼容以太坊的智能合约能够无缝衔接过来。
L2证明器(zk prover)
证明器接收到定序器提交的合法批量交易及老的状态root,会对齐进行证明,证明的逻辑是:
老的状态root通过执行这些合法的交易,会转化到新的状态root。
那么只要生成的证明被L1合约校验通过,那么就说明状态转化是正确的,即这些交易的执行是正确的。
polygon这里采用的是组合证明的方式,不仅会将多批的交易信息证明合并为一个,同时上链前会对最后的证明使用snark证明再包一层,最大限度减小证明体积的大小。
L1与L2的交互
该模块主要负责L1与L2之间交互的功能,主要包括:
- L1用户的质押同步到L2
- L2生成的证明同步到L1
其他
因为L2是中心化的,所以存在L2跑路的风险,目前主要靠下面几种方式来进行避免:
- 代码完全开源
- L1合约设置“逃生舱”功能,当L2挂了,用户可以使用“逃生舱”接口,把自己的钱取出来
- 更加去中心化。因为zk的性能原因,L2目前还无法做到完全的去中心化,不过开发者已经在努力逐渐将L2尽可能的去中心化,例如:定序器的去中心化、数据可用性委员会等。
总结
L2简单理解为:用户在L1上“存钱”,然后在L2上面给你展示个余额,用户在L2上使用这个余额进行交易。最终L2将批量的余额更新的证明同步到L1,并更新状态hash。
目前zk rollup的L2发展百花齐放,之前零知识被称为“月亮数学”,随着生态的不断完善、代码开源、学习资料越来越多,使zk的技术门槛在逐渐降低,之后的发展会越来越卷,不仅卷zk证明生成的速度,而且也会卷去中心化、DAO等,不过这对于以太坊的发展及用户的体验无疑是一个好消息。

文章评论