# FluiDex Authors - ZK-Rollup 开发经验分享 Part I (Highlights)

## 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。