# zkRollup工作原理

By [nanmuzz](https://paragraph.com/@nanmuzz) · 2022-05-16

---

zkRollup是什么
-----------

`zkRollup`就是基于零知识证明的二层扩容方案(`layer2`)， `zkRollup`方案起源于18年下半年，由`Barry Whitehat`和`Vitalik`先后提出。`Rollup`顾名思义有“卷起”和“汇总”的意思，将大量的交易“卷起/汇总”打包成一个交易，`zkRollup`的原理一句话就可以讲清楚：链下进行复杂的计算和证明的生成，链上进行证明的校验并存储部分数据保证数据可用性。`zkRollup`数据可用性可以让任何人都能根据链上存储的交易数据，还原出账户的全局状态，从而消除由于数据可用性带来的安全风险（这里的数据可用性对比`Plasma`，`Plasma`之所以不能称为主流的扩容方案，在于`Plasma`的数据并没有提交到链上，所以在`Plasma`上退出一笔资产的周期会长达一周左右（争议期），如果在争议期间没有人提交欺诈证明，那么资产才可以安全退出到主链）

zkRollup工作原理
------------

`zkRollup`在链下利用`Merkle tree`存储账户状态，由`Operator`收集用户的交易，交易收集完成后`Operator`会执行每个交易（校验余额，校验nonce，校验签名，执行状态转换），当交易执行完成后会产生一个新的`Merkle tree Root`，为了证明链下状态转移是正确的，`Operator`会在交易执行完成后生成一个零知识证明的`proof`。

下图表示`Operator`工作过程，黄色的表示用户发送的交易，绿色的表示`Operator`中维护的`merkle tree`，`Operator`执行交易后本地的`merkle tree root`会由`prev state root`转换成`post state root`，图中蓝色的表示`Operator`生成证明账户状态转移有效的零知识证明。

`Operator`把`prev state root`，`post state root`，交易数据和`proof`证明提交至链上合约，合约校验`proof`通过后会将来新的状态写入到链上，合约不需要单独校验每笔交易的合法性，只需要校验`proof`是否有效，降低了链上`gas`消耗，其中交易数据是存储在较便宜的位置`CALLDATA`上。链下每一次的状态转变都需要提供零知识证明，由主链上的合约进行验证，只有验证通过才能更改状态。即每一次状态转变都严格依赖密码学证明。

`zkRollup`生成的证明大小（很小），验证时间（很快基本上是常数），不会随着交易数量的增长而变大，所以`zkRollup`可以极大地提高TPS。影响`zkRollup`链上性能的只有链上`CALLDATA`存储数据的成本,随着以太坊`Istanbul`升级，`CALLDATA`使用成本降为原来的`1/4`，`zkRollup`的性能则获得`4`倍提升，`TPS`可达到近`2000`左右。

上链的数据中`prve state root`，`post state root`与`proof`基本上是不会随着交易增长变化的，只有上图中黄色交易部分会随着交易增长变大，所以为了能在一个区块链中容纳更多的交易，需要对上链的交易进行压缩。`zkRollup`使用`merkle tree`来记录地址，这样地址就可以表示成`merkle tree`的索引值，地址数据的大小就从原本的`20 bytes`减少到`3 bytes`，在以太坊上金额用`32`个字节`256`位的大整型来表示，这里压缩到`6`个字节，货币最小单位从`wei`变成`Mwei=10^6 wei`，手续费压缩到`1`个字节，`nonce`压缩到`2`个字节，`nonce`的范围`0~65535`，也就是说一个账户最多可以发送`65535`笔交易，交易的签名直接删除了，不出现交易中，因为每笔交易的合法性在链下都通过零知识证明的电路约束校验过了。

---

*Originally published on [nanmuzz](https://paragraph.com/@nanmuzz/zkrollup)*
