4.5 可信设置与透明性:仪式里的信任工程 本节摘要:配对路线的证明系统需要一次可信设置(trusted setup)——生成一组事后必须销毁的"有毒参数"。本节讲清仪式到底在做什么、参数泄露的灾难形态、"多参与方只要一人诚实即安全"的门限逻辑,以及透明路线对这套机制的彻底取缔。承接 4.4 的算术化,通往第 5 章的安全与性能对账。 被焚烧的垃圾与被信任的一人 4.3 节说 KZG 承诺需要"仪式产出的秘密数 τ",现在把它拆开。设置阶段要生成的是一组形如 g、g^τ、g^(τ²)、…… 直到电路所需阶数的群元素序列(常称 powers of tau)。这些公开元素足以让任何人计算多项式承诺,但 τ 本身必须永远消失——它就是所谓的"有毒废料"(toxic waste)。为什么必须烧?
本节摘要:配对路线的证明系统需要一次可信设置(trusted setup)——生成一组事后必须销毁的"有毒参数"。本节讲清仪式到底在做什么、参数泄露的灾难形态、"多参与方只要一人诚实即安全"的门限逻辑,以及透明路线对这套机制的彻底取缔。承接 4.4 的算术化,通往第 5 章的安全与性能对账。
4.3 节说 KZG 承诺需要"仪式产出的秘密数 τ",现在把它拆开。设置阶段要生成的是一组形如 g、g^τ、g^(τ²)、…… 直到电路所需阶数的群元素序列(常称 powers of tau)。这些公开元素足以让任何人计算多项式承诺,但 τ 本身必须永远消失——它就是所谓的"有毒废料"(toxic waste)。为什么必须烧?看泄露后的灾难形态:
持有 τ 的攻击者可以伪造任意多项式的合法承诺与开箱证据。证明系统的安全声明是"只有真正掌握见证 w 的人才能造出通过的证明",而 τ 在手意味着攻击者可以绕过见证、直接在指数世界里装配出与诚实证明不可区分的数据。验证者毫无察觉——因为验证逻辑本来就是围绕 τ 的结构设计的。一次泄露,全线失守,且历史记录无法追查哪些证明是伪造的。这是配对路线所有方案(Groth16、Plonk 系、KZG 数据可用性)共同的阿喀琉斯之踵。
用一段玩具演算直观看一眼"τ 在手即为王":
# 有毒参数演示:知道 tau 的人可以为"任何点值"补造承诺(KZG 思想的玩具化) P = 1000003 g = 5 # 群生成元的角色(玩具用普通乘法群) tau = 88883 # 仪式秘密:验证者永远不该知道 degree = 6 powers = [pow(g, pow(tau, i, P - 1), P) for i in range(degree + 1)] # 公开的参数序列 def commit(coeffs): # 承诺 = 群元素的加权组合 c = 1 for coef, gp in zip(coeffs, powers): c = c * pow(gp, coef, P) % P return c f = [4, 2, 3, 1] # 诚实多项式 f(x)=x^3+3x^2+2x+4 C = commit(f) z, y = 10, pow(10, 3) + 3 * 100 + 20 + 4 # 开箱:z=10 处的值 y=1324 # —— 作弊剧本:没有任何 f 的人也能造出"可通过的"数据 —— attacker_claims_y = 999 # 随口谎报 f(10) = 999 # 诚实世界里这需要商多项式;但 τ 在手,直接算出 f(τ) 所需的"修正项": f_tau = sum(c * pow(tau, i, P - 1) for i, c in enumerate(f)) % (P - 1) # 攻击者用 τ 构造一个伪装多项式 h,使 h(τ) 与声称值自洽: h_coeffs = [attacker_claims_y] # 常数多项式 h(x) = 999 C_fake = commit(h_coeffs) print("诚实承诺 C =", C) print("伪造承诺 C_fake =", C_fake) print("两者都能通过以群等式为核的验证逻辑(玩具化演示的核心思想)") # 真实 KZG 中伪造需配对等式配合,但 τ 泄露同样使"无见证构造证据"成为可能
演算不必纠结玩具化细节,结论已经足够锋利:设置秘密是诚实与伪造的分界线。这就是为什么主流方案的仪式都把"销毁证明"当作头等大事,也是安全审计里专门设检查项的地方。
单人生成参数当然不行——你凭什么信他烧了?密码学给的答案是把生成变成接力式多方计算:参与者依次加入,每人拿到上一棒的参数后混入自己的随机数(τ_total = ((τ₁)² + r₂)³ + …… 这类嵌套混合),再传给下一棒。安全性来自一条优雅的门限逻辑:只要接力链上至少一人诚实地删除了自己的随机数,最终 τ 就无法被任何人复原——包括其他参与者自己。攻击者需要收买或攻破整条链上的每一个人,这把信任假设从"信任一人"变成了"信任不能全员串通",信任浓度骤降。
工程上还有三道配套保险。其一,全程可验证:每一步贡献都公开留痕(transcript 上链或公开存档),任何人可复核"输出确实是输入与某个随机性的合法混合"。其二,参与无门槛:任何人都可以往接力链上加一段随机性——哪怕你只是随手熵增一下,也实实在在地稀释了风险。其三,规模换信心:历史仪式(如持续性公开仪式)吸引数千参与者,"全部串通"的假设在现实博弈里近乎荒谬。

传统仪式与电路绑定——业务一改,仪式重来,这在 3.3 节已经吐槽过。两代改进分别是"通用可升级设置"(一次仪式覆盖所有电路,后续还可叠加新随机性)与"彻底透明"(无仪式)。三者的信任开销排序:电路专属仪式大于通用仪式大于零仪式;对应的代价分别是电路变更成本、验证开销增量、证明体积增量。选型时把这张排序表和 3.3 的对账表叠在一起读,结论就完整了:仪式不是道德问题,是一笔可以计算、可以摊薄、也可以花钱免除的信任开销。
道具箱到此清点完毕。第 5 章换两顶帽子:安全员的(攻击向量、假设寿命、实现陷阱)与账房的(证明时间、验证时间、证明体积三本账)。
把仪式从概念落到现场:公开接力仪式的参与流程通常是三步。领取:参与者下载当前状态参数,本地校验全部历史证明链(任何一步对不上就终止,说明链条被污染)。混合:本地生成一段高熵随机数混入参数,运行官方脚本产出新参数与本次贡献的证明——脚本开源可自行替换,但自写实现要自担正确性风险。提交与销毁:上传新参数与证明,本地用随机数覆盖写、断电重启等方式销毁秘密,随后可以公开声明参与(也可以匿名)。整个过程半小时量级,一台普通笔记本就能完成。参与的价值不只是心理安慰:每多一个独立参与者,"全员串通"假设的现实概率就再降一截——这正是仪式设计的原意。
**问:仪式参数能复用吗?**通用仪式的参数可以被所有同承诺方案的电路复用,这正是"通用"的含义;但跨方案复用要谨慎——承诺方案不同,参数结构就不同。复用的安全边界由方案文档明确划定,越界复用属于未经分析的自担风险。
**问:透明路线完全没有信任假设吗?**不是没有,是换了形态:它假设"所用的哈希函数保持抗碰撞"——这仍是一个假设,只是足够基础、被全世界检验了几十年。密码学没有零假设的方案,只有假设更少、更基础、更难被推翻的方案。读安全声明时看假设清单的长短与"基础程度",别被"无需信任"的宣传词带偏。
**问:仪式被证明作恶了怎么办?**这就是参数与方案绑定的后果:涉事方案的所有历史证明全部存疑,需要换参数重走仪式并重出全部证明——商业上近乎重做项目。所以主流项目的仪式都刻意做成"方案无关的超大参数集"(同一份参数服务多个方案),把单点事故的爆炸半径预先隔开。