
电路中的控制流与密码学原语MoonMath Manual 高级电路设计教程【免费下载链接】moonmath-manualA resource for anyone interested in understanding and unlocking the potential of zk-SNARKs, from beginners to experts.项目地址: https://gitcode.com/gh_mirrors/mo/moonmath-manualMoonMath Manual 是一本为 zk-SNARK 学习者准备的开源技术手册本文聚焦其中的电路设计进阶内容电路编译器如何将高级语言翻译为算术电路与 R1CS 约束系统电路中的控制流如何实现以及椭圆曲线等密码学原语怎样以 gadget 的形式嵌入电路。读完这篇电路设计教程你将建立起从电路语言到约束系统的完整认知框架为学习 Circom 等真实电路语言打下坚实基础。从纸笔开始认识 MoonMath Manual 与电路编译器MoonMath Manual 由 Least Authority 团队编写最大的特色是纸笔计算——它引导读者用最简单的手算方式理解 zk-SNARKs 的底层原理而不是被晦涩的公式吓退。在其电路编译器章节chapters/circuit-compilers-moonmath.tex中作者设计了一个名为 PAPERPen-And-Paper Execution Rules纸笔执行规则的教学语言你可以像写 Rust 伪代码一样描述问题再通过大脑编译器手工把代码展开成图形化的算术电路。为什么要引入电路编译器这个概念因为无论是算术电路还是 R1CSRank-1 Constraint System秩一约束系统直接编写它们的体验都堪比用汇编语言写程序——繁琐、易错、难以复用。 电路编译器承担了翻译官的职责把开发者用高级语言写好的逻辑编译成电路及其关联的 R1CS同时自动生成能高效计算 witness 的程序。这正是 Circom、ZoKrates 等现代电路语言的核心工作。电路编译的两大阶段Setup 与 Prover 执行机制电路程序与普通程序最大的区别在于它有两个执行阶段⚙️。在 setup 阶段编译器负责生成电路和 R1CS 约束系统后者通常作为输入交给零知识证明系统在 prover 阶段证明者拿到实例变量的赋值后需要为所有 witness 变量计算出一个合法赋值这个赋值既是构造性证明也可以交给 Groth16 等算法压缩成简洁证明。现代电路编译器通常会隐藏这两个阶段的差异向开发者提供统一的编程接口。理解这一机制是后续设计复杂电路的前提。电路条件赋值if-then-else 的约束实现技巧控制流是所有编程语言的基本能力电路语言也不例外。最常见的场景是条件赋值variable condition ? value_if_true : value_if_false。在普通程序中条件为真时只会执行真分支但电路可没有跳过的能力——电路中的每个约束都必须同时成立。电路编译器的巧妙之处在于用一个简洁的公式同时约束两个分支x b·c (1-b)·d其中 b 是经过布尔约束b·(1-b) 0的字段元素。当 b1 时 x 等于 c当 b0 时 x 等于 d。 代价是电路会执行所有分支这与普通程序完全不同也是电路 prover 计算量更大的原因之一。电路循环设计有界循环的展开技巧再看循环。while true这种无界循环在电路世界里是行不通的——因为电路本质上是无环的acyclic实现无界循环需要无限大的电路。但好消息是只要循环的上界在编译期已知就可以通过展开unrolling来实现编译器把循环体复制 N 份串成一条链。例如一个求连乘的for i in 1..N循环展开后会变成 N-1 个乘法约束依次相连。注意循环计数器 i 只是编译期参数它不会出现在最终的电路里。这意味着电路语言中的循环不能依赖运行时的输入只能依赖编译期常量。椭圆曲线电路 gadget密码学原语的电路实现当我们需要在零知识证明中验证某个点是否在椭圆曲线上或某次签名是否正确时就必须把密码学原语搬进电路里这类可复用的子电路被称为gadget小工具。椭圆曲线密码学的电路实现核心是让曲线定义在电路所在的同一个有限域上。书中特别推荐 Twisted Edwards 曲线——它的加法律简单、对所有点包括无穷远点统一适用、没有分支能显著减少约束数量。Tiny-JubJub 就是书中用来做 EdDSA 手算的扭曲 Edwards 曲线。上图是书中为手算专门设计的 BLS6-6 配对友好曲线在有限域 F_43 上的点分布。作为对比下面两张图分别是模 7 和模 5 的小型曲线可以看到有限域越小、曲线上的点越稀疏非常适合用来手算验证电路约束一条椭圆曲线 gadget 通常由三部分约束组成曲线方程约束验证点在曲线上、点加法约束使用统一加法律以及标量乘法约束把标量拆成二进制位逐个判断累加。这些基础约束组合起来就构成了签名验证、哈希承诺等复杂应用电路。Circom 电路语言入门signals、templates 与 components理解了原理之后动手实践的第一步通常是从 Circom 开始。 Circom 用三个核心概念组织电路signal电路中的字段元素分为输入信号、输出信号和中间信号默认私有、可声明为公开template生成电路的模板函数像工厂一样被实例化component模板的实例通过连线把多个子电路拼装成更大电路。把 Circom 代码保存为.circom文件后一条编译命令就能同时产出三样东西.r1cs约束系统文件、.wasmwitness 计算程序、.sym调试符号表例如circom three_fac.circom --r1cs --wasm --sym编译完成后用snarkjs r1cs info可以查看电路的约束数量、公开输入输出数量等统计信息这是评估电路设计质量的重要指标。电路设计学习路径从 MoonMath Manual 开始如果你想系统掌握电路设计推荐按这个顺序学习打好数学地基先看代数与算术章节chapters/algebra-moonmath.tex、chapters/arithmetics-moonmath.tex理解有限域与群的基本概念理解语句与 R1CS阅读 statements 章节chapters/statements-moonmath.tex弄懂 witness、instance 与构造性证明攻克电路编译器章节反复推敲chapters/circuit-compilers-moonmath.tex中的 PAPER 示例亲手把代码脑编译成电路图动手实践 Circom复现书中的 3-factorization 问题走通写电路 → 编译 → 生成证明 → 验证全流程。你可以通过git clone https://gitcode.com/gh_mirrors/mo/moonmath-manual获取完整源码配合书中的练习把每一个电路示例都亲手推导一遍。当你能够独立完成条件赋值、有界循环与椭圆曲线 gadget 的组合设计时你就已经迈入了 zk-SNARK 电路设计的进阶大门。【免费下载链接】moonmath-manualA resource for anyone interested in understanding and unlocking the potential of zk-SNARKs, from beginners to experts.项目地址: https://gitcode.com/gh_mirrors/mo/moonmath-manual创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考