变量值一致性检查的优化

变量值一致性检查现在是有效的,但它在验证密钥中增加了 4 个昂贵的配对运算和 4 个新术语。Pinocchio 协议 [Par+13] 通过为每个操作数巧妙地选择生成元 \(g\) 来固化(Ingrain)「移位」:

  • 设置
    • \(\ldots\) 选择随机值 \(\beta, \gamma, \rho_l, \rho_r\) 并设置 \(\rho_o = \rho_l \cdot \rho_r\)
    • 设置生成元 \(g_l = g^{\rho_l}, g_r = g^{\rho_r}, g_o = g^{\rho_o}\)
    • 生成证明密钥: $$\left(\left\{ g^{s^k} \right\}_{k \in [d]}, \left\{g_l^{l_i(s)}, g_r^{r_i(s)}, g_o^{o_i(s)}, g_l^{\alpha_l l_i(s)}, g_r^{\alpha_r r_i(s)}, g_o^{\alpha_o o_i(s)}, g_l^{\beta l_i(s)} \cdot g_r^{\beta r_i(s)} \cdot g_o^{\beta o_i(s)} \right\}\right)$$
    • 生成验证密钥:\(\left(g_o^{t(s)}, g^{\alpha_l}, g^{\alpha_r}, g^{\alpha_o}, g^{\beta \gamma}, g^\gamma \right)\)
  • 证明
    • \(\ldots\) 赋变量值 $$g^{Z(s)} = \prod_{i=1}^n \left( g_l^{\beta l_i(s)} \cdot g_r^{\beta r_i(s)} \cdot g_o^{\beta o_i(s)} \right)^{v_i}$$
  • 验证
    • \(\ldots\) 检查变量多项式限制: $$e\left( g_l^{L'}, g \right) = e\left( g_l^{L}, g^{\alpha_l} \right),g_r^{R}, g_o^{O} \ 同理$$
    • 检查变量值一致性: $$e\left( g_l^{L} \cdot g_r^{R} \cdot g_o^{O}, g^{\beta \gamma} \right) = e\left( g^{Z}, g^\gamma \right)$$
    • 检查运算的有效性: $$e\left( g_l^{L} \cdot g_r^{R} \right) = e\left( g_o^t, g^h \right) e\left( g_o^O, g \right) \Rightarrow$$ $${e\left( g, g \right)}^{\rho_l \rho_r L R} = {e\left( g, g \right)}^{\rho_l \rho_r th + \rho_l \rho_r O}$$

生成元的这种随机化进一步增加了安全性,使变量多项式的延展性(在备注 4.1 中描述)无效,因为对于有意的更改,它必须是 \(\rho_l\)、\(\rho_r\) 或 \(\rho_o\) 的倍数,原始或加密的版本是不可用的(假设,如上文所述我们不处理可能暴露加密版本的 0 阶变量多项式)。

这个优化使验证密钥小了两个元素,并消除了验证步骤中的两个配对运算。

注:Jens Groth 的 2016 年论文 [Gro16] 中有进一步的协议改进。

译者注:至此,通用 zk-SNARK 协议几乎已经构造完成了,可以归纳为以下几点:

  • 如何增加变量系数、如何做加减乘除运算

  • 如何保证操作数和输出的不可互换性

  • 如何保证跨操作数的变量一致性

  • 如何处理变量和变量一致性多项式的非延展性

  • 变量值一致性检查的优化