概念:承诺,是密码学中的概念,只有对于有界算力的参与者,才能提供可靠性和零知识,故而论证系统是基于承诺构建的。
IOP(Interactive Oracle Proof):理想协议,是信息论里的概念,无界算力保证零知识和可靠性,证明者提供与挑战者与M相关联的函数,但验证者只能通过放一些值确认函数是否正确,以验证了证明在确实拥有什么信息,这个过程已经隐藏了关键信息。(通过证明,非论证,实现了完美零知识)
定义:承诺方案是 PPT 算法的元组
分号";"后面表示的为非公开元素
- 𝑆𝑒𝑡𝑢𝑝(
$1^𝜆$ ) → 𝑝𝑝: 采用安全参数 𝜆(一元)并生成公共参数 𝑝𝑝; - 𝐶𝑜𝑚𝑚𝑖𝑡(𝑝𝑝; 𝑚) → (𝐶; 𝑟): 获取秘密消息 𝑚(信息域 𝑚 ∈
$M$ ) 并输出公开承诺 𝐶 和(可选)秘密打开提示 𝑟(可能为随机数) - 𝑂𝑝𝑒𝑛(𝑝𝑝, 𝐶; 𝑚, 𝑟) → 𝑏 ∈ {0,1}: 利用打开提示 𝑟,验证承诺 𝐶 对消息 𝑚 的打开,
零知识证明过程中Prover一般通过承诺Commitment来论证,多采用sigma protocol的形式,包含两个阶段
-
Commitment承诺阶段(Setup & Commit)
隐藏性hiding,该承诺不会泄露任何真实data,即拿到承诺本身,无法反猜回去信息(几率可忽略)
-
Response开启阶段 (Open)
绑定性binding,承诺只能由真实的data开启以供检验,且一一对应(几率可忽略)。
[m]表示单独一个数字
Pedersen 承诺是一个在消息空间
对于一个秘密消息 𝑚 ∈
-
𝑆𝑒𝑡𝑢𝑝 (
$1^𝜆$ , 𝑞) → 𝑝𝑝: 𝑝𝑝 = 𝐺, 𝐻 ∈ 𝔾,其中 𝔾 是一个阶为 q 的群。 -
𝐶𝑜𝑚𝑚𝑖𝑡 (𝑝𝑝; 𝑚) → (𝐶; 𝑟): 𝐶 = [𝑚]𝐺 + [𝑟]𝐻, 𝑟 ←
$𝔽_𝑞$ 。 -
𝑂𝑝𝑒𝑛 (𝑝𝑝, 𝐶; 𝑚, 𝑟) → {0,1}:证明者 P 揭示 m 和 r,验证者 V 检查 𝐶 → [𝑚]𝐺 + [𝑟]𝐻 是否成立。
零知识过程,实际就是对open过程拆开,verify验证是否相等,prover提供m,r
特性:加法同态性
-
𝐶𝑜𝑚𝑚𝑖𝑡(𝑚, 𝑟) + 𝐶𝑜𝑚𝑚𝑖𝑡(𝑚′ , 𝑟′)
= [𝑚]𝐺 + [𝑟]𝐻 + [𝑚′]𝐺 + [𝑟′]𝐻
= [𝑚 + 𝑚′]𝐺 + [𝑟 + 𝑟′]𝐻
= 𝐶𝑜𝑚𝑚𝑖𝑡(𝑚 + 𝑚′ , 𝑟 + 𝑟′)
实现了向量版本,很关键
将 Pedersen 承诺方案扩展到消息空间
对于一个消息
- 𝑆𝑒𝑡𝑢𝑝 (
$1^𝜆$ , 𝑞, 𝑘) → 𝑝𝑝:𝑝𝑝 = ($𝐺_0$ , … ,$𝐺_{𝑘−1}$ ), 𝐻 ∈ 𝔾,其中 𝔾 是一个阶 为 𝑞 的群。 - 𝐶𝑜𝑚𝑚𝑖𝑡 (𝑝𝑝;
$\vec{𝑚}$ ) → (𝐶; 𝑟): 𝐶 =$\sum_{𝑖=0}^{𝑘−1}{[𝑚_𝑖]𝐺_𝑖}$ ,𝑟 ←$𝔽_𝑞$ 。 - 𝑂𝑝𝑒𝑛 (𝑝𝑝, 𝐶;
$\vec{𝑚}$ , 𝑟) → {0,1}:- 证明者 Prover 揭示
$\vec{𝑚}$ 和 𝑟 - 验证者 Verifier 检查 𝐶
- 证明者 Prover 揭示
四、例3:双线性映射
如基于双线性paring的bls12-381曲线(ETH beacon BLS签名用到该曲线,但不是一回事)
给定循环群 𝔾1, 𝔾2, 𝔾𝑇,所有的阶均为素数 𝑝,其映射关系是一个非退化的双线性映射
- 双线性:
-
$𝑒([𝑎]𝑃, 𝑄)$ =$[𝑎]𝑒(𝑃, 𝑄)$ =$𝑒(𝑃, [𝑎]𝑄)$ -
$𝑒([𝑎]𝑃, [𝑏]𝑄)$ =$[𝑎 · 𝑏]𝑒(𝑃, 𝑄)$ =$𝑒(𝑃, 𝑄)^{(𝑎⋅𝑏) }$
-
- 非退化:
- 对于生成元
$𝐺_1$ ∈$𝔾_1$ 和$𝐺_2$ ∈$𝔾_2$ ,$𝐺_𝑇 := 𝑒(𝐺_1, 𝐺_2) ∈ 𝔾_𝑇$ 是一个生成元
- 对于生成元
五、例4:KZG承诺
论证实现完美零知识证明
KZG承诺是一个密码学技术,大致原理如下:
- 对多项式
$f(x)$ ,证明者通过椭圆曲线密码学技术,对该多项式做出承诺$C(f)$ :对于这个多项式的任意值$y = f(z)$ ,证明者可以计算出一个 "证明"$π(f,z)$ - 对于验证者,已知承诺
$C(f)$ ,给出证明$π(f,z)$ 、变量z、取值y 三个数据,验证者可以证实$f(z)= y$ ,即$(z,y)$ 确实在这个多项式函数上 - 这个证明无需验证者知道这个多项式具体是什么,并且它的时间开销近似为常数,因此具备高度的实用性和可扩展性
过程:
单变量多项式承诺方案是针对消息空间 𝔽 ≤𝑑 [𝑋] 的一种承诺方案。
-
ck:Proving key;vk:verify key
如
$[𝛼]_2$ : 表示在$𝐺_2$ 上的坐标srs:Structured Referenced String,结构化引用字符串,如这里{
$[𝛼]_1$ ,$[𝛼]_2$ ……}存的就是这样的string,并非相加等关系。-
𝛼 就是
$τ$ ,也是个随机数,相当于一个共识。是一个秘密元素,必须在 𝑆𝑒𝑡𝑢𝑝 后丢弃。KZG ceremony就是通过MPC安全多方计算在保护 𝛼 (只有提供随机数的人全部串通才有风险,任一诚实都无事)𝛼未知,但映射到点的坐标结果是有的,如
$[f(𝛼)]_1$
-
-
𝐶𝑜𝑚𝑚𝑖𝑡 (𝑐𝑘; 𝑓(𝑋)) → 𝐶:对于 𝑓(𝑋) =
$\sum_{𝑖=0}^{d−1}{𝑓_𝑖𝑋^𝑖}$ , 𝐶 =$\sum_{𝑖=0}^{d−1}{[𝑓_𝑖][𝛼^𝑖]_1 }$ =$[𝑓(𝛼)]_1$ .$F(x)$ ,$x$ 为消息参数,实际为一对一的映射关系,表示为多项式。$C$ 相当于是个坐标,以前是直接知道一个算出的消息$x$ 承诺,现在对多项式$f(x)$ 进行承诺 -
𝑂𝑝𝑒𝑛(𝑠𝑟𝑠, 𝐶, 𝑧, 𝑦; 𝑓(𝑋)) → {0,1}: 在评估点 𝑧 上打开对于 𝑦 的承诺
-
𝑃𝑟𝑜𝑣𝑒 (𝑐𝑘, 𝐶, 𝑧, 𝑦; 𝑓(𝑋)) →
$𝜋$ $𝜋$ 为精简的证据,是一个点坐标,可以看到verify过程传入π而没传$f(x)$ )零知识的点:利用ck与vk的双线性映射关系,ck产生的commit能通过vk验证
-
商多项式 𝑞(𝑋) =
$\frac{𝑓(𝑋)−𝑦}{ 𝑋−𝑧}$ , 𝜋 = 𝐶𝑜𝑚𝑚𝑖𝑡 (𝑐𝑘; 𝑞(𝑋)) =$[𝑞(𝛼)]_1$ 商多项式:多项式/多项式 仍 = 合法多项式(不含有余数等等)。即通过验证商多项式是有效的,论证已得到了正确解,例如:
-
-
-
𝑉𝑒𝑟𝑖𝑓𝑦 (𝑣𝑘, 𝐶, 𝑧, 𝑦, 𝜋) → {0,1}
-
检查是否可以推出 𝑒(𝐶 −
$[𝑦]_1$ ,$[1]_2$ ) ← 𝑒($𝜋$ ,$[𝛼]_2$ −$[𝑧]_2$ ).e:双线性映射,常数复杂度,所以验证是十分快速的
-
注:circom中的约束到上述这些公式中的参数,非直观一一对应,被打散到了多项式里,中间还包含算术化(详见算术化章节)的过程