1. 引言

本文主要摘自 IDEN3团队Albert Rubio在Compiler and Composability in ZKP 上的演讲内容。

2. 何为Circom?

何为Circom? ==>circom

为编程语言和编译器由Jordi Baylina创建的,针对ZK协议中电路设计的DSL语言为iden3项目的一部分circom 2.0编译器主要由UCM大学的团队开发circom 2.0编译器完全开源且由Rust语言写成,提供了更快的电路编译和更好的安全性circom社区正在快速承载社区对于circom的成功至关重要

一个circom program主要有两重目的:

1)提供相应电路的符号描述:在二进制文件中有一组R1CS约束。2)提供一种高效的方式来根据输入计算witness:

将有WebAssembly(wasm)代码与JS或主流浏览器结合为大型电路提供了C++代码(如ZK-Rollups for Layer 2)

circom支持开发者从底层设计arithmetic电路(类似于设计电子电路)。 在circom中,所有的约束必须由开发者明确添加。 约束可被简化,在编译时可移除signals,但是永远不会引入新的signals。

在circom,实际的电路称为components,而component是基于template实例化的,template为对电路的参数化描述,如: 如上,电路Multiplier接收2个输入,然后输出signal为二者的乘积。

circom的一个关键特征是提供了不同的指令来:

在symbolic层定义新的约束:out === in1 * in2; // symbolic level "only"

会生成约束in1 * in2 - out = 0。在computational层计算a signal:out<-- in1 * in2; // computational level only

会生成类似out := in1 * in2的代码。或者借助<==操作符:out <== in1 * in2; // symbolic and computational level

会生成 约束in1 * in2 - out = 0 和 代码 out := in1 * in2。

通常需要使用<==操作符,但某些时候不需要。如,定义检查input是否为0的电路,应为: 使用<--和===操作符,并不能保证电路在symbolic层和computational层的等价性,需要由开发者来负责实现相应的等价性。

可基于circomlib库等对templates进行组合来构建电路: 如上,使用变量sum来结算loop循环内的加法,引入参数n来限定input signals的数量。 构建约束时,变量是symbolic表达;而计算witness时,变量对应的是field数值。

circomlib库中包含了一些有用的电路实现,可用作primitive templates,具体有:

Binary transformers and operationsComparators哈希函数:mimc、pedersen、sha256Elliptic curves:babyjubjub(twisted Edwards),MontgomerySparse Merkle Trees

充分展现了Circom语言的强大,以及如何以quadratic constraints来编码复杂计算。

3. 约束简化

描述密码学协议的arithmetic circuits生成的约束系统中可能包含数百万个约束,通常可从中移除许多约束。对约束系统的简化是下一阶段提升效率的重要工作。大多数约束系统可处理的约束数上限约为

2

17

2^{17}

217。 在不修改电路行为并保留R1CS表达的情况下,Circom支持对约束的简化。

如MultiAND()电路生成的约束系统为: 可简化其linear constraints,生成仅有2个R1CS约束的等价系统: circom中高效实现了对linear constraint的简化:

编译器应用clustering并行化简化工作;使用Gauss-Jordan移除 来实现linear简化;迭代整个过程直到没有剩余的linear constraints;可实现约80%的reduction;编译过程中最expensive的部分为:

超大电路需要约750GB的local memory(需要swapping)。可将约6.5亿个约束reduce为1.3亿个。在64核512GB RAM机器上,编译用时约3小时(若使用老版本的circom,用时需要数天)。包含简化后R1CS的二进制文件大小约为50GB。具有1千万个约束的电路在笔记本电脑上编译(并完全简化)用时约8分钟。

以上简化技术:

并不会引入新的signals,应可高效实现,是一种新型的代码优化circom中的简化技术要远强于Zokrates中的可独立用于由其它语言生成的R1CS约束系统 的简化

4. 小结

circom为面向底层arithmetic电路设计的DSLcircom既支持开发者描述如何生成电路约束,也支持开发者根据任意指定输入高效计算witness在circom中,由开发者来完全控制电路定义circomlib库中包含了许多circuit templates,可减轻开发者工作量circom有一个庞大活跃的社区circom可与iden3 proving system结合使用,如snarkjs/wasmsnark/rapidsnarkzkREPL,为zkSNARKs的线上开发环境,是基于circom构建的

查看原文