PolyhedraZK/Expander
GitHub: PolyhedraZK/Expander
Expander 是一个基于 GKR 协议的开源零知识证明生成器,旨在为大规模并行计算提供高效的证明生成与验证能力。
Stars: 151 | Forks: 68
# Expander
[](https://github.com/PolyhedraZK/Expander/actions)
[](https://github.com/PolyhedraZK/Expander/blob/main/LICENSE)
Expander 是 Polyhedra Network 的证明生成后端。它旨在支持快速的证明生成。
如需了解更多技术介绍,请访问我们的 Markdown 文件[这里](https://github.com/PolyhedraZK/Expander-cpp/tree/master/docs/doc.md)。
关于如何使用 gkr 库的示例请点击[这里](./gkr/src/tests/gkr_correctness.rs)。
这是我们的证明器核心仓库,要在我们的证明器上编写电路,请访问[我们的编译器](https://github.com/PolyhedraZK/ExpanderCompilerCollection)
## 开发者助手
我们理解该产品目前仍在开发中,可能对用户还不够友好。我们鼓励开发者加入我们的 Telegram 聊天群组进行问答:https://t.me/+XEdEEknIdaI0YjEx
此外,请查看我们的电路编译器:https://github.com/PolyhedraZK/ExpanderCompilerCollection
这个编译器是你使用我们证明器的入口;你当前所在的仓库主要是核心执行器,而不是开发者前端。我们的产品流水线如下:
`你的电路代码 -> Expander 编译器 -> circuit.txt & witness.txt -> Expander -> proof `
请注意,witness 生成过程尚未达到最优,我们正在积极改进。
## AVX
我们默认使用 AVX2。在 x86 或 Mac 上,你可以直接执行
```
RUSTFLAGS="-C target-cpu=native" cargo test --release --workspace
```
在某些平台上,如果你不指明 `target-cpu=native`,它可能会模拟 avx2 指令,而不是直接使用它,这会导致性能下降。
我们的代码也支持 `avx512`。这默认是关闭的。要使用 `avx512`
```
RUSTFLAGS="-C target-cpu=native -C target-feature=+avx512f" cargo test --release --workspace
```
## 环境设置
在执行设置之前,请确保你仔细阅读了系统要求,并确保你的 CPU 在支持列表中。
```
cargo run --bin=dev-setup --release
```
## 基准测试
**请确保包含 `RUSTFLAGS="-C target-cpu=native"` 以启用特定平台的加速。**
命令模板:
```
RUSTFLAGS="-C target-cpu=native" cargo run --release --bin gkr -- -f [fr|m31ext3] -t [#threads] -c keccak
```
具体来说,如果你在拥有 16 个物理核心的 CPU 上针对 Bn256 标量域运行:
```
RUSTFLAGS="-C target-cpu=native" cargo run --release --bin gkr -- -f fr -t 16
```
## 正确性测试
[这里](./gkr/src/tests/gkr_correctness.rs)我们提供了一个端到端证明生成和验证的测试用例。
要检查正确性,请运行以下标准的 Rust 测试命令:
```
RUSTFLAGS="-C target-cpu=native" cargo test --release -- --nocapture
```
## CLI
用法:
```
RUSTFLAGS="-C target-cpu=native" cargo run --bin expander-exec --release -- prove -c
-w -o
RUSTFLAGS="-C target-cpu=native" cargo run --bin expander-exec --release -- verify -c -w -i
RUSTFLAGS="-C target-cpu=native" cargo run --bin expander-exec --release -- serve -c -h -p
```
示例:
```
RUSTFLAGS="-C target-cpu=native" mpiexec -n 1 cargo run --bin expander-exec --release -- prove -c ./data/circuit_m31.txt -w ./data/witness_m31.txt -o ./data/out_m31.bin
RUSTFLAGS="-C target-cpu=native" mpiexec -n 1 cargo run --bin expander-exec --release -- verify -c ./data/circuit_m31.txt -w ./data/witness_m31.txt -i ./data/out_m31.bin
RUSTFLAGS="-C target-cpu=native" mpiexec -n 1 cargo run --bin expander-exec --release -- serve -c ./data/circuit_m31.txt -h 127.0.0.1 -p 3030
```
要更改 fiat-shamir 转换中使用的哈希函数,请使用`-f [SHA256|Poseidon|MiMC5]`。要更改多项式承诺方案,请使用 `-p [Raw|Orion|Hyrax|KZG]`。这些选项放在 `prove/verify` 命令之前,例如:
```
RUSTFLAGS="-C target-cpu=native" cargo run --bin expander-exec --release -- -f SHA256 -p Raw prove -c -w -o
```
请注意,哈希函数和多项式承诺方案在证明和验证过程中必须保持一致,否则验证将会失败。
要测试由 `expander-exec serve` 启动的服务,你可以使用以下命令:
```
python ./scripts/test_http.py # need "requests" package
```
## 性能分析
要获取有关运行时间的更细粒度信息,你可以启用 `gkr/profile` 特性,即
```
RUSTFLAGS="-C target-cpu=native" cargo run --bin expander-exec --release --features gkr/profile -- prove -c ./data/circuit_m31.txt -w ./data/witness_m31.txt -o ./data/out_m31.bin
```
请注意,启用 `profile` 特性会略微降低整体性能,因此建议在进行基准测试时不要启用它。
## 致谢
我们要感谢以下项目和个人的贡献:
1. [Gnark](https://github.com/Consensys/gnark):感谢他们出色的前端电路语言。
2. [Plonky2&3](https://github.com/Plonky3/Plonky3):感谢他们在 Merseene 素数 AVX 和 ARM-Neon 汇编实现上具有启发性的工作。
3. [Justin Thaler](https://people.cs.georgetown.edu/jthaler/):感谢他指出了使用重复的可靠性问题。
4. [Stwo](https://github.com/starkware-libs/stwo):感谢他们启发我们制作基准测试页面。
5. [Intel](https://www.intel.com/content/dam/develop/external/us/en/documents/clmul-wp-rev-2-02-2014-04-20.pdf):感谢他们提供关于 GF(2^128) 域乘法的详细实现。标签:GKR证明系统, Rust, Web3, 可视化界面, 密码学, 并行计算, 手动系统调用, 网络流量审计, 通知系统, 零知识证明