ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

什么是 R1CS 约束系统?10 分钟用 MoonMath Manual 理解零知识证明的核心组件

什么是 R1CS 约束系统?10 分钟用 MoonMath Manual 理解零知识证明的核心组件 什么是 R1CS 约束系统10 分钟用 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-manualR1CS 约束系统Rank-1 Constraint System是零知识证明zk-SNARK内部最核心的组件之一它把某段计算被正确执行这件事翻译成一组可被密码学验证的数学方程。如果你一直觉得 zk-SNARK 像月球数学Moon Math一样难以接近那么从 R1CS 约束系统入手是最好的突破口——本篇文章将用 10 分钟结合开源手册 MoonMath Manual带你彻底看懂它的原理、结构和一个完整实例。为什么零知识证明需要 R1CS 约束系统零知识证明的最终目标是证明者Prover向验证者Verifier证明我正确执行了某段计算同时不泄露计算的具体输入。问题是验证者无法直接重跑这段程序——因为那会暴露所有中间数据。解决办法是先把程序转换成 R1CS 约束系统。一旦计算被写成一组约束方程程序执行就被钉死在数学上任何一步都不能偷工减料。正如 MoonMath Manual 在 statements-moonmath.tex 中所说许多基于配对pairing的现代证明系统都要求决策函数以有限域上的二次方程组来表达R1CS 正是这一事实标准。R1CS 约束系统是什么先看它的数学长相R1CS 约束系统由 $k$ 个形如下式的二次方程组成$\mathbb{F}$ 是有限域$I$ 是实例变量$W$ 是见证变量$$(a_0 \sum a_j \cdot I_j \sum a_j \cdot W_j) \times (b_0 \sum b_j \cdot I_j \sum b_j \cdot W_j) c_0 \sum c_j \cdot I_j \sum c_j \cdot W_j$$其中 $k$ 称为约束数量每个方程称为一个约束constraint。注意左边是两个线性表达式的乘积——这正是Rank-1秩为 1的含义每个约束中变量的次数最多是二次而且只允许一个乘法。在 statements-moonmath.tex 中手册给出了精确定义并强调了一个关键结论满足方程组的 $(I; W)$ 中$I$ 称为实例instance$W$ 称为见证witness任何有界计算都可以表达为 R1CS 约束系统因此 R1CS 是有界计算的通用模型解出 R1CS 约束系统就等于给出了程序被正确执行的证明。一个看得懂的实例3-因子分解的 R1CS 约束系统数学定义容易劝退我们直接看 MoonMath Manual 中最经典的例子——3-因子分解问题statements-moonmath.tex。问题很简单给定一个数 $I_1$证明存在三个见证 $W_1, W_2, W_3$ 使得 $I_1 W_1 \cdot W_2 \cdot W_3$。麻烦在于R1CS 约束系统只允许一次乘法的方程而 $W_1 \cdot W_2 \cdot W_3$ 是两个乘法。这就需要**展平flattening**过程引入一个新的中间变量 $W_4$把三步乘法拆成两条约束约束 1W1 · W2 W4 约束 2W4 · W3 I1看到这里的巧妙之处了吗约束 1 强制计算先做 $W_1 \cdot W_2$ 并把结果存入 $W_4$约束 2 再把它与 $W_3$ 相乘得到 $I_1$。见证 $W_4$ 表达的正是中间计算状态——零知识证明正是靠这些中间变量把整个计算过程锁进方程组。举个具体数字取有限域 $\mathbb{F}_{13}$实例 $I_1 11$见证 $W (2, 3, 4, 6)$ 就是一个合法解因为 $2 \times 3 6$ 且 $6 \times 4 24 \equiv 11 \pmod{13}$。R1CS 约束系统中的实例、见证与可满足性理解 R1CS 约束系统时三个概念必须分清概念含义例子实例Instance公开的输入所有人都知道$I_1 11$见证Witness需要保密的内容证明者知道$W (2,3,4,6)$可满足性是否存在见证使所有约束成立存在所以系统可满足在 statements-moonmath.tex 中手册指出每个 R1CS 约束系统都定义一个形式语言语言中的单词就是方程组的解而陈述则是给定实例 $I$存在见证 $W$ 使 $(I;W)$ 是解。构造性证明就是给每个见证变量赋一个有限域元素使得全部方程成立——仅此而已。还有一个重要的**模块化modularity**性质statements-moonmath.tex两个 R1CS 约束系统的交集仍是 R1CS 约束系统。这意味着你可以像搭积木一样从简单的约束拼出复杂的证明逻辑——这正是 Circom 等电路编译器见 circuit-compilers-moonmath.tex 第 160 行的理论基础。从 R1CS 约束系统到证明QAP 转换有了 R1CS 约束系统零知识证明还没有完成——验证者不可能真的去逐个检查成千上万条方程。MoonMath Manual 给出了下一块拼图把 R1CS 转换成二次算术程序QAP。在 statements-moonmath.tex 中手册展示了转换的核心思路为每个约束选择一个互不相同的域元素 $m_i$用这些点构造目标多项式 $T$它在每个 $m_i$ 处取值为 0通过拉格朗日插值把 R1CS 的系数 $a, b, c$ 变成三组多项式 $A_j, B_j, C_j$。转换后验证解是否满足 R1CS等价于检查某个多项式 $P_{(I;W)}$ 能否被目标多项式 $T$ 整除见 statements-moonmath.tex。多项式整除问题非常适合在配对友好的椭圆曲线上在指数中验证——于是简洁证明Succinct Proof和零知识Zero-Knowledge就此打通。用 MoonMath Manual 学习 R1CS 约束系统的完整路线图MoonMath Manual 是一本面向零基础读者的开源 zk-SNARK 手册它的最大特色是所有关键计算都可以用纸笔完成。如果你想系统掌握 R1CS 约束系统建议按以下路径阅读入门铺垫intro-moonmath.tex 第 42 行给出了 3-因子分解的完整学习路线从形式语言一路走到 Groth16 证明形式语言与陈述statements-moonmath.tex 讲解如何用数学方式严格定义要证明的陈述R1CS 精讲statements-moonmath.tex 是 R1CS 约束系统的完整定义务必亲手推导一遍 3-因子分解和 Tiny-jubjub 曲线的例子电路与编译器circuit-compilers-moonmath.tex 展示了如何用 Circom 把高级语言编译成 R1CS 约束系统并生成见证证明协议收尾zk-protocols-moonmath.tex 讲解 R1CS 如何进入 Groth16 等最终证明系统。手册中的椭圆曲线章节还引入了专门为纸笔计算设计的 BLS6-6 曲线和 Tiny-jubjub 曲线帮助你亲手算一遍配对与约束——这正是Moon Math变得不再神秘的关键。总结R1CS 约束系统为什么值得你花 10 分钟掌握R1CS 约束系统是 zk-SNARK 的通用中间表示几乎所有主流证明系统Groth16、Pinocchio 等都以它为基础它的核心思想极其简单把程序执行拆成每步只含一次乘法的方程组让正确执行变成一个数学上可验证的问题理解 R1CS 约束系统你就拆掉了 zk-SNARK 最大的黑箱之一之后无论是学习 QAP、配对还是 Groth16都会顺畅很多最好的学习材料就在眼前开源免费的 MoonMath Manual配合纸笔练习10 分钟入门一个下午精通。如果你想要本地阅读源码可以克隆仓库git clone https://gitcode.com/gh_mirrors/mo/moonmath-manual。现在就打开 statements-moonmath.tex亲手写出属于你的第一个 R1CS 约束系统吧【免费下载链接】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),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进