Plonk的Setup阶段
在 Plonk 的 Setup 阶段(SRS 生成阶段),我们会先得到一个结构化参考字符串 (Structured Reference String, SRS)。 SRS 包含了某个秘密指数
这一步是 一次性且全局的(通用 SRS)。
然后针对具体电路
其中PK元组包含的内容有电路中每个门、置换、约束的多项式(用
Plonk中实现VK唯一性的方式
电路的数学表达:在 PLONK 中,一个电路
VK 是对电路的承诺: VK 的核心组成部分,正是对这些定义了电路结构的多项式的承诺(Commitment)。具体来说,它包含了(但不限于)在 SRS 的秘密点 s 上对这些多项式求值的承诺值:
当 statement 的语义实质不同,电路结构就会不同.
例子:
用户 A 证明「我知道 VK_A 对应的 proving key PK_A」
用户 B 证明「我知道 VK_B 对应的 proving key PK_B」
如果这两个 VK 对应的电路逻辑不同(例如算术门数量不同、约束矩阵不同),
那么它们的结构
因此得到的 VK(Verification Key)也必然不同。
也就是说:
-
如果 “知道 PK_A” 和 “知道 PK_B” 需要在电路中实现不同逻辑 → 电路不同;
-
如果两者都调用相同的 verifier 函数,只是参数不同 → 电路相同。
采用加盐值 (salt) 实现VK唯一性
如需「每个用户不同的 VK」情况,可以通过:
-
在电路定义中加入用户特定常数(如 public key、salt、session id);
-
或在生成电路时,将这些常数“编译”进电路;
-
从而使电路结构
不同,VK 随之不同。
形式上:
相比修改系数也能让 VK 不同,但这样意味着:
-
电路逻辑必须变化;
-
电路重新编译(需要重新生成约束系统);
-
不能通用复用。
而 “salt” 的方式是:
-
在电路中增加一个公共输入常数;
-
该常数参与某个哈希或门约束;
-
逻辑上仍然相同,但电路实例(即具体系数值)不同;
-
因此 VK 也唯一化,但电路模板仍可通用。
项目描述中关于Salt的担忧以及建议
担忧主要来自对 "salt" 这个词在密码学中传统用法的理解,例如在哈希函数或密钥派生函数(KDF)中:
-
传统 Salt (如密码哈希):
-
目的: 增加熵,对抗预计算攻击(如彩虹表)。
-
性质: 必须是随机或至少是唯一的。
-
安全疑虑: 如何安全地存储 salt,如何保证其随机性。
然而,在 PLONK 电路中用于实现 VK 唯一性的这个 "salt",其角色和安全模型完全不同。我们可以通过重新定义这个 "salt" 的作用来打消文档读者们的担忧。
这里的 "Salt" 不是熵源,而是“域分离符” (Domain Separator)
将这个 "salt" 理解为一个公开的、确定性的标识符会更加准确。它的作用不是增加随机性,而是为了进行域分离——即,将一个通用的电路模板,在密码学上清晰地分割成多个互不相关的、唯一的实例。

