Skip to content

Latest commit

 

History

History
100 lines (93 loc) · 3.15 KB

3.kzg多项式承诺.md

File metadata and controls

100 lines (93 loc) · 3.15 KB

KZG 承诺是一种多项式承诺方案,允许证明者对一个多项式进行承诺,并且能够在之后证明多项式在某点的取值 核心组件

  • 多项式承诺
  • 椭圆曲线配对
  • 信任设置

1. 基本概念

1.1 核心要素

  • 多项式: f(x) 是要承诺的多项式
  • 可信设置: 一组特殊的椭圆曲线点,称为"结构化参考串"(SRS)
  • 承诺值: 单个椭圆曲线点
  • 证明: 用于验证多项式在特定点的取值

1.2 可信设置(Trusted Setup)

  • 需要生成一组特殊的椭圆曲线点:[G, τG, τ²G, ..., τⁿG]
  • τ是一个秘密值,生成后必须销毁
  • 这些点将用作公共参数

2. KZG 承诺的三个阶段

2.1 承诺阶段

  1. 证明者有一个多项式 f(x) = a₀ + a₁x + a₂x² + ... + aₙxⁿ
  2. 使用 SRS (结构化参考字符串) 计算承诺值:
    C = a₀G + a₁(τG) + a₂(τ²G) + ... + aₙ(τⁿG)
  3. 发布承诺值 C

2.2 求值阶段

  1. 验证者选择一个点 z
  2. 证明者计算:
  • y = f(z)(多项式在点 z 的值)
  • 证明 π(用于证明计算正确性)

2.3 验证阶段

验证者检查证明是否有效,确认 y 确实是 f(z) 的值

// 结构化参考字符串
type SRS struct {
    // 特殊结构:[G, τG, τ²G, ..., τⁿG]
    G1Points []Point  // G1群上的点
    G2Points []Point  // G2群上的点
    MaxDegree int     // 支持的最大多项式度数
}

// KZG承诺中的SRS
func SetupSRS(secret Fr) SRS {
    // τ 是秘密值(需要销毁)
    points := make([]Point, maxDegree+1)
    for i := 0; i <= maxDegree; i++ {
        // 生成 τⁱG
        points[i] = G.Mul(secret.Pow(i))
    }
    return SRS{points}
}

3. KZG 承诺的特性

  1. 简洁性
  • 承诺大小是常数(单个椭圆曲线点)
  • 证明大小也是常数
  • 验证时间是常数级别
  1. 透明性
  • 一旦完成可信设置,系统运行不需要可信第三方
  • 验证过程完全公开
  1. 承诺-求值性
  • 可以证明多项式在任意点的取值
  • 支持批量证明
  1. 同态特性
  • 支持承诺的加法运算
  • 支持承诺的标量乘法
  • 有助于构建更复杂的零知识证明系统

4. 应用场景

  • 区块链扩容
    • 用于 rollup 中的数据可用性采样
    • 证明状态转换的正确性
  • 零知识证明
    • 作为 PLONK 等证明系统的基础组件
    • 用于构建简洁的证明
  • 向量承诺
    • 可以将多项式看作向量的插值
    • 用于证明向量中某个位置的值

5. 安全考虑

  • 可信设置的安全性

    • τ 值必须安全生成后销毁
    • 通常需要多方参与的可信设置仪式
  • 离散对数难题

    • 安全性基于椭圆曲线上的离散对数假设
    • 需要选择安全的椭圆曲线参数
  • 可信设置泄露

    • 如果 τ 泄露,整个系统安全性崩溃
    • 需要严格的生成和销毁流程

6. 优缺点对比

6.1 优点

  • 承诺和证明大小都是常数级
  • 验证效率高
  • 支持同态运算
  • 适合构建零知识证明系统

6.2 缺点

  • 需要可信设置
  • 计算承诺相对复杂
  • 对量子计算不安全
  • 设置大小与多项式度成正比