# FluiDex Authors - ZK-Rollup 开发经验分享 Part I (Highlights) ![rw-book-cover|256](https://readwise-assets.s3.amazonaws.com/static/images/article0.00998d930354.png) ## Metadata **Cover**:: https://readwise-assets.s3.amazonaws.com/static/images/article0.00998d930354.png **Source**:: #from/readwise **Zettel**:: #zettel/fleeting **Status**:: #x **Authors**:: [[FluiDex Authors]] **Full Title**:: ZK-Rollup 开发经验分享 Part I **Category**:: #articles #readwise/articles **Category Icon**:: 📰 **URL**:: [www.fluidex.io](https://www.fluidex.io/zh/blog/zkrollup-intro1/) **Host**:: [[www.fluidex.io]] **Highlighted**:: [[2021-08-07]] **Created**:: [[2022-09-26]] ## Highlights - 精巧地使用零知识证明(ZK-SNARK)这种密码学技术来完成链上计算资源消耗的压缩 - 每个链上交易,都会被区块链的每一个参与节点执行一遍,这是为什么区块链系统性能较低的一个重要原因。 - 验证可以比计算容易 - 如果有一种技术,能够降低验证的代价,即使增加了计算的代价,也是值得的。因为计算只发生一次,而验证会发生在每个节点上。ZK-SNARK 的本质正是这样一种压缩验证计算量的技术 - 对于一段特定的程序,ZK-SNARK 首先对这段程序做预处理,一次预处理完成之后,对于每份输入(input),都首先计算输入的执行结果,再花费较大的计算资源生成一份 proof ( proof 实际上是很多大数 )。任何验证者,可以通过这份 proof 和本次执行使用的 input,快速验证执行的结果是正确的。 ### 真实世界 Rollup 系统的设计 - 在一般 Rollup 系统的设计中,我们会维护一颗全局的 merkle tree。 - zksnark 会在数学上保证,每次对于 merkle tree 的更新都满足“预定规则”。 - 为了保证最坏情况下的安全性 #c1 - ,一般要求用户能够重建整棵树(这叫 data availability) #c2 - 我们通常对于数百甚至数千笔交易,按照指定顺序在这颗 merkle tree 上执行完成后,使用 ZK-SNARK 证明执行的结果 #c1 - 。这批交易会被统一地证明和验证,它们被称为一个 “L2 Block”。 #c2 ### ZK-Rollup 系统架构 - 链上智能合约:负责验证 Merkle tree 的每次状态更新都是有效的,维护正确的 merkle tree root; #c1 - 保证用户可以直接调用合约提取自己应有的资产; #c2 - 协调 L1 和 L2 #c3 - Prover Cluster:对每个 L2 Block 做大量密码学计算获得 zksnark proof。 - State Manager:维护完整的 merkle tree。 - 其他业务模块:如 L2 浏览器 ### ZK-Rollup 的 TPS 能力上限 #### 证明速度 - 实际上每个 L2 Block 的证明是可以完全并行的,使用几百台服务器来搭建证明集群是 common practice。 - zksnark 证明耗时长,会使得从 L2 向 L1 提现完成需要的时间更久,会给运营方造成更高的服务器成本,但不会限制 TPS。 #### 数据上链和 ETH GAS 限制 - 这是一个真正限制 ZK-Rollup TPS 的因素。 - 每笔 layer 2 的交易都要有数据会上链。 #### Merkle Tree 全局状态的更新 - 真实 ZK-Rollup 系统的性能上限实际上更被这个模块限制,而不是上面讨论的证明速度和 gas 限制。 - 容纳较多用户和资产对于 Merkle tree 的深度有一定要求。 - 必须实现 merkle tree 的 并行更新, ZK-Rollup 的 TPS 才会突破 100-300 这个层次。和 zksnark proving 可以完美分布式多机多核并行不同,使用并行加速 merkle tree 的更新需要较精细的代码控制,而且非常难以实现多机分布式加速。这也是个工程上的挑战。 ### 经济成本分析 - ZK-Rollup 一般需要几千个 CPU cores 做 proving - 链上的 gas 成本比链下服务器成本至少高两个数量级 - 云服务中 GPU 非常没有性价比 ### 其他开发经验碎片 - 零知识证明电路的开发语言有不同的选择,既可以直接使用 C++/Rust 实现的底层计算库如 ethsnarks / bellman,也可以使用一些 DSL 如 ZoKrates / Circom / Zinc。 Facebook Winterfell - 我们最终的选择是 circom。 #reference https://github.com/iden3/circom - Circom 提供了恰到好处的抽象,一方面提升了读写代码的效率,另一方面也没有扭曲底层的真实细节。 - Circom 本质上还是一种 R1CS 的 DSL,但是 Fluidex 实际使用了 PLONK proof system - 已经上线的 ZK-Rollup 项目: zksync: 最完整的 ZK-Rollup 开源项目代码,涵盖了一个 ZK-Rollup 系统需要的每个组件。使用 PLONK 机制,电路代码使用 bellman,链下代码使用 Rust。 hermez: 和 zksync 类似。使用 Groth16 机制,电路代码使用 circom,链下代码使用 Go。 loopring: 仅开源了电路代码和合约代码,没有开源 State Manager 模块。使用 Groth16 机制,电路代码使用 ethsnark,链下代码不开源。 - 开发中的 ZK-Rollup 项目: fluidex: 开源了电路代码,State Manager,交易所撮合引擎。 使用 PLONK 机制,电路代码使用 circom,链下代码使用 Rust。