这个项目实现了零知识证明来验证 x != y²,仿照 scaffold-garaga 项目的架构。
prove_test/
├── circuit/ # Noir 电路
│ ├── src/main.nr # 主电路逻辑
│ ├── src/test.nr # 测试用例
│ ├── Nargo.toml # Noir 配置
│ └── Prover.toml # 测试输入 (x=5, y=2)
├── contracts/ # Cairo 合约
│ ├── verifier/ # 验证器合约
│ │ ├── src/
│ │ │ ├── lib.cairo
│ │ │ ├── honk_verifier.cairo
│ │ │ ├── honk_verifier_circuits.cairo
│ │ │ └── honk_verifier_constants.cairo
│ │ └── Scarb.toml
│ ├── Scarb.toml
│ └── snfoundry.toml
├── src/
│ ├── lib.cairo
│ └── prove_square.cairo # 主合约
├── Dockerfile # Docker 环境配置
├── docker-run.sh # Docker 运行脚本
└── Scarb.toml
在 circuit/src/main.nr 中:
fn main(x: Field, y: pub Field) {
assert(x != y * y);
}这个简单的断言实现了:
- 零知识性:证明者知道秘密值
x,验证者只知道公开值y - 算术化:
x != y²被转换为数学约束 - 证明生成:使用 HONK 协议生成零知识证明
-
构建并运行容器:
./docker-run.sh build ./docker-run.sh run
-
运行电路测试:
./docker-run.sh test -
生成证明:
./docker-run.sh prove
-
启动 Starknet devnet:
./docker-run.sh devnet
-
运行前端应用:
./docker-run.sh app
-
查看所有可用命令:
./docker-run.sh help
如果你不想使用 Docker,可以手动安装依赖:
-
安装 Noir:
curl -L https://raw.githubusercontent.com/noir-lang/noirup/refs/heads/main/install | bash noirup --version 1.0.0-beta.6 -
安装 Barretenberg:
curl -L https://raw.githubusercontent.com/AztecProtocol/aztec-packages/refs/heads/master/barretenberg/bbup/install | bash bbup --version 0.86.0-starknet.1 -
安装其他工具:
make install-bun make install-starknet make install-garaga
cd circuit && nargo buildcd circuit && nargo testcd circuit && nargo provecd circuit && nargo write_vkscarb build
cd contracts/verifier && scarb build- 原始约束:
x != y² - 等价约束:
(x - y²) != 0 - 算术化约束:
(x - y²) * inverse(x - y²) = 1
- Witness 生成:计算满足约束的变量赋值
- 证明生成:使用 HONK 协议生成零知识证明
- 验证:在链上验证证明的有效性
- 证明者知道秘密值
x - 验证者只知道公开值
y - 验证者无法从证明中学习到
x的具体值
- Noir:零知识证明电路语言
- Cairo:Starknet 智能合约语言
- HONK:零知识证明协议
- Garaga:Noir 到 Cairo 的转换工具
- Barretenberg:证明系统后端
-
构建失败:
docker system prune -a ./docker-run.sh build
-
端口冲突:
# 停止占用端口的进程 sudo lsof -ti:5173 | xargs kill -9 sudo lsof -ti:5050 | xargs kill -9
-
权限问题:
sudo chown -R $USER:$USER . chmod +x docker-run.sh
- 编译错误:检查 Noir 版本是否正确
- 证明生成失败:确保输入值满足约束条件
- 验证失败:检查验证密钥是否正确生成
欢迎提交 Issue 和 Pull Request!
MIT License