KZG 承诺是一种多项式承诺方案
,允许证明者对一个多项式进行承诺,并且能够在之后证明多项式在某点的取值
核心组件
- 多项式承诺
- 椭圆曲线配对
- 信任设置
- 多项式: f(x) 是要承诺的多项式
- 可信设置: 一组特殊的椭圆曲线点,称为"结构化参考串"(SRS)
- 承诺值: 单个椭圆曲线点
- 证明: 用于验证多项式在特定点的取值
- 需要生成一组特殊的椭圆曲线点:
[G, τG, τ²G, ..., τⁿG]
τ
是一个秘密值,生成后必须销毁- 这些点将用作公共参数
- 证明者有一个多项式
f(x) = a₀ + a₁x + a₂x² + ... + aₙxⁿ
- 使用 SRS (结构化参考字符串) 计算承诺值:
C = a₀G + a₁(τG) + a₂(τ²G) + ... + aₙ(τⁿG)
- 发布承诺值 C
- 验证者选择一个点 z
- 证明者计算:
y = f(z)
(多项式在点 z 的值)- 证明 π(用于证明计算正确性)
验证者检查证明是否有效,确认 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}
}
- 简洁性
- 承诺大小是常数(单个椭圆曲线点)
- 证明大小也是常数
- 验证时间是常数级别
- 透明性
- 一旦完成可信设置,系统运行不需要可信第三方
- 验证过程完全公开
- 承诺-求值性
- 可以证明多项式在任意点的取值
- 支持批量证明
- 同态特性
- 支持承诺的加法运算
- 支持承诺的标量乘法
- 有助于构建更复杂的零知识证明系统
- 区块链扩容
- 用于 rollup 中的数据可用性采样
- 证明状态转换的正确性
- 零知识证明
- 作为 PLONK 等证明系统的基础组件
- 用于构建简洁的证明
- 向量承诺
- 可以将多项式看作向量的插值
- 用于证明向量中某个位置的值
-
可信设置的安全性
- τ 值必须安全生成后销毁
- 通常需要多方参与的可信设置仪式
-
离散对数难题
- 安全性基于椭圆曲线上的离散对数假设
- 需要选择安全的椭圆曲线参数
-
可信设置泄露
- 如果 τ 泄露,整个系统安全性崩溃
- 需要严格的生成和销毁流程
- 承诺和证明大小都是常数级
- 验证效率高
- 支持同态运算
- 适合构建零知识证明系统
- 需要可信设置
- 计算承诺相对复杂
- 对量子计算不安全
- 设置大小与多项式度成正比