Circom 2.0: A Scalable Circuit Compiler

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 operations
  • Comparators
  • 哈希函数:mimc、pedersen、sha256
  • Elliptic curves:babyjubjub(twisted Edwards),Montgomery
  • Sparse 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电路设计的DSL
  • circom既支持开发者描述如何生成电路约束,也支持开发者根据任意指定输入高效计算witness
  • 在circom中,由开发者来完全控制电路定义
  • circomlib库中包含了许多circuit templates,可减轻开发者工作量
  • circom有一个庞大活跃的社区
  • circom可与iden3 proving system结合使用,如snarkjs/wasmsnark/rapidsnark
  • zkREPL,为zkSNARKs的线上开发环境,是基于circom构建的

猜你喜欢

转载自blog.csdn.net/mutourend/article/details/125953309