可信设置仪式(Trusted Setup Ceremony)虽然一直向加密社区发起挑战,但这绝对也是最能让加密社区兴奋的环节。仪式的目标是生成可靠的加密密钥,用于保护加密钱包、区块链协议或零知识证明系统。这些程序是项目安全性的信任之根,因此确保分毫不差的操作和执行可信设置仪式至关重要。
目前区块链项目进行可信设置仪式的形式多种多样,包括但不限于 blowtorches、radioactive dust 以及 airplanes 等,而这几种形式都有一个共同点,也就是他们都依赖于一个中心化的协调器。本文将展示如何通过智能合约替换中心化协调器来让流程实现去中心化,与此同时我们还会开源一个库,允许任何人在以太坊上运行被加密从业者称为 Kate-Zaverucha-Goldberg(KZG)或「powers-of-tau」的仪式。
我们的去中心化方法有局限性,但它仍然有用。由于当前的链上数据限制,加密参数的大小必须保持不超过 64 KB。但是参与者的数量没有上限,任何人在任何时候都能提交贡献。这些短参数的应用包括小型零知识 SNARK、数据可用性采样和 Verkle 树等。
可信设置仪式的历史和机制
在典型的可信设置仪式中,一组参与者将协作生成一组加密参数。每个参与方都使用本地生成的加密信息来生成有助于创建这些参数的数据。适当的设置可以确保加密信息不会泄露,加密信息仅能被按照协议指定使用,并且这些加密信息在仪式结束时会被完全销毁。只要仪式中至少有一方保证诚实并且(在仪式结束后)销毁了加密信息,那么整个流程就可以被视作是安全的。(当然,前提是代码没有错误)
一些最突出的仪式是由 Zcash 推出的,这是一个以隐私为导向的区块链项目。这些仪式的参与者生成了公共参数,旨在允许 Zcash 用户构建和验证私人加密交易。六名参与者在 2016 年举办了第一届 Zcash 仪式 Sprout。两年后,加密研究员 Ariel Gabizon,现在是 Aztec 的首席科学家,在仪式的设计中发现了一个毁灭性的错误,这个错误是从一篇基础研究论文中继承下来的。该漏洞可能使攻击者能够在不被检测到的情况下创建无限的 Zcash 硬币。Zcash 团队将这个漏洞保密了七个月,直到系统升级 Sapling(其仪式涉及 90 名参与者)解决了这个问题。虽然基于安全漏洞的攻击不会影响用户交易的隐私,但无限伪造的前景破坏了 Zcash 的安全前提。(从理论上讲,不可能知道是否发生了攻击。)
可信设置的另一个值得注意的例子是永久的「tau-power-of-tau」仪式,该仪式主要为 Semaphore 设计,Semaphore 是一种用于以太坊上匿名信令的隐私保护技术。该设置使用 BN254 椭圆曲线,到目前为止已有 71 名参与者。其他着名的项目后来使用这种设置在顶部运行自己的仪式,包括 Tornado.Cash(最近得到美国政府的批准),Hermez 网络和 Loopping。 阿兹特克在 BLS12_381 椭圆曲线上举行了类似的仪式,有 176 名参与者参加 zkSync,这是一个「第二层」以太坊扩展解决方案,使用零知识汇总。 Filecoin 是一种分散的数据存储协议,分别在第一阶段和第二阶段与 19 名和 33 名参与者一起举行了仪式,分叉了原始存储库。 Celo 是一个 1 层区块链,也为他们的轻量级客户端 Plumo 举办了一个仪式。
永久仪式对参与者人数没有限制。换句话说,任何人都可以参与任何程度的安全,而不是信任其他人来运行受信任的设置仪式。一个值得信赖的参与者确保所有结果参数的安全性; 链条与其最强的环节一样强大。顾名思义,永久仪式可以永久举行,就像原始的 tau 权力仪式的前提一样。也就是说,项目通常会决定仪式的具体开始和结束时间,这样他们就可以将生成的参数嵌入到协议中,而不必担心不断更新它们。
以太坊计划为即将到来的 ProtoDankSharding 和 DankSharding 升级运行一个较小的可信设置仪式 。这两次升级将增加以太坊链提供给客户端进行存储的数据量。此数据的有效期为建议的 30 到 60 天。该仪式正在积极开发中,计划于明年初持续六周。(请参见 kzg-ceremony-specs 了解更多详情。它正在成为迄今为止最大的区块链可信设置仪式。
偏执是一种「美德」,尤其当涉及到可信的设置仪式时。如果机器的硬件或软件受到损害,则可能会破坏其生成的秘密的安全性。泄露秘密的偷偷摸摸的侧信道攻击也很难排除。例如,手机可以通过记录 CPU 振动的声波来监视计算机的操作。在实践中,由于很难消除所有可能的侧信道攻击 – 包括那些尚未发现或披露的攻击 – 甚至有人提议将机器飞到太空在那里举行仪式。
目前,严谨的仪式参与者的剧本通常如下。购买新机器(未受污染的硬件)。通过移除所有网卡(以防止本地机密泄露)来进行风险隔离。在法拉第笼中远程未公开的位置运行机器(以挫败潜在的窥探者)。为伪随机加密信息生成器设定大量熵和硬复制数据,如随机输入或视频文件的种子(以使加密信息难以被破解)。最后,通过将一切燃烧成灰烬来销毁加密信息 – 以及任何关于加密信息的痕迹。
协调可信设置仪式
所有可信设置仪式都依赖于一个中心化的协调者。协调者是个人或私人服务器或其他实体,他们被委托注册和订购参与者,通过将信息从前一个参与者转发到下一个参与者来充当中继,并保留所有通信的集中日志以用于审计。协调员通常还负责永久向公众提供日志,不过必须要承认的是,这种中心化的系统很容易因为管理不善或者一些非人为因素导致信息丢失。
具有讽刺意味的是,当去中心化是加密精神的核心原则时,加密项目必须依赖于中心化的可信设置仪式。因此,我们决定证明直接在以太坊区块链上为永续的 powers-of-tau 举办一个小型仪式的可行性。该设置是完全去中心化的,无需许可的,抗审查的,并且只要任何一个参与者是诚实的,都是安全的。按照当前价格计算,参加仪式的费用仅为 7 至 400 美元,具体取决于所需结果参数的大小(在这种情况下,介于 8 和 1024 次 tau 之间)。
到目前为止,我们建议不要将代码用于实验目的以外的任何目的。如果发现代码有任何问题的人向我们报告,我们将不胜感激。我们很乐意收集有关我们方法的反馈和审核。
了解 KZG 或「powers-of-tau」仪式
让我们来探索一下最受欢迎的可信设置之一,它被称为 KZG,或「powers-of-tau」仪式。感谢以太坊联合创始人 Vitalik Buterin,他关于可信设置的博客文章为我们在本节中的想法提供了信息。该设置生成 powers-of-tau 的编码,之所以这样命名,是因为「tau」恰好是用于表示参与者生成的秘密的变量:
对于某些应用(例如 Groth16,Jens Groth 在 2016 年设计的流行的 zkSNARK 证明方案),设置的第一阶段之后是第二阶段,即多方计算(MPC)仪式,为特定的 SNARK 电路生成参数。但是,我们的工作仅集中在第一阶段。第一阶段 – 生成 tau 的幂 – 已经可以用作通用 SNARK(例如 PLONK 和 SONIC)以及其他加密应用程序(例如 KZG 承诺,Verkle 树和数据可用性采样)的基础构建块。(DAS)。通常,通用 SNARK 参数应该非常大,以便它们可以支持大而有用的电路。包含更多门的电路通常更有用,因为它们可以捕获大型计算;tau 的幂数大致对应于电路中的栅极数。因此,典型的设置大小为|pp|= ~40 GB,能够支持 ~2 的电路 28 Gas。鉴于以太坊目前的约束,将如此大的参数放在链上是不可行的,但是对于小型 SNARK 电路,Verkle 树或 DAS 有用的较小的可信设置仪式可以在链上运行。
以太坊基金会计划 为大小为 200 KB 至 1.5 MB 的 powers-of-tau 运行几个较小的仪式。虽然更大的仪式可能看起来更好,但考虑到更大的参数可以创建更有用的 SNARK 电路,实际上,更大的并不总是更好。某些应用程序(如 DAS)特别需要一个较小的应用程序![原因非常技术性,但如果你很好奇,那是因为具有 n 次幂的设置(在 G 中)1)仅允许 KZG 对≤ n 次多项式的承诺,这对于确保 KZG 承诺下的多项式可以从任何 n 次评估中重建至关重要。此属性支持数据可用性采样:每次成功获得(采样)多项式的随机评估时,它保证多项式可以用概率 t/n 完全重构。如果你想了解更多关于 DAS 的信息,请查看 Buterin 在以太坊研究论坛上的这篇文章。
我们设计了一个智能合约,可以部署在以太坊区块链上,以运行可信设置仪式。该合约将公共参数完全存储在链上,并通过用户的交易收集参与。
新参与者首先读取这些参数:
然后对随机密钥 τ’ 进行采样并计算更新的参数:
并将它们发布在链上,并附上证明三件事:
- 离散对数的知识:参与者知道τ’。(证明对可信设置仪式的最新贡献建立在所有先前参与者的工作之上。
- pp 的格式良好 1:这些元素确实编码增量幂。(验证了新参与者对仪式的贡献的良好形式。
- 更新未擦除:τ’ ≠ 0。(针对试图通过删除所有参与者过去的工作来破坏系统的攻击者的防御。
智能合约验证证明,如果它是正确的,它会更新它存储的公共参数。您可以在存储库中找到有关数学及其背后推理的更多详细信息。
计算 Gas 成本
在链上运行设置的主要挑战是使受信任的设置仪式尽可能高效。理想情况下,提交捐款的费用不超过 50 美元。(大型项目可能能够为贡献者补贴 Gas,在这种情况下,数百名参与者每人花费 100 美元更容易想象)。下面,我们提供有关设置中最昂贵部分的更多详细信息。较低的 Gas 成本将降低贡献成本,并允许构建更长的参数(更多的 tau 功率和更大的 SNARK 电路)!
我们的设置适用于椭圆曲线 BN254(也称为 BN256,BN128 和 alt_bn128),它支持 以太坊上的以下预编译合约:
ECADD 允许添加两个椭圆曲线点,即计算 [α+ β]1 来自 [α]1 和 [β]1: 汽油费 150
ECMULT 允许椭圆曲线点乘以标量,即计算 [a*α]1 从 a 和 [α]1: 汽油费 6,000
ECPAIR 允许检查椭圆曲线对的乘积,即计算 e([α1]1, [β1]2)* … e([α1]1, [β1]2)= 1,相当于检查α1β1+ … + αk*βk= 0 : Gas 成本 34,000 * k + 45,000
如果以太坊能够启用 BLS12_381(如 EIP-2537 中所建议的那样),我们的设置合同也可以很容易地用于其他曲线。
让我们估计将设置更新为
验证证明的 Gas 成本。 如上所述,每个参与者都会更新设置并提交包含三个组件的证明。证明的组件 1 和 3 -「离散日志知识」和「更新是非擦除的」- 验证起来非常便宜。挑战在于验证组件 2,「pp 的良好成形性」1「,在链上。它需要一个大的多标量乘法(MSM)和两个配对:
其中 ρ0,…,??n-1 是伪随机采样标量。就预编译的智能合约而言,需要:
存储数据的 Gas 成本。 每个参与者还将链上更新存储为调用数据(每字节 68 gas),占 n * 64 * 68 gas。(对于那些熟悉椭圆曲线密码学的人来说,需要注意一点:根据我们对 n = 256 的测量,存储压缩点将使解压缩主导总体成本。
以此估算出的 Gas 成本如下:
当然我们也还在探索降低 Gas 成本的解决方案。
开源库:evm-powers-of-tau
我们已经在 github.com/a16z/evm-powers-of-tau 开源了基于 EVM 的 powers-of-tau 仪式。使用我们的策略进行仪式既简单又透明:
- 部署存储和验证协定(协定 /KZG.sol)
- 参与者从以前的事务调用数据中读取仪式参数
- 参与者在本地生成一个密钥,计算更新的参数
- 贡献者生成他们的证明:pi1,pi2
- 贡献者通过 KZG.potUpdate()将更新的参数提交给公共区块链上部署的智能合约
- 智能合约将验证更新的有效性,在提交格式错误的情况下恢复
- 多个贡献者可以永久执行步骤 2-5,每个步骤都可以提高仪式的安全性
- 每当开发人员对提交的数量和质量有信心时,他们就可以在区块链中查询当前参数,并将这些值用作加密密钥。
我们的存储库使用 arkworks-rs 来计算步骤 2 和 3(rust 计算可以在 src / pot_update.rs 中找到),但用户可能想要编写自己的。更新提交的整个端到端流程可以在 tests/integration_test.rs 的集成测试中找到。
请注意,我们选择使用 calldata 在链上存储更新的 powers-of-tau 参数,因为它比存储便宜几个数量级。可以在 src/query.rs 中找到此数据的基于 ethers-rs 的查询。
最后,证明和详细的方程式可以在 techreport/main.pdf 的技术报告中找到。
未来工作计划
在将这种可信设置仪式用于生产环境之前,我们建议首先对数学证明和示例实现进行全面审核。
随着实施,更新仪式的交易成本随着设置大小而线性增长。对于大多数应用程序(SNARKs,DAS),我们希望设置 n > = 256,目前每次更新的费用为 73 美元。
我们也许能够通过有效更新计算的 STARK 证明和对更新值的向量承诺来实现亚线性验证成本增长。这种结构还将消除对以太坊 L1 BN254 预编译的依赖性,从而可以使用更流行的 BLS12-381 曲线。
所有的仪式策略都是经过反复权衡和测试的。我们认为这种结构是可靠的,并且具有很好的可验证和抗审查性。但同样,在完成更多工作来验证我们方法的合理性之前,直接使用文中提到的这一方案仍然需要高度谨慎。
(声明:请读者严格遵守所在地法律法规,本文不代表任何投资建议)