这篇文章深入探讨了去中心化的可信设置仪式,介绍了如何通过智能合约在以太坊区块链上进行这一过程,以生成可用的密码学参数。文章还讨论了可信设置的历史、现有仪式的技巧与局限,并提供了治理仪式的思路和开源库,强调了在数字货币项目中保障安全性的重要性。
可信设置仪式是加密社区的痛苦 - 也是兴奋之一。仪式的目标是生成值得信赖的加密密钥,以保护加密钱包、区块链协议或零知识证明系统。这些(有时漂派)的程序通常是一个项目安全性的信任根源,因此将其做到正确极其重要。
区块链项目以多种创意方式进行仪式——涉及喷枪、放射性粉尘和飞机,但它们都有一个共同点:都涉及一个集中的协调者。通过这项工作,我们展示了如何将该过程去中心化,通过用智能合约替代中心化协调者。此外,我们还开源了一个库,允许任何人运行这样的仪式——被称为 Kate-Zaverucha-Goldberg (KZG) 或“tau的幂”仪式——在以太坊链上。任何人都可以通过支付交易费用参与其中!
我们的去中心化方案有局限性,但依然是有用的。由于当前链上数据的限制,加密参数的大小必须保持简短,即不超过 64 KB。但是参与者的数量没有上限,人们可以不断提交贡献。这些短参数的应用包括小型零知识 SNARK、数据可用性采样和 Verkle trees。
在典型的可信设置仪式中,一组参与者将协作生成一组加密参数。每个参与方使用秘密信息(在本地生成)来生成数据,以帮助创建这些参数。正确的设置确保机密信息不泄露,机密信息仅根据协议的指定使用,并且这些机密在仪式结束时完全销毁。只要仪式中的至少一方表现诚实、未被破坏并销毁其本地机密,则整个设置可以被视为安全。(当然,这假设数学是正确的,代码没有错误。)
一些最突出的仪式是由 Zcash 进行的,这是一个以隐私为导向的区块链项目。这些仪式的参与者生成了公共参数,旨在允许 Zcash 用户构建和验证私密的加密交易。六位参与者在 2016 年进行了第一次 Zcash 仪式 Sprout。两年后,加密研究员 Ariel Gabizon(目前是 Aztec 的首席科学家)发现了 一个致命的漏洞,该漏洞源自一篇 基础研究论文。该漏洞可能使攻击者在不被检测的情况下创建无限的 Zcash 货币。Zcash 团队在七个月内秘密维护该漏洞,直到针对 90 位参与者的系统升级 Sapling 解决了这个问题。尽管基于该安全漏洞的攻击不会影响用户交易的隐私,但无限伪造的前景削弱了 Zcash 的安全前提。(理论上我们无法确定是否发生了攻击。)
另一个值得注意的可信设置示例是为 Semaphore 设计的 永久“tau的幂”仪式,这是一项在以太坊上用于匿名信号传递的隐私保护技术。该设置使用 BN254 椭圆曲线,到目前为止已有 71 位参与者。后来的其他杰出项目也利用该设置进行自己的仪式,包括 Tornado.Cash(近期已受到美国政府制裁)、Hermez 网络以及 Loopring。 Aztec 在 BN254 曲线上协调了一次类似的仪式,以创建用于 PLONK zk-snarks 的通用公共参考字符串 (CRS)。作为一个“二层”以太坊扩展方案,zkSync 参与了该仪式,并使用该 CRS 来支撑其零知识汇总的安全性。去中心化数据存储协议 Filecoin 在第一次和第二次阶段分别进行了有 19 和 33 位参与者的仪式,该仪式分叉自原始仓库。区块链 Layer-1 项目 Celo 也为其轻客户端 Plumo 进行了一次仪式。
永久仪式的参与者数量没有上限。换句话说,与其信任他人进行可信设置仪式,任何人都可以根据自己的安全满意度参与其中。一个值得信赖的参与者可以确保所有生成参数的安全;链条的强度取决于它最强的环节。正如名字所暗示的,永久仪式可以一直进行,就像最初的 tau 的幂仪式的前提那样。尽管如此,项目通常会决定其仪式的具体开始和结束时间,这样他们可以将生成的参数嵌入到其协议中,而不必担心持续更新。
以太坊计划为即将到来的 ProtoDankSharding 和 DankSharding 升级运行一场较小的可信设置仪式。这两项升级将增加以太坊链向客户端提供的存储数据量。这些数据的有效期为建议的 30 到 60 天。该仪式正在 积极开发中,并计划于明年初运行六周。(有关详细信息,请参见 kzg-ceremony-specs)。这将成为迄今为止区块链上运行的最大可信设置仪式。
在可信设置仪式方面,偏执是一种美德。如果机器的硬件或软件被破坏,那就可能削弱它生成的机密的安全性。狡猾的侧信道攻击泄露机密也难以排除。例如,手机可以通过 记录声波 来窃听计算机的操作,例如 CPU 振动的音波。实际上,由于消除所有可能的侧信道攻击(包括尚未发现或披露的攻击)是极其困难的,甚至有人提出将机器送往太空进行 仪式。
目前,严肃仪式参与者的操作手册通常如下所示:购买一台新机器(无污染硬件)。通过移除所有网络卡将其与网络隔离(以防止本地机密离开机器)。在远程不公开的地点的法拉第笼中运行机器(以阻止窃听者)。用大量熵和硬复制数据填充伪随机秘密生成器,例如随机键击或视频文件(使机密难以破解)。最后,通过燃烧一切成为灰烬,摧毁机器及任何机密痕迹。😀
以下是来自一些之前可信设置仪式参与者的有趣引言:
Zcash powers-of-tau 仪式第 41 轮涉及了一架飞机。截屏:YouTube 视频
扎·威尔科克斯,Zcash 联合创始人 Zooko·威尔科克斯的弟弟,销毁 2016 年用于生成随机数的计算机。照片:Morgen Peck
所有这些仪式都依赖于一个集中协调者。协调者是一个个人、私人服务器或其他被信任的实体,负责登记和排序参与者,作为中继将信息从前一参与者转发给下一位,并保留所有通讯的集中日志以供审计之用。协调者通常还负责将该日志永久公开给公众;当然,使用集中系统,总有可能数据丢失或管理不当。(例如,perpetual-powers-of-tau 被存储在 Microsoft Azure 和 Github 上。)
我们觉得讽刺的是,当去中心化是加密理念的核心原则时,加密项目却必须依赖中心化的可信设置仪式。因此,我们决定示范直接在以太坊区块链上运行小型仪式的可行性!该设置完全去中心化、无需许可、抗审查,只要参与者中的任何一个诚实,它就是安全的[见 免责声明]。参与该仪式的成本仅为 292,600 到 17,760,000 gas(按当前价格约为 7 到 400 美元),具体取决于所需生成参数的大小(在本例中介于 8 和 1024 的 tau 幂)。 (有关具体成本,请参见下表——我们稍后会深入讨论这些计算。)
目前,我们建议不要将代码用于实验以外的任何用途!我们非常感谢任何发现代码问题的人向我们报告。我们希望收集有关我们方法的反馈和审核。
让我们探索最受欢迎的可信设置之一,称为 KZG 或“tau的幂”仪式。感谢以太坊联合创始人 Vitalik Buterin,他的 关于可信设置的博客文章 启发了我们在这一部分的想法。该设置生成 tau 的幂的编码,因此命名是因为 tau 恰好是用于表示参与者生成的机密的变量:
pp = [[𝜏]1, [𝜏2]1, [𝜏3]1, …, [𝜏n]1; [𝜏]2, [𝜏2]2, …, [𝜏k]2]
对于一些应用(例如 Groth16, JIDS 斯基姆 由 Jens Groth 在 2016 年设计),此设置的第一阶段后面跟随第二阶段,即多方计算(MPC)仪式,该仪式为特定 SNARK 电路生成参数。然而,我们的工作仅关注第一阶段。这个第一阶段——tau的幂的生成——已经作为通用 SNARK 的基础构建块非常有用(例如 PLONK 和 SONIC),以及其他加密应用,如 KZG 承诺、Verkle trees 和 数据可用性采样 (DAS)。通常,通用 SNARK 参数应非常大,以便能够支持大型有用电路。包含更多门的电路通常更有用,因为它们可以捕捉大型计算;tau的幂的数量大约对应电路中的门数。因此,典型的设置大小为 |pp| = ~40 GB,能够支持 ~228 门的电路。鉴于以太坊目前的限制,把这样大型的参数放在链上都是不切实际的,但可以在链上合理地运行一个针对小型 SNARK 电路、Verkle trees 或 DAS 的较小的可信设置仪式。
以太坊基金会计划在 [中文] 运行多个较小的 仪式,以生成大小为 200 KB 到 1.5 MB 的 tau 的幂参数。虽然较大的仪式可能看起来更好,因为较大的参数可以创造更有用的 SNARK 电路,但实际上,越大并不一定越好。某些应用程序(如 DAS)特别需要较小的一个![这个原因非常技术性,但如果你有好奇的话,这是因为一个具有 n 的幂(在 G1 中)的设置仅启用 KZG 对多项式的承诺,最高度 ≤ n,这对于确保 KZG-承诺底下的多项式可以从任何 n 个评估中重建这个特性至关重要。 这种属性使得数据可用性采样成为可能:每次成功获得 (采样) 的多项式可能的 t 随机评估都会给予一个概率 t/n,来确保可以完全重建多项式。如果你想了解更多关于 DAS 的信息,可以查看 Buterin 在以太坊研究论坛上的 帖子]
我们设计了一个智能合约,可以在以太坊区块链上部署以运行可信设置仪式。该合约将公共参数(tau 的幂)完全存储在链上,并通过用户的交易收集参与。
一个新参与者首先读取这些参数:
pp0 = ([𝜏]1, [𝜏2]1, [𝜏3]1, …, [𝜏n]1; [𝜏]2, [𝜏2]2, …, [𝜏k]2),
然后采样一个随机秘密 𝜏’ 并计算更新的参数:
pp1 = ([𝜏𝜏’]1, [(𝜏𝜏’)2]1, [(𝜏𝜏’)3]1, …, [(𝜏𝜏’)n]1; [𝜏𝜏’]2, [(𝜏𝜏’)2]2, …, [(𝜏𝜏’)k]2),
并在线上发布证明,证明三个事情:
智能合约验证该证明,如果验证正确,它会更新存储的公共参数。关于其数学和推理的更多细节请见 github repo。
在链上运行设置的主要挑战是使可信设置仪式尽可能节省 gas。理想情况下,提交一个贡献不应超过大约 $50。(大型项目可能能够为贡献者补贴 gas,这样每个参与者花费 100 美元更容易想象。)下面,我们提供关于设置中最昂贵部分的更多细节。降低 gas 成本将减少贡献的成本,并允许构建更长的参数(更多的 tau 的幂和更大的 SNARK 电路)!
我们的设置适用于椭圆曲线 BN254(也称为 BN256、BN128 和 alt_bn128),它在以太坊上支持以下预编译合约 EIP-1108:
如果以太坊能够支持 BLS12_381 (如在 EIP-2537 中提议的),我们的设置合约也可以轻松适应这个其他曲线。
让我们估算将设置更新到([𝜏]1, [𝜏2]1, [𝜏3]1, …, [𝜏n]1; [𝜏]2) 的 gas 成本:
e(𝝆0[1]1 + 𝝆1[𝜏]1 + 𝝆2[𝜏2]1 + … + 𝝆n-1[𝜏n-2]1, [𝜏]2) = e([𝜏]1 + 𝝆1[𝜏2]1 + … + 𝝆n-1[𝜏n-1]1, [1]2),
其中 𝝆0,…,𝝆n-1 是伪随机抽样的标量。在预编译智能合约方面,需要:
(2n-4) x ECADD + (2n-4) x ECMULT + ECPAIRk=2 = (2n-4) x 6,150 + 113,000 gas。
这使我们对以下表格估算 gas 成本,应该为未来的优化提供信息:我们正在探索降低 gas 成本的解决方案,请保持关注!
我们已在 github.com/a16z/evm-powers-of-tau 上开源了基于 EVM 的 tau 的幂仪式库。使用我们的策略进行仪式操作简单透明:
我们的库使用 arkworks-rs 来计算步骤两和三(rust 计算内容可见于 src/pot_update.rs),但用户可能希望自己编写。整个更新提交的端到端流程可以在 tests/integration_test.rs 的集成测试中找到。
请注意,我们选择使用 calldata 存储更新的 tau 的幂参数在链上,因为这是存储成本的几个数量级更便宜。针对这些数据的 ethers-rs 查询可以在 src/query.rs 中找到。
最后,证明和详细的方程可以在技术报告中找到:techreport/main.pdf。
在这个可信设置仪式可以用于生产之前,我们建议首先对数学证明和样本实现进行全面审计。
在实现方面,更新仪式的交易成本随设置大小线性增长。对于大多数应用(SNARK、DAS),我们希望的设置是 n >= 256,目前每次更新成本为 73 美元。
我们可能能够通过 STARK 证明有效更新计算和对更新值的向量承诺,来实现次线性验证成本的增长。这一构造还将去除对以太坊 L1 BN254 预编译的依赖,从而启用使用更流行的 BLS12-381 曲线。
所有仪式策略都有权衡。我们认为这个构造是稳固的,并具有出色的可验证抗审查属性。但我们仍然建议在做更多工作验证我们方法的合理性之前,不要使用这种方法。
编辑:Robert Hackett @rhhackett
- 原文链接: a16zcrypto.com/posts/art...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!