#zk-snarks #proofs #cryptography

circom-scotia

将 Circom 电路编译为 Bellperson 的中间件

4 个版本

0.2.0 2023 年 12 月 13 日
0.1.2 2023 年 8 月 22 日
0.1.1 2023 年 8 月 17 日
0.1.0 2023 年 8 月 3 日

#2468魔法豆


lurk 中使用

MIT/Apache

1MB
1K SLoC

Circom Scotia

Circom 电路编译为 Bellpepper 的中间件

rose-pattern-porcelain-white-background

此存储库提供了必要的中间件,以将 Circom 编译器的输出(R1CS 约束和生成的见证)用于 Bellperson。它基于 Nova-Scotia 和 Arkworks 的 Circom-Compat 的工作。请参阅底部的 致谢,以了解此处使用的各种作品的正确致谢。

如何使用?

要自行使用,请安装 Circom 2.1.6 版本或更高版本。有关更多信息,请参阅 Circom 文档

准备好后,使用以下命令编译您的电路:circom [file].circom --r1cs --wasm --prime vesta(对于 vesta 曲线)。我们稍后会使用 R1CS 文件([file].r1cs)和见证生成器([file]_js/[file].wasm),因此请注意它们的文件路径。您可以通过在 Circom 文档 中描述的见证生成过程独立测试这些电路。

现在,启动一个新的 Rust 项目,并将 Circom Scotia(《code>cargo add circom-scotia)添加到您的依赖项中。然后,您可以使用 Bellperson 开始使用您的 Circom 电路。首先,定义 Circom 输出的路径,并加载 R1CS 文件和见证生成器

let root = current_dir().unwrap().join("examples/sha256");
let wtns = root.join("sha256.wasm");
let r1cs = root.join("sha256.r1cs");

let cfg = CircomConfig::new(wtns, r1cs).unwrap();

然后,创建输入,这些输入必须符合原始 Circom 项目预期的形状,并计算证人。原始 Circom 输入可能看起来像这样:

{ "arg_in": ["a", "b"] }

因此,我们反映输入的相同名称和维度。然后可以通过提供加载的配置和输入来计算证人。

let arg_in = ("arg_in".into(), vec![Fr::ZERO, Fr::ZERO]);
let input = vec![arg_in];

let witness = calculate_witness(&cfg, input, true).unwrap();

现在,设置一个测试约束系统,并使用之前加载的 r1cs 信息合成生成的证人。

let mut cs = TestConstraintSystem::<Fr>::new();

let output = synthesize(
    &mut cs.namespace(|| "sha256_circom"),
    cfg.r1cs.clone(),
    Some(witness),
);

最后,我们可以比较预期的输出并确认电路确实满足条件。

let expected = "0x00000000008619b3767c057fdf8e6d99fde2680c5d8517eb06761c0878d40c40";
let output_num = format!("{:?}", output.unwrap().get_value().unwrap());

assert!(output_num == expected);
assert!(cs.is_satisfied());

有关完整代码,请参阅 sha256.rs 示例。

对感兴趣的贡献者的一些说明

待办事项列表

  • 通用的256位整数被替换为 U256,因此目前我们无法推广到大于256位的素数域。

致谢

感谢 iden3 团队的 Circom 语言

解析和生成借鉴了 Nova-Scotiaark-circom 的优势。所有加载代码都是基本复制的。复制了 wasmer 证人生成器,然后为了支持而没有 arkworks 库,如 ark-ffark-bignum;这些被替换为 ffcrypto-bignum。将所有这些粘合在一起的其他部分是原创的。

依赖关系

~6–20MB
~291K SLoC