本文介绍了在 Circom 中使用 indicator signals 和 Circomlib comparator library 来实现复杂约束条件的方法。
本文介绍了Circom中的符号变量,它是被赋值为信号值的变量,常用于在循环中对信号求和。文章解释了符号变量的定义、使用场景,例如校验数组求和、校验二进制表示,以及如何避免因符号变量导致的二次约束冲突。此外,还阐述了非符号变量在模运算和位移操作中的使用限制,以及符号变量在循环边界和条件判断中的禁用。
本文是“STARKs中的算术化”系列的第二部分,详细探讨了预处理AIR(PAIR)的概念,该方法通过将多个不相交的约束合并为一个更大的约束来提高计算完整性。文章介绍了执行跟踪的定义,结合示例说明了如何使用选择器列进行约束的组合,并分析了该方法对后续低阶邻近测试的影响及其复杂性。适合有一定基础的读者,持续深入该领域的理解。
本文深入探讨了在 Circom 中编程时可能遇到的常见陷阱,包括错误地使用 assert、不正确地处理 hints (即 <-- 运算符),以及由于有限域算术导致的别名攻击。文章提供了具体的代码示例和避免这些陷阱的方法,强调了在 Circom 电路开发中进行严格约束和安全编码的重要性。
assert
<--
本文深入探讨了STARKs中约束的概念,并通过Lambdaworks库,以Cairo的非确定性连续只读内存的约束实现为例,详细解释了如何使用多项式来总结trace values之间的高度复杂关系。文章详细介绍了连续只读内存的定义,以及如何通过引入排序和辅助列,将验证内存属性简化为验证连续性约束、单值约束和排列约束。
本文深入浅出地介绍了Plonk证明系统,通过毕氏定理的例子,逐步拆解Plonk的限制式,并解释了相等限制式的概念。文章还对比了Plonk与Groth16在电路结构和约束方式上的差异,解释了Plonk中如何通过自定义逻辑门提高电路的灵活性,并对Plonk的核心概念进行了总结。适合对零知识证明和SNARKs有一定基础的读者阅读。
本文介绍了拉格朗日插值法的原理和方法,通过构建多个子多项式,使得每个子多项式在特定的约束点上为非零值,而在其他约束点上为零,最终将这些子多项式组合成满足所有约束条件的目标多项式。文章通过一个具体例子,详细展示了如何构建这些子多项式,并验证了最终多项式满足所有约束条件。
本文介绍了在R1CS电路中优化线性运算的方法,尤其是在零知识证明(ZK)系统中,通过将模型权重直接嵌入到电路中作为常量,而不是作为信号传递,可以显著减少约束的数量,从而降低计算成本。实验表明,这种优化对于R1CS和Plonk系统都能显著提升证明速度,特别是在R1CS系统中,线性操作几乎变为“免费”。