信任多个参与方中的一个
尽管可信任设置很有效率,但众多 CRS 用户也必须要相信生成者确实删除了 \(\alpha\) 和 \(s\),这一点没有办法证明(无知证明,即 Proof of Ignorance,是一个正在积极研究的领域 [DK18]),所以这种方法依然是无效率的。很有必要去最小化或者消除这种信任。否则一个不诚实的参与方就可以构造假证明而不被发现。
一种解决办法就是由多个参与方使用前面小节中介绍的数学工具来生成一个复合 CRS,这样这些参与方就都不知道秘密了。这里是一个实现方案,我们假设有三个参与者 Alice,Bob 和 Carol ,对应为 A、B 和 C,其中 \(i\) 为 \(1, 2, \ldots, d\):
-
Alice 选择随机值 \(s_A\) 和 \(\alpha_A\),然后公开她的 CRS:
$$\left( g^{s^i_A}, g^{\alpha_A}, g^{\alpha_A s^i_A} \right)$$
-
Bob 选择他的随机数 \(s_B\) 和 \(\alpha_B\),然后通过同态乘法结合 Alice 的 CRS:
$$\left( \left(g^{s^i_A}\right)^{s^i_B}, \left(g^{\alpha_A}\right)^{\alpha_B}, \left(g^{\alpha_A s^i_A}\right)^{\alpha_B s^i_B} \right) = \left(g^{{(s_A s_B)}^i}, g^{\alpha_A \alpha_B}, g^{\alpha_A \alpha_B {(s_A s_B)}^i}\right)$$
然后公开两方 Alice-Bob 的 CRS 结果:
$$\left(g^{s_{\mathsf{AB}}^i}, g^{\alpha_{\mathsf{AB}}}, g^{\alpha_{\mathsf{AB}}\ s_{\mathsf{AB}}^i}\right)$$
-
Carol 用她的随机数 \(s_C\) 和 \(\alpha_C\) 做同样的事:
$$\left(\left( g^{s_{\mathsf{AB}}^i} \right)^{s^i_C}, \Big( g^{\alpha_{\mathsf{AB}}} \Big)^{\alpha_C}, \left( g^{\alpha_{\mathsf{AB}}\ s_{\mathsf{AB}}^i} \right)^{\alpha_C s^i_C}\right) = \left(g^{\left(s_A s_B s_C \right)^i}, g^{\alpha_A \alpha_B \alpha_C}, g^{\alpha_A \alpha_B \alpha_C {(s_A s_B s_C)}^i}\right)$$
然后公开 Alice-Bob-Carol 的 CRS:
$$\left(g^{s_{\mathsf{ABC}}^i}, g^{\alpha_{\mathsf{ABC}}}, g^{\alpha_{\mathsf{ABC}}\ s_{\mathsf{ABC}}^i}\right)$$
这个协议的结果是,我们获得了一个复合的 \(s^i = s^i_A s^i_B s^i_C\) 和 \(\alpha = \alpha_A \alpha_B \alpha_C\),除非他们串谋,否则参与者们互相之间并不知道其他人的秘密参数。事实上,一个参与者必须要和其他所有的参与者串谋才能得到 \(s\) 和 \(\alpha\)。因此在所有的参与者中只要有一个是诚实的,就没有办法伪造证明。
注:可以根据需要为尽可能多的参与者重复此过程。
可能会遇到的问题是如何验证参与者在每个 CRS 中使用了一致的值,因为对手可以将不对应的 \(s_1, s_2, \ldots\) 和 \(\alpha_1, \alpha_2, \ldots\) 相乘,并将它们随机用于不同的 \(s\) 幂(或提供随机数作为结合的公共参考字符串),使 CRS 无效且不可用。
幸运的是,因为我们可以使用配对来乘以加密值,所以我们就可以从第一个参数开始逐一执行一致性校验,并确保每下一个参数都是从它派生的。参与者发布的每个 CRS 都可以检查如下:
-
我们用 \(s\) 的 1 次幂作为标准来校验每一个其他次幂的值是否与之保持一致:
$$\left. e\left(g^{s^i}, g\right) = e\left(g^{s^1}, g^{s^{i-1}}\right) \right|_{i \in \{2, \ldots, d\}}$$
例如:
- 2 次幂:\(e\left(g^{s^2}, g\right) = e\left(g^{s^1}, g^{s^{1}}\right) \Rightarrow {e(g,g)}^{s^2} = {e(g,g)}^{s^{1+1}}\)
- 3 次幂:\(e\left(g^{s^3}, g\right) = e\left(g^{s^1}, g^{s^{2}}\right) \Rightarrow {e(g,g)}^{s^3} = {e(g,g)}^{s^{1+2}}\) 等
-
我们现在再验证一下前面步骤中 \(\alpha\)-移位后的值是否正确:
$$\left. e\left(g^{s^i}, g^{\alpha}\right) = e\left(g^{\alpha s^i}, g\right)\right|_{i \in [d]}$$
例如:
- 3 次幂:\(e\left(g^{s^3}, g^{\alpha}\right) = e\left(g^{\alpha s^3}, g\right) \Rightarrow {e(g,g)}^{s^3 \cdot \alpha} = {e(g,g)}^{\alpha s^3}\) 等
这里 \(i \in \{2, \ldots, d\}\) 是「\(i\) 值分别为 \(2, 3, \ldots, d\)」的缩写形式,\([d]\) 是 \(1, 2, \ldots, d\) 这个范围的缩写形式,在后面的章节这种表示方式更为常见
当我们在验证每一个参与者秘密参数的一致性时,要注意参与者生成 CRS 的过程并没有强制后一个参与者(就是我们例子中的 Bob 和 Carol)都要使用前面已经公开的 CRS。因此当一个攻击者是链上的最后一个参与者时,他就可以像链上的第一个参与者一样忽略前面的 CRS 随便构造一个有效的 CRS,这样他就变成了唯一一个知道秘密 \(s\) 和 \(\alpha\) 的人。
为了解决这个问题,我们可以额外再要求除了第一个以外的每一个参与者去加密然后公开他的参数。例如,Bob 同样公开了:
$$\left. \left(g^{s^i_B}, g^{\alpha_B}, g^{\alpha_B s^i_B}\right) \right|_{i \in [d]}$$
这就可以去验证 Bob 的 CRS 是乘以了 Alice 的参数后正常获得的,这里 \(i\) 为 \(1, 2, \ldots, d\):
- \(e\left({g^{s^i_{\mathsf{AB}}}, g}\right) = e\left({g^{s^i_A}, g^{s^i_B}}\right)\)
- \(e\left({g^{\alpha_{\mathsf{AB}}}, g}\right) = e\left({g^{\alpha_A}, g^{\alpha_B}}\right)\)
- \(e\left({g^{\alpha_{\mathsf{AB}}\ s^i_{\mathsf{AB}}}, g}\right) = e\left({g^{\alpha_A s^i_A}, g^{\alpha_B s^i_B}}\right)\)
同样,Carol 必须证明她的 CRS 是 Alice-Bob 的 CRS 的适当倍数。
这是一个健壮的 CRS 设置模式,并不完全依赖于任何一方。事实上,即使其他所有的参与者都串谋了,只要有一个参与者是诚实的,删除并且永远不共享他的秘密参数,这个 CRS 就是有效的。所以在 CRS 设置(有时被称为仪式,即 Ceremony [Wil16])的时候不相关的参与者越多,伪造证明的可能性就越小。当有相互竞争的参与方参与的时候,就几乎不可能伪造证明了。该方案允许涉及对设置的易读性有疑问的其他不受信任的参与方,因为验证步骤确保他们不会破坏(这里也包括很弱的 \(\alpha\) 和 \(s\) 的使用)最终的公共参考字符串。
译者注:现在有一些 zk-SNARK 方案支持可升级的 CRS,任何怀疑 CRS 的参与方都可以对 CRS 进行更新。此外还有一些 zk-SNARK 方案支持通用 CRS(Universal CRS),不需要对每一个电路进行受信任设置,只需要全局完成一次即可。除此之外,大量无需 Trusted Setup 的方案也正在被研究之中。