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 中使用
1MB
1K SLoC
Circom Scotia
将 Circom 电路编译为 Bellpepper 的中间件
此存储库提供了必要的中间件,以将 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-Scotia 和 ark-circom 的优势。所有加载代码都是基本复制的。复制了 wasmer
证人生成器,然后为了支持而没有 arkworks
库,如 ark-ff
或 ark-bignum
;这些被替换为 ff
和 crypto-bignum
。将所有这些粘合在一起的其他部分是原创的。
依赖关系
~6–20MB
~291K SLoC