本文深入探讨了 Circom 中的 <-- 操作符的一个潜在漏洞,展示了如何通过创建伪造的见证文件来利用这一漏洞,从而违背开发者对电路期望的假设。在详细的步骤中,介绍了生成有效证明的过程,以及如何修改二进制见证文件以实现攻击。此漏洞的理解对于开发安全的电路至关重要。
<--
本文介绍了如何在零知识电路中证明选择排序算法的正确执行过程。由于ZK电路中信号的不可变性,每次交换都需要创建一个新的列表快照。为此,文章详细展示了如何通过多个中间状态的转换来证明排序的正确性,包括查找子列表中最小值的索引、交换列表中的两个元素等关键步骤, 并提供相应的代码模版。
本文介绍了Quin Selector这一设计模式,它允许使用信号作为信号数组的索引。文章通过代码示例,展示了如何在Circom中实现Quin Selector,并讨论了优化方法。同时,文章还提到了Circomlib库中的multiplexer组件,它可以实现类似的功能,并提供了一个使用示例。最后,文章提到了该算法的历史渊源。
本文深入探讨了 Circom 中 if 语句的使用限制,明确指出信号不能用于改变 if 语句的行为,也不能在依赖于信号的 if 语句中赋值。
本文介绍了在 Circom 中如何在循环中使用组件。由于 Circom 不允许在循环中直接实例化组件,文章提供了通过预先声明组件数组并在循环内指定组件类型的方式来解决这一问题,并提供了三个实际案例:求数组最大值、检查数组是否已排序以及确保数组中所有元素都是唯一的,展示了如何在循环中有效地使用 Circom 组件,以及一些使用 circom 的小技巧。
本文介绍了在 Circom 中使用 indicator signals 和 Circomlib comparator library 来实现复杂约束条件的方法。
本文介绍了 Circom 中的 <== 和 ==> 操作符,它们用于在电路中自动计算和赋值中间信号,从而避免手动提供所有信号作为输入。文章还展示了如何使用模板将电路拆分成更易于管理的模块,以及如何在组件之间传递结果。此外,还强调了组件的输出信号必须被约束使用,以防止恶意证明者篡改。
<==
==>
Noir编程语言提供了一种熟悉的Rust风格的接口,用于编写自定义zk-SNARK程序。文章详细介绍了Noir编译器的工作原理,如何生成算术电路和适用于Aztec网络的智能合约字节码,并探讨了PLONK和其变体的约束系统。通过对电路的有效性和计算成本的思考,展示如何在使用Noir编写程序时优化电路性能。
本文对Circom和Noir进行了高层次比较,探讨了它们的生态系统、工具集、性能以及最佳用例。Circom作为一个低级领域特定语言,关注于电路约束的细粒度控制,而Noir则是一种更高层次的语言,旨在简化开发者体验,使其无需手动管理约束,进而提升工具的灵活性和可用性。
本文介绍了zkEVM,一种EVM兼容的zk-Rollup方案,旨在解决当前zk-Rollup在通用DApp构建和可组合性方面的挑战。zkEVM通过生成EVM验证的zk证明,使得现有的以太坊应用可以轻松迁移到zk-Rollup上,同时详细讨论了zkEVM的设计挑战以及当前技术背景下实现zkEVM的可行性,并阐述了从头开始构建zkEVM的高级思路和关键技术。