项目简介
Scroll 是2021年由华人创始团队推出的 基于zkEVM 的 以太坊ZKR扩容方案,不同于zkSync的语言级别兼容,Scroll实现了完全EVM等效,即字节码层级兼容,除了数据结构和状态树等部分,zkEVM看起来与以太坊完全一样,由此,现有的以太坊应用程序和工具可以实现无缝迁徙。
关键时间点 | 融资 |
---|---|
* 2022.7 Scroll 推出 pre-alpha 测试网 * 2023.2 Scroll 改进 v2 桥和 ZK 架构,将 prover 内存需求从 870GB 降低到 275 GB * 2023.2 Scroll 推出 alpha 测试网 待推进 * 引入 The Graph 支持 * 推进账户抽象 | * 2022年 融资 3000 万美元 * 2023年 融资5000万美元 |
核心价值
- 完全EVM等效
Vitalik将zkEVM类项目划分为5类,类型1---完全以太坊等效(字节码层级兼容,不改变以太坊的任何部分)、类型2---完全EVM等效(字节码层级兼容,仅改变数据结构和状态树等部分)、类型3---EVM等效(增加gas成本以适配难以zk证明的特定操作)、类型4---几乎等同于EVM(过渡态,直至转向前几类)、类型5---编程语言等效(支持Solidity、Vyper等编写的智能合约),显然,前2类更靠近以太坊生态,更适应以太坊的各种升级,而Scroll实现的完全EVM等效,正是做的此类工作。
- 去中心化的验证网络
Scroll提供去中心化的验证网络,任何用户只要有GPU机器就可以成为证明节点,而且随着节点的增多,算力将越大,成本将越低。
竞品
- zkSync :对比Scroll,zkSync仅实现语言级别的等效。此外,zkSync团队控制了出块、打包和验证过程,存在一定的中心化问题**。**
- Polygon Hermez(Polygon zkEVM) :与Scroll一样,Polygon Hermez提供了字节码层级的EVM等效,实际上Polygon zkEVM引入了一层zkASM(zero knowledge Assembly),字节码编译为zkASM之后再运行**。**
- Starknet:虽然Starknet仅仅提供语言级别的EVM兼容,但基于Cairo构造的新虚拟机非常灵活,能支持多需求的复杂应用。
- Taiko :实现了完全以太坊等效的zkEVM**。**
项目架构及原理
Scroll架构
如上图,Scroll架构包括3部分:
1)Scroll节点
- Sequencer 负责 a) 接收用户交易,打包区块,提取区块执行记录(execution trace)并发送给 Coordinator;b) 向 Rollup合约提交区块信息、新的stateRoot作为callData;
Sequencer直接复用了以太坊节点Geth的代码,保证交易在L2和L1上的执行方式完全一致。 - Coordinator负责接收执行记录(witness),从 Roller Pool 中随机拉取 Roller产生zk证明,聚合zk证明;
- Relayer 负责 a) 通过Bridge合约监听 L1 上存款、提款事件;b) 通过Rollup合约追踪 L2 上区块状态,包括数据可用性、zk证明等。
2)Roller网络:充当prover的角色,负责产生zk证明。任何用户只要拥有GPU机器都可以成为Roller,因此,Roller实际上构成了去中心化的验证网络,
3)合约
- Bridge合约:用于L1-L2之间的资产转移。
- Rollup合约:用于L2交易数据可用性,及证明验证。
Scroll工作流
L2区块产生,提交到L1,在L1上确认的流程为:
- Sequencer 接收L2用户交易,产生区块。对于区块i,Sequencer产生执行记录T,发送给Coordinator。期间,Sequencer将交易数据D、将更新后的stateRoot和交易承诺提交给Rollup合约作为calldata。
- Coordinator 从Roller Pool随机挑选一个Roller为执行记录产生合法性证明。为了加速证明产生过程,不同区块的合法性证明可以并行生成。
- 为区块i生成合法性证明P后,Roller将证明发回给Coordinator。每获取k个区块证明,Coordinator分配聚合任务给另一个Roller,将k个单独的证明聚合为单个证明A。
- 最后,Coordinator将聚合证明A提交给Rollup合约,Rollup合约基于前述calldata数据验证A的合法性,验证通过则L2上k个区块在L1完成确认。
核心技术实现
与EVM等效的zkEVM是Scroll的灵魂,在分析zkEVM的实现之前,我们先回顾下EVM执行智能合约的过程。
|--------------------------------------------------------------------------------------|
| EVM架构 |
新版本的以太坊将 EVM 从节点代码中剥离出来,形成独立的模块。如下图,节点通过 EVMC接口与 EVM 模块交互,Instance接口定义了节点对 EVM 的操作,如创建、销毁、设置等,Callback 接口定义了 EVM 对节点的操作,如 state 读写、区块信息读写等。
|----------------------------------------------------------------------------------------|
| EVM执行合约 |
接下来,我们看看Scroll的zkEVM构造,重点关注区块记录的证明生成。
Scroll改进了原zcash开源的halo2,结合KZG承诺方案,为区块执行记录生成合法性证明。
执行证明分为两部分,1)State proof状态证明,用于证明State/Memory/Stack等操作正确执行了 ,但不检验读/写位置是否合法;2)EVM proof,用于证明在正确的时间调用了正确的操作码。
1、Sequencer 提取执行记录
Scroll的Sequencer实现fork自Go-Ethereum(Geth),通过TraceChain api获取EVM在两个块之间(不包括start)执行期间创建的结构化日志,并将它们作为JSON对象返回。
BlockTrace结构体 | |
---|---|
* StorageTrace存储电路需要的信息 * ExecutionResults记录结构化日志 |
2、Roller 产生zk证明
zkEVM通过Bus-Mapping解析EVM执行记录,获取结构化的witness输入,以及收集电路输入。
1)witness构建:
通过block_traces_to_witness_block函数完成,获取.json格式的执行路径后,先通过serde_json解析路径为BlockTrace,再封装为证明电路通用的结构体Block,包含区块上下文,复制约束,MPT初始值及更新后的信息等。
2)circuit构建:使用1)的block信息构建SuperCircuit,包含zkEVM构建的所有电路。
我们看下Repo的描述:
具体地:
电路类型 | 共享查找表 | |
---|---|---|
* StateCircuit → 用于验证RwTable的合法性; * EvmCircuit→ 用于验证RwTable调用的合法性; * TxCircuit→ 用于验证交易的合法性; * BytecodeCircuit → 用于验证字节码的合法性; * CopyCircuit→ 用于验证复制约束; * ExpCircuit→ 用于验证幂次关系; * KeccakCircuit → 用于验证keccak哈希; * PoseidonCircuit → 用于验证poseidon哈希; * MptCircuit→ 用于验证MPT; * PiCircuit → 用于验证公共输入; * RlpCircuit → 用于验证rlp; | 1. Copy Table * CopyCircuit * EvmCircuit 2. Exponentiation Table * EvmCircuit 3. Rw Table * StateCircuit * EvmCircuit * CopyCircuit 4. Keccak Table * KeccakCircuit * EvmCircuit * BytecodeCircuit * TxCircuit * MptCircuit | 5. Tx Table * TxCircuit * EvmCircuit * CopyCircuit * PiCircuit 6. Bytecode Table * ByteCodeCircuit * EvmCircuit * CopyCircuit 7. Block Table * EvmCircuit * PiCircuit 8. MPT Table * MptCIrcuit * StateCircuit |
* StateCircuit → 用于验证RwTable的合法性; * EvmCircuit→ 用于验证RwTable调用的合法性; * TxCircuit→ 用于验证交易的合法性; * BytecodeCircuit → 用于验证字节码的合法性; * CopyCircuit→ 用于验证复制约束; * ExpCircuit→ 用于验证幂次关系; * KeccakCircuit → 用于验证keccak哈希; * PoseidonCircuit → 用于验证poseidon哈希; * MptCircuit→ 用于验证MPT; * PiCircuit → 用于验证公共输入; * RlpCircuit → 用于验证rlp; | 1. Copy Table * CopyCircuit * EvmCircuit 2. Exponentiation Table * EvmCircuit 3. Rw Table * StateCircuit * EvmCircuit * CopyCircuit 4. Keccak Table * KeccakCircuit * EvmCircuit * BytecodeCircuit * TxCircuit * MptCircuit |
**3)**Plonkish + KZG承诺