长话短说

零知识证明允许一方(验证者)确定另一方(证明者)给予的声明的有效性,而无需了解声明的内容。例如,币安可能希望证明其已将用户的资金完全保留在储备金中,而无需透露所有个人用户余额。

可以用梅克尔树建立“储备证明”,以防止其内部数据被伪造,在这种情况下,其总净客户余额是交易所对其用户的负债。然后可以将其与 zk-SNARK(一种零知识证明协议)相结合,确保用户可以在不知道个人余额的情况下检查其余额是否构成用户总净资产余额的一部分。

介绍

鉴于市场事件,托管的加密资产的安全性已成为一个重要议题。区块链用户高度重视透明度和开放性,但也支援隐私和保密性。这在证明托管人持有的资金储备时造成了困境。通常,透明度、信任和资料机密性之间需要权衡。

然而,情况并非一定如此。透过将 zk-SNARKs 等零知识证明协议与 Merkle 树结合,我们可以为各方找到有效的解决方案。

什么是零知识证明?

零知识证明允许一方(验证者)确定另一方(证明者)给予的声明的有效性,而无需了解声明的内容。让我们来看一个简单的例子。

你有一个锁著的保险箱,只有你知道解决办法。举个例子,除了知道密码之外,不能以任何其他方式撬开、强行或打开保险箱。这个事实也被你参与实验的朋友所证实、验证和知晓。

您向朋友声称您知道该密码,但您不想将其泄露出去或在他们面前打开盒子。盒子顶部有一个洞,您的朋友可以将便条插入其中。为了使其成为零知识证明,除了给定的陈述之外,您的朋友不应该拥有有关该过程的任何额外资讯。

您可以透过打开盒子,告诉他们纸条上写的内容,然后再次关闭它,向您的朋友证明您知道该组合。然而,你从来没有透露过这个组合。

有关更高级的范例,请参阅我们的什么是零知识证明以及它如何影响区块链?文章。

为什么我们要使用零知识证明?

零知识证明适用于在不泄露敏感资讯或细节的情况下证明某些事物。如果您不想交出可能被不当使用的财务或个人讯息,则可能会发生这种情况。

在加密技术中,您可以证明您拥有私钥,而无需透露私钥或对某些内容进行数位签署。加密货币交易所可能还希望在不泄露用户机密资讯(包括其个人帐户余额)的情况下证明其储备状况。

对于这些范例(以及许多其他范例),零知识证明将使用接受资料输入并传回「真」或「假」作为输出的演算法。

用技术术语定义零知识证明

从技术角度来说,零知识证明遵循特定的结构和一定的标准。我们已经介绍了证明者和验证者的角色,但零知识证明也应涵盖三个标准:

  1. 完整性。如果该陈述属实,验证者将被所提供的证据所说服,而不需要任何其他资讯或验证。

  2. 健全性。如果陈述是错误的,验证者将无法透过所提供的证据相信陈述的真实性。

  3. 零知识。如果该陈述为真,验证者除了该陈述为真之外不会获悉任何资讯。

什么是 zk-SNARK?

zk-SNARK(零知识简洁非互动式知识论证)是一种遵循前面概述的零知识原则的证明协议。使用 zk-SNARK,您可以证明您知道原始哈希值(下面进一步讨论),而无需透露它是什么。您还可以证明交易的有效性,而无需透露有关具体金额、价值或所涉及地址的任何资讯。

zk-SNARK 在区块链和加密货币世界中被广泛使用和讨论。但您可能想知道为什么有人会费心使用 zk-SNARK,因为他们可以使用简单的公钥和私钥对方法来保护资讯。然而,我们无法实现数学证明来确保不包含负余额以及 Merkle 树的总和。

就交易所的储备金而言,我们希望在不公开每个帐户的识别码和余额的情况下,证明客户余额的 1:1 支援。此外,zk-SNARK技术使得伪造资料的可能性变得更加不可能。

什么是默克尔树?

显示币安用户帐户的资金总额需要使用大型资料集。以加密方式呈现大量资料的一种方法是使用 Merkle 树。大量资讯可以有效地储存在其中,并且其加密特性使其完整性易于验证。

哈希函数

为了简洁地对输入进行编码,Merkle 树依赖于杂凑函数的使用。简而言之,杂凑是从可变大小的输入产生固定大小的输出的过程。换句话说,当任意长度的输入通过演算法进行杂凑处理时,都会产生加密的固定长度输出。

只要输入保持不变,输出也将保持不变。这意味著我们可以获得大量交易资料并将其杂凑成可管理的输出。如果输入中的任何资讯发生更改,输出将完全不同。

例如,我们可以将 100 本书的内容输入到 SHA-256 杂凑函数中。然后它会提供类似这样的输出:

801a9be154c78caa032a37b4a4f0747f1e1addb397b64fa8581d749d704c12ea

如果我们随后更改输入的单一字元(那 100 本书),则杂凑值将完全不同,如下所示:

abc5d230121d93a93a25bf7cf54ab71e8617114ccb57385a87ff12872bfda410

这是杂凑函数的一个重要属性,因为它可以轻松验证资料的准确性。如果有人使用 SHA-256 演算法复制对这 100 本书进行杂凑处理的过程,他们将得到与输出完全相同的杂凑值。如果输出不同,我们可以肯定输入已更改。这意味著无需单独或手动检查输入之间的差异,这可能是劳动密集的。

加密货币世界中的梅克尔树

当在区块链上储存交易资料时,每笔新交易都透过杂凑函数提交,该函数产生唯一的杂凑值。想像一下,我们有八个交易(A 到 H),我们分别对它们进行哈希处理以获得它们的哈希输出。这些就是我们所说的 Merkle 叶节点。在下图中,您可以看到每个字母的唯一杂凑值:A 为 hA、B 为 hB、C 为 hC 等。

然后,我们可以取得成对的杂凑输出,将它们组合起来,并接收新的杂凑输出。例如,hA 和 hB 的杂凑值一起杂凑后,将为我们提供一个新的 hAB 杂凑输出,称为 Merkle 分支。请注意,每次产生新的输出时,根据所使用的杂凑函数,它都会具有固定的长度和大小。

现在,我们将两个交易(例如 A 和 B)的资料组合在一个杂凑值 (hAB) 中。请注意,如果我们更改 A 或 B 中的任何资讯并重复该过程,我们的杂凑输出 hAB 将完全不同。

当我们组合新的杂凑对以再次散列它们时,该过程继续进行(见下图)。我们将 hAB 与 hCD 进行杂凑运算以获得唯一的杂凑 hABCD,并对 hEF 和 hGH 进行相同的操作以获得 hEFGH。最后,我们收到一个表示所有先前交易的哈希值的哈希输出的哈希值。换句话说,散列输出 hABCDEFGH 代表其先前的所有资讯。

上面显示的图称为 Merkle 树,杂凑输出 hABCDEFGH 是 Merkle 根。我们在区块头中使用 Merkle 根,因为它们以简洁的方式以加密方式总结了区块中的所有交易资料。我们也可以快速验证区块内是否有任何资料被窜改或更改。

Merkle 树的局限性

让我们回到我们的 CEX 储备范例。 CEX 希望证明其所有客户资产的 1:1 支持,并建立一棵 Merkle 树,在代币层级将其客户 UID 与其净资产持有量(扣除资产和负债)哈希在一起。一旦发布(并签署以证明对所提供的 Merkle 根的所有权),个人用户将无法在不访问其所有输入的情况下检查 Merkle 树是否有效。

交易所可能遗漏了一些输入。它还可以创建负余额的虚假帐户来改变总负债。例如,尽管客户的资产总计可能为 1,000,000 美元,但可以添加一个余额为 -500,000 美元的虚假帐户。这将创建仅为 50 万美元的储备目标。

储备证明的情况与区块的 Merkle 根不同,因为用户可以在区块链浏览器上看到区块包含的所有交易。然而,出于安全和资料隐私原因,CEX 不想揭露每个帐户余额。客户也不会因为他们的帐户余额被公开而感到高兴。在这种情况下,CEX 无法在不让其他使用者余额可见的情况下证明使用者余额总计正确。

交易所可能考虑采用的解决方案是使用值得信赖的第三方审计师。审计员可以在最终证明所提供的 Merkle 根的有效性之前检查个人帐户和储备金。然而,对于使用者来说,这种方法需要信任审核员以及用于审核的资料。当您可以信任资料时,您就不必依赖第三方。

将 zk-SNARK 与 Merkle 树结合

上述问题是使用 zk-SNARK 的完美案例。我们希望证明储备金完全涵盖了用户的责任并且没有被伪造。然而,出于隐私和安全原因,我们不想向验证者展示用户余额和储备金的确切组成。

透过使用 zk-SNARK,加密货币交易所可以证明所有 Merkle 树叶节点的余额集(即用户帐户余额)对交易所声称的总用户资产余额有贡献。每个使用者都可以轻松存取已包含在流程中的叶节点。 zk-SNARK 还确保产生的任何 Merkle 树不包含总净资产余额为负的用户(这意味著数据伪造,因为所有贷款都被超额抵押)。也使用了币安全球状态的计算,即每个币安客户持有的每项资产的总净余额清单。

让我们看看币安是如何处理这种情况的。首先,币安定义了它希望证明的计算的约束,并将它们定义为可程式电路。以下是币安在其模型中使用的三个限制集。

对于每个使用者的平衡集(Merkle 树叶子节点),我们的电路确保:

  1. 用户的资产余额包含在币安用户净余额总和的计算中。

  2. 用户总净余额大于等于0。

  3. 将使用者资讯更新到叶节点杂凑后,Merkle 树根的变更是有效的(即不使用伪造资讯)。

然后币安可以根据电路产生 Merkle 树建构的 zk-SNARK 证明。这需要交易所执行对用户 ID 和余额进行哈希处理的大量计算,同时确保证明通过约束。

验证者将检查证明(及其公开发布的开源程式码),以确信计算是在满足所有约束的情况下执行的。与证明时间相比,验证计算所花费的时间极短。

在每次发布储备证明时,交易所将发布:

1. 每位使用者的 Merkle 证明。

2. 所有使用者的电路的 zk-SNARK 证明和公开输入(每个资产的总净余额清单和 Merkle 根的杂凑)。

有兴趣的各方可以验证 Merkle 证明,确保他们的个人余额对 Merkle 树根做出了贡献。他们还可以验证 zk-SNARK 证明,以确保 Merkle 树的构造满足电路中定义的限制。有关 zk-SNARK 解决方案及其性能的更详细说明,请参阅我们的 zk-SNARK 如何改进币安的储备证明系统部落格。

结束语

zk-SNARK 提供同时确保资料完整性和隐私性所需的技术。其用于证明储备和提高 CEX 透明度的应用应该有助于建立对区块链产业的信任。对许多人来说,这样的发展已经期待已久,并且是在中央交易所的关键时刻出现的。

这是我们 zk-SNARK 的第一个版本,我们期待收到社群回馈,以便我们能够继续改进系统。

进一步阅读

  • (部落格)zk-SNARKs 如何改进币安的储备证明系统

  • (学院)储备证明(PoR)

  • (学院)什么是储备证明及其在币安上的运作方式

  • (Announcement) Binance Releases Proof of Reserves System