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