PolyhedraZK/Expander

GitHub: PolyhedraZK/Expander

Expander 是一个基于 GKR 协议的开源零知识证明生成器,旨在为大规模并行计算提供高效的证明生成与验证能力。

Stars: 151 | Forks: 68

Expander Logo
# Expander [![Build](https://static.pigsec.cn/wp-content/uploads/repos/cas/56/563da7de2999004399343ce5ebce915f9dabff6ef340e4fe32366c2c354ff2e7.svg)](https://github.com/PolyhedraZK/Expander/actions) [![License](https://img.shields.io/github/license/PolyhedraZK/Expander)](https://github.com/PolyhedraZK/Expander/blob/main/LICENSE)

论文 | 基准测试 | 你的代码编译器 | Telegram 群组

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, 可视化界面, 密码学, 并行计算, 手动系统调用, 网络流量审计, 通知系统, 零知识证明