跳到主要内容

可信设置

请参阅 这里了解如何参与贡献。继续阅读了解什么是可信设置以及它们在Manta 网络上将发挥怎样的作用。

什么是可信设置

Manta Network 使用零知识证明 (ZKP) 来保护隐私。 MantaPay 所使用的 ZKP 是一种名为 "Groth16 "的 ZK-SNARK,它需要两个公共基础设施:证明者密钥和验证者密钥。 可信设置就是用于安全生成这些密钥的过程。

这两种密钥是什么?

让我们以 MantaPay 为例来回顾一下 Manta Network 上发生的事情。 MantaPay 可以让用户能够在不暴露隐私的情况下相互发送代币。 其工作原理是,用户不像在比特币或以太坊上那样在链上发布敏感信息(地址、代币类型、金额),而是发布一个 ZKP。 这个 ZKP 是 "我正在进行有效的交易 "这一声明的证明。 (当然,实际的声明是更复杂的)。

因此,在这种情况下,MantaPay 用户是证明者,Manta Network 节点是“我正在执行有效交易”语句的验证者。 证明本身就是一个复杂数学问题的解决方案。 诚实的证明者(提交有效交易的用户)可以轻松解决这个数学问题,但对于一个不诚实的验证者(试图提交欺诈性交易的人)来说几乎是不可能的。 验证者可以快速检查声称该数学问题的解决方案是否有效。 至关重要的是,该解决方案本身不会泄露任何敏感信息,例如地址、代币类型或金额。 (有关技术细节,请参阅Groth '16

现在我们来看看这两种密钥:证明者必须解决和验证者必须检查的数学问题是根据双方同意使用的一组公共参数来说明的。 这些参数就是所谓的“密钥”。 陈述数学问题解决方案所需的参数称为证明者密钥,验证解决方案所需的参数称为验证者密钥。 要产生一个 ZKP,MantaPay 用户需要证明者密钥; 为了验证该证明,Manta Network 节点需要验证者密钥。 当然,当您使用 MantaPay 时,您看不到任何这些密钥,但它们是幕后发生原理的一部分。

为什么我们需要可信设置?

证明者和验证者密钥必须根据特定的数学规则形成。 这些规则太复杂,我们就不在这里解释了(请参阅 Groth '16),但是生成密钥的过程大致是这样的:

  1. 选择一个随机数(通常称之为tau)。
  2. 使用该随机数计算一些椭圆曲线点,用这些点生成证明者/验证者密钥。
  3. 忘记这个随机数

第 3 步非常重要,我们来解释下原因。 如果您只是查看证明者和验证者密钥,几乎不可能弄清楚 tau 是什么(这是一个“离散对数问题”)。 但是,如果您确实知道秘密数字 tau,那么您实际上可以创建虚假证明,允许您向链提交欺诈交易。 从本质上讲,这意味着任何知晓 tau 是什么的人都可以凭空制造代币!

所以 tau 是一个危险的数字,以至于它被称为有毒废料,就像化工厂产生的有毒废料一样,我们必须妥善处理 tau。 可信设置的重点是确保证明者和验证者密钥是正确生成的,并且有毒废料被永久丢弃。

具体是如何实现可信设置呢?

安全地生成证明者/验证者密钥意味着要确保在程序结束时丢弃有毒废料 tau。 一种(糟糕的)方法是请某个受信任的一方(可能是 Vitalik Buterin)为我们生成密钥,并承诺事后从他的计算机内存中擦除 tau。 但是这种方法有两个大问题。 首先,我们真的那么信任 Vitalik 吗? 即使我们这样做了,我们真的有信心没有黑客可以破坏他的计算机吗? 整个网络的经济价值取决于没有人知道 tau 的价值,所以这两个问题的答案都必须是 "是"。显然,这排除了任何依赖一个人或组织的正直性的中心化密钥生成方案。

与 Web3 中的许多事情一样,信任来自于去中心化。证明者和验证者密钥的生成是通过多方计算 (MPC) 执行的,它允许我们将有毒废料分配给数百名参与者。 MPC 运行如下:

  1. 当前参与者从前一个参与者那里接收证明者/验证者密钥。
  2. 参与者对随机数 tau 进行采样,并使用 tau 来转换证明者/验证者密钥。
  3. 参与者忘记 tau 并将转换后的证明者/验证者密钥传递给下一个参与者。

通过这种方式,MPC 形成了一个参与者的链条,每个参与者都将自己的随机性贡献给证明者/验证者密钥,因此每个参与者都有自己的有毒废料。 这听上去好像更糟了,但实际上是一种改进。 那是因为如果数百名贡献者中至少有一个参与者处理了他们的有毒废料,那么生成的证明者/验证者密钥就是安全的。 (用《哈利-波特》来比喻,这就像摧毁一个魂器就能打败伏地魔一样。 这将使书变得更短,但魔法世界会因为这种安全保证而感到兴奋)。

值得强调的是: 如果仪式中至少有一个参与者是诚实的,那么生成的密钥就是安全的

这也是术语“可信设置仪式”的来源。 “设置”,因为它为 ZKP 生成必要的基础设施(证明者/验证者密钥)。 “仪式”是因为它需要许多参与者相互协调才能进行 MPC。 “可信”是因为这个 MPC 的设计让我们相信它的输出,只要我们相信至少有一个诚实的人参与。

这跟我有什么关系?

那个诚实的人可能就是你! 如果您参加我们可信设置仪式并处理掉有毒废料,那么您就可以得到数学保证,证明者/验证者的密钥是安全的。

我要如何参与?

我们已经编写好了软件,你只需要诚实参与其中,并不必了解“仪式”的数学细节。 下面是使用该软件的详细说明。 基本步骤是:

  1. 下载我们的可信设置客户端(或自己编写)
  2. 使用公共签名密钥进行注册
  3. 在“仪式”上贡献你的 tau
  4. 公开宣布你的贡献(见下一节)

存在哪些可能的攻击?

鉴于网络的经济价值取决于证明者/验证者密钥的安全性,那么存在很大的动机来破坏这种安全性。 因此,我们必须仔细考虑可能对我们受信任的设置仪式的攻击。 我们将列出一些攻击并解释如何应对。

  • 暴力破解 :最不有效的攻击是暴力搜索有毒废料编号 tau。 从技术上讲,给定证明者和验证者的密钥,是可以推导出秘密值 tau 的。然而这样做需要解决一个众所周知的困难的数学问题,即 "离散对数问题"。 解决这个问题的最佳算法仍然涉及大量的猜测和检查,而成功的攻击需要比一个月内每天中彩票更多的运气。 因此,缓解暴力攻击的策略只是纯粹的计算难度。
  • 大型密谋。下一个比较好的攻击方式是搞定所有参与者,要么直接与他们“串通”,要么将恶意软件潜入他们的机器。如果攻击者知道了每个参与者的有毒废料数量,那么他们就可以推断出秘密数字 tau。然而,这种攻击只有在危及每一个参与者的情况下才会成功。如果哪怕只有一个诚实的参与者逃脱了阴谋,那么攻击者除了尝试我们上面提到的暴力攻击外,没有更好的选择。因此,缓解这种攻击的策略是分散化:参与者越分散,越多样化,攻击者就越难攻破他们所有的机器。
  • 不遵守MPC协议:一个不良行为者可能试图参与我们的可信设置仪式,并通过破坏MPC协议的规则来破坏证明者/验证者的密钥。这样做的一个方法是破坏贡献链:攻击者可能会用他们自己编造的其他密钥取代他们从前一个参与者那里得到的证明者/验证者密钥,而不是贡献给他们。这将有效地抹去之前所有的贡献,并可能导致证明者/验证者的密钥被破坏。另一种破坏协议的方法是不遵守为钥匙提供随机性的数学规则。这将产生无法使用的密钥,使任何人都无法产生有效的 ZKPs。

这两种攻击都可以通过 MPC 的设计得到应对:任何贡献都必须伴随着一个加密证明:1)当前的贡献是基于上一轮的密钥;2)转换密钥的数学规则被遵循。仪式协调人(我们运行的服务器,见下文)在接受贡献之前检查每个贡献的有效性证明,并将其证明者/验证者的钥匙传递给下一个参与者。 此外,在仪式结束后,贡献证明被公之于众,这样任何人都可以验证所产生的参数确实是按照MPC 协议的规则形成的。

  • 改变历史。也许最可怕的攻击涉及对仪式的历史撒谎。为了理解这种攻击,回顾一下计算证明者/验证者密钥的 MPC 形成了一个贡献链,每个贡献链都伴随着其有效性的证明。这些证明将被托管在网上的某个地方,允许任何人检查 MPC 协议是否被遵循。不幸的是,这也导致了一个新的攻击媒介。如果一个攻击者获得了托管仪式贡献证明的服务器的控制权怎么办?他们就可以模拟一个看起来合法,但实际上完全由他们控制的可信设置仪式。我们怎么能确定这个服务器上托管的证明与原始仪式中使用的证明是一样的呢?

这是一个熟悉的问题:当我从网上下载文件时,我怎么知道我得到的是正确的东西?对这种攻击的最好防御是校验。每当你从一个不受信任的来源下载一个大文件时,计算该文件的SHA256哈希值并将其与一个受信任的来源上发布的哈希值进行比较是一个好的做法。 这就是为什么敦促贡献者完成步骤4,"公开宣布你的贡献"。这意味着一旦你的贡献完成,你将得到一个属于你的贡献的哈希值。你应该复制这个哈希值,并在尽可能多的地方公开发布,例如在推特上写上 "我刚刚为MantaPay 可信设置仪式做出了贡献。我的贡献的哈希值是 xxxxxxxxxxxxx"。这样做增加了 "改变历史 "攻击的难度,因为试图检查你的贡献证明的人可以将其哈希值与你的推文中的哈希值进行比较。现在,攻击者不仅需要获得托管贡献证明的服务器的控制权,他们还必须入侵 Twitter 以改变你的推文内容。

Manta 在其中的角色是?

Manta 希望仪式能够顺利进行,并产生安全的验证器/验证人密钥,我们已经做了很多工作来确保这一点。 首先,我们编写了一个软件,使人们在不需要了解 ZKP 和 MPC 背后的数学知识的情况下也能轻松做出贡献。 这使得仪式更加安全,因为它向更多不同的人开放参与,如果每个人都必须自己写这段代码的话,他们就无法做出贡献。 任何能熟练使用命令行的人都可以运行我们的客户端,为Manta网络的安全作出贡献。 当然,所有这些代码都是完全开源的,所以你可以自己进行检查。

除此之外,Manta 还通过以下方式来对仪式进行协调

  • 维护参与者的登记册:为了防止对仪式的 DDOS 攻击,我们要求参与者预先登记。注册说明见下文。
  • 对参与者进行排队:我们的服务器将参与者组织在一个队列中,以确保贡献是逐一进行的,并将等待时间降到最低。
  • 验证贡献:在将证明者/验证者密钥传递给下一个参与者之前,我们的服务器会根据 MPC 协议检查贡献的证明。
  • 仪式存档:为了让任何人都能验证我们的仪式是否遵循了 MPC 协议,我们将对所有的贡献证明进行存档,只要这些证明者/验证者的密钥还在使用,就会向公众提供这些证明。
  • 验证Tau仪式的永久权力:下面有更多关于这个问题的内容。

站在巨人的肩上:

Manta 为组织这个仪式并确保它的安全性付出了很多努力,但这并非是我们一己之力。 以下是一些人和项目,在其工作的基础上我们的仪式才成为可能。

  • Tau 的永恒之力我们在上面忽略的一个微妙之处在于,为Groth16 ZKPs生成验证器/验证人密钥可以分为两个步骤,或 "阶段"。第1阶段是多用途的;它产生的一组参数可以被任何ZKP使用(唯一的限制是对ZKP的大小和底层椭圆曲线)。第1阶段可以执行一次,并被许多项目重复使用。第2阶段是针对正在使用的电路的(在我们的例子中,是MantaPay电路)。第二阶段的仪式必须由每个项目单独进行,如果项目对他们的电路进行修改,必须重复进行。MantaPay可信设置仪式是第二阶段的仪式,产生的证明者/验证者密钥只能用于MantaPay电路。

每个第二阶段的仪式必须以第一阶段仪式的产出为起点。在我们的案例中,我们选择使用Perpetual Powers of Tau(PPoT)作为我们的第一阶段。 PPoT是一个由Privacy and Scaling Explorations Team组织的公益项目。 这是一个雄心勃勃的公益项目,为社区提供一个巨大的参数集,足以容纳非常大的ZKPs。 PPoT 容易受到我们上面提到的所有攻击,所以在使用它的输出之前,我们已经验证了它的每一轮贡献的证明(在写作时有72个)。 完整的 PPoT 仪式产生了大约500倍于我们对 Manta 支付电路所需的参数,所以我们只验证了我们将实际使用的参数子集。 我们确实将完整的校验和与我们能找到的所有公开的公告进行了比较。所有检查都通过了,我们确信 PPoT 仪式产生了安全的输出。

  • ZCash Sapling 仪式:ZCash 的密码学团队是完成了第一个 Groth16 可信设置的开拓者。 在编写我们的贡献客户端时,我们从他们的工作中获得了很多灵感。 (虽然要明确一点,我们没有使用 Sapling 仪式的实际参数;我们使用的是 PPoT。)
  • Kobi Gurkan 的代码仓库 给我们提供了不少灵感 (一个重要区别是我们使用了 Arkworks 库)。

如何参与

如果您也想帮助确保 Manta Network 的安全,请查阅 这些指引.