本文将构建一个zk-dApp(零知识证明 DApp),以证明用户是否属于某个特定组,而无需透露用户具体是谁。
本教程是circom 和 snarkjs 最经典的入门文章
零知识证明正变得越来越流行,但可能很难找到入门资料。在花了一些时间研究这个主题之后,我整理了我学到的东西,希望它能帮助大家入门零知识证明编程。
Circom 语言教程与 circomlib 演示
ZK 语言调查:Noir , o1js , Circom , Leo, Cairo, Lurk
编写零知识 dApp,这篇文章将介绍如何将零知识电路集成到智能合约中,然后再集成到 dApp 中。
通过 Tornado Cash 的源代码理解零知识证明
如何创建 零知识证明并在Solidity 合约中验证
本文详细介绍了如何通过Circom和Halo2等库实现两个向量的点积计算,并利用零知识证明(ZKP)进行证明和验证。文章还讨论了零知识证明的流程,安装所需的工具,以及在不同环境中实现相应电路的代码示例。此外,文章解释了什么是可信设置以及它在现实应用中的重要性。
本文详细介绍了Rank-1 Constraint Systems (R1CS) 在零知识证明中的应用,通过多个实例展示如何构建R1CS,使用Circom和snarkjs工具实现电路,并提供了数学公式的详细推导与代码实现。文章涵盖了R1CS的基本定义、与逻辑门电路的关系、构造方法以及多个示例,包括相应的约束解析和代码实现,具有较强的实用性和技术深度。
文章详细介绍了如何将一组算术约束转换为Rank One Constraint System (R1CS),涵盖了转换中的优化和Circom库的实现方法。
文章探讨了在素数域 $ ext{F}_p$ 中整数除法的挑战,特别是在零知识证明(ZKP)中的应用。强调了传统除法符号可能导致多个有效解的问题,并提供了两种解决方案:比特位除法算法和约束商的其他方法,以确保唯一性和安全性。讨论了使用 Circom 实现的具体代码示例及其优缺点。
该项目提供了一系列练习以帮助用户学习Circom语法,并创建与以太坊虚拟机(EVM)兼容的零知识程序。它包含了多种零知识难题和使用文档,能有效支持学习和测试各类算法和程序。项目提供结构清晰,步骤明确的安装和使用说明,适合加密技术与区块链技术的学习者使用。
本文深入探讨了 Circom 中的 <-- 操作符的一个潜在漏洞,展示了如何通过创建伪造的见证文件来利用这一漏洞,从而违背开发者对电路期望的假设。在详细的步骤中,介绍了生成有效证明的过程,以及如何修改二进制见证文件以实现攻击。此漏洞的理解对于开发安全的电路至关重要。
<--
本文探讨了 Circom 中的 alias bug 及其潜在安全隐患,介绍了如何通过溢出特定的域元素大小(p)来伪造证明。文中给出了该漏洞的示例代码,并介绍了如何通过严格的 Num2Bits 和 Bits2Num 函数,使得编码的二进制数组不会超过 p,从而避免此类攻击,同时还描述了挑战中的漏洞及其利用方式。