Skip to content

edgeflyer/zkp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 

Repository files navigation

ZKP(Zero-Knowledge Proof)流程整理

1. Prover 构造约束(Constraints)

  • Prover 根据要证明的计算/程序,构造一个公开的约束系统
  • 约束通常是等式约束,形式为:

$$ f_i(\text{variables}) = 0 $$

  • 所有约束结构对 verifier 是公开已知

2. Prover 计算 witness(解)

  • Prover 计算一组 witness(私有数据 + 中间变量)

  • 将 witness 代入所有约束:

    • 如果 所有约束都等于 0:说明这组 witness 是合法解
    • 如果 存在任一约束不等于 0: 👉 proof 无法生成,流程直接终止

这一步是整个 ZKP 中计算量最大的一步 本质上等价于“真正执行了一次被证明的计算,并记录所有中间结果”


3. 从“我知道一组解”到“让 verifier 相信解存在”

目标:不暴露 witness,让 verifier 相信:存在一组 witness 使所有约束成立

3.1 把所有约束结果组织成一个代数结构

  • 每一条约束都有一个固定编号:

$$ i = 1, 2, \dots, N $$

  • Prover 用 witness 计算每条约束的残差

$$ r_i = \text{第 } i \text{ 条约束的计算结果} $$


3.2 把“很多约束”折叠成一个单变量多项式

  • 按照公开规则(verifier 也知道)构造一个多项式:

$$ E(X) $$

  • 规则是:

$$ E(i) = r_i $$

也就是说:

  • $i$ 条约束的残差
  • 被当作多项式在 $X=i$ 处的取值

3.3 利用约束成立的事实

  • 因为所有约束都成立:

$$ r_i = 0 \quad \forall i $$

  • 所以:

$$ E(i) = 0 \quad \forall i $$

到这里,prover 得到了一个确定的多项式 $E(X)$

  • 它完全由 witness 决定
  • verifier 看不到
  • prover 也不能随意更改其含义

3.4 (可选但常见)随机合并约束 —— 随机挑战 $r$

  • verifier 会提供一个随机数 $r$
  • 用于将多条/多类约束进行随机线性组合
  • 目的:防止 prover 只满足部分约束(对冲作弊)

【注】在你当前流程里,这一步已经逻辑上包含在多项式构造中


4. Prover 对多项式做承诺(Commitment)

  • Prover 对构造出的多项式 $E(X)$ 进行承诺:

$$ C_E = \text{Commit}(E) $$

承诺具有两大性质:

  • 绑定性(Binding)
    • 一旦提交,prover 不能再更换多项式
  • 隐藏性(Hiding)
    • verifier 无法从承诺中推导出多项式内容或 witness

此时:

  • verifier 能看到承诺
  • verifier 不知道多项式长什么样
  • prover 已经“被锁死”

5. Verifier 给出随机挑战(抽查)

5.1 当前 verifier 的认知状态

  • verifier 已收到:
    • 多项式承诺 $C_E$
  • verifier 不知道:
    • witness
    • 多项式 $E(X)$
    • 约束是否真的都为 0
  • 但 verifier 确信 prover 不能再修改多项式

5.2 抽查的必要性

  • verifier 不可能检查:

$$ E(i)=0 \quad \forall i $$

  • 只能进行概率抽查

5.3 verifier 选取随机点 $z$

  • verifier 从一个很大的有限域中选取随机数:

$$ z \in \mathbb{F} $$

  • $z$ 发送给 prover (交互式 / 非交互式版本在实现上不同)

verifier 期望: 如果 prover 没有作弊,则应有 $E(z)=0$


6. Prover 在随机点打开多项式

6.1 计算随机点取值

  • Prover 计算:

$$ v_E = E(z) $$


6.2 生成打开证明(Opening Proof)

  • Prover 不能只给出数值 $v_E$
  • 还必须证明:

    “这个 $v_E$ 确实来自我之前承诺的那个多项式”

  • 生成一个 打开证明,内容为:

    我承诺过多项式 $E(X)$, 并且它在点 $z$ 处的值等于 $v_E$


6.3 Prover 向 verifier 发送

  • 数值:

$$ v_E $$

  • 打开证明:

$$ \pi_{\text{open}} $$


7. Verifier 进行最终验证

7.1 检查打开是否真实

  • verifier 使用:
    • 承诺 $C_E$
    • 随机点 $z$
    • 数值 $v_E$
    • 打开证明 $\pi_{\text{open}}$
  • 检查:

    $v_E$ 是否确实是承诺多项式在 $z$ 处的值

若失败 → 直接拒绝


7.2 数值等式检查

  • verifier 只检查数值

  • 最简形式:

$$ v_E \stackrel{?}{=} 0 $$

  • 若协议使用整除形式(常见):

$$ v_E \stackrel{?}{=} Z_H(z)\cdot T(z) $$

不成立 → 拒绝


8. 验证结束

  • 若所有检查通过 → Accept
  • 否则 → Reject

到此为止,整个 ZKP 流程结束 verifier 被数学上“强制相信”: 存在一组 witness,使所有约束成立


一句话总结

ZKP 的本质不是证明“我算了什么”, 而是证明: “我不可能在不知道 witness 的情况下,通过这些随机抽查。”

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors