递归零知识证明(RecursiveZero-KnowledgeProof,简称递归ZKP)是一种使用递归概念的零知识证明,它通过递归的方式生成可更高效验证的证明,某些情况下还可以将多个证明合并成一个单一的证明。这在区块链系统中尤为重要,因为在这些系统中,效率和可扩展性是至关重要的。
递归零知识证明(Recursive Zero-Knowledge Proof,简称递归ZKP)是一种使用递归概念的零知识证明,它通过递归的方式生成可更高效验证的证明,某些情况下还可以将多个证明合并成一个单一的证明。这在区块链系统中尤为重要,因为在这些系统中,效率和可扩展性是至关重要的。
零知识证明 是一种密码协议,它允许一方(证明方)向另一方(验证方)证明其知道某个信息(如一个秘密),而无需泄露该信息的具体内容。零知识证明保证了以下三个关键性质:
在递归零知识证明中,证明的内容本身可以作为另一个证明的组成部分。换言之,证明方可以用一个证明来证明另一个证明的有效性,这样可以以递归的方式构建复杂的证明。具体而言,使用电路$Circuit$表达zkSNARK的验证算法$\mathsf{Verify}$,将验证算法所使用的证明 $Proof$ 和验证密钥 $VK$ 作为输入,并生成一个新的证明$Proof'$ 。
在递归零知识证明中,可以理解为“证明一个证明的有效性”,然后再继续证明下一个陈述,依此类推。递归就是“证明的证明”。简单来说,这意味着证明自己是真实的,同时证明其他证明也是有效的,并且可以通过递归构建更复杂的证明。
第一层零知识证明,通常称为内嵌/底层证明(Inner Product),该证明主要确保以下5项内容正确:
(1). 公共输入的哈希值: 验证公共输入的承诺是否正确;
(2). 多项式验证: 验证电路约束是否在验证点上成立,主要验证内容如下:
zeta
上“被消去”(即满足电路约束)。(3). FRI验证: Low-degree test
打开点验证:
(4). Merkle树路径验证: Merkle proof
检查路径中每个节点的哈希计算是否正确。
(5). 随机挑战值 确保生成的随机挑战值是由正确的public coin经过哈希得到,主要包括
首先先要确定递归电路的结构,并引入虚拟目标(Virtual Target)表示需要验证的数据(因为在确定验证电路之前,没有生成对应的内嵌证明)。
虚拟目标的作用: 由于递归证明涉及多层,且电路需要在一开始就进行确定,所以需要采用虚拟目标进行提前占位,在特定轮次进行递归证明时再填充对应数据。
主要包括以下步骤:
构建虚拟目标: 在递归验证电路中使用 虚拟证明目标 占位,表示底层证明的所有数据。
let pt = builder.add_virtual_proof_with_pis(&inner_cd); // 虚拟目标
add_virtual_proof_with_pis
用于构建虚拟证明和公共输入。验证逻辑:
使用 verify_proof
函数在递归电路中嵌套验证逻辑:
builder.verify_proof::<InnerC>(&pt, &inner_data, &inner_cd);
通过递归将底层验证电路嵌套到更高一层电路,生成递归证明:
使用递归验证电路逐步生成递归证明,验证所有嵌套证明的正确性:
(1) FRI 和low-degree test Plonky2 使用 FRI作为证明生成开销较低的多项式承诺方案,相比于传统 KZG,FRI 在递归场景中可以显著降低证明大小和验证复杂度。
(2) 高效字段 Goldilocks Goldilocks 是一个优化的 64 位素数域,支持快速的模运算,非常适合现代 CPU,通过在这个字段内构建约束,每一步的验证电路大小将会减小,并进一步减少计算开销。
(3) Poseidon 哈希函数 Plonky2 使用 Poseidon 构造约束友好的哈希函数,减少哈希运算的电路深度和门数量。
递归零知识证明将零知识证明的能力与递归的概念相结合,允许创建复杂的证明,并且能通过递归的方式合并多个证明,从而使系统更加高效、紧凑和可扩展。主要优势在于能够为复杂的计算提供紧凑的证明,特别适用于区块链系统、加密协议和隐私保护应用。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!