# 隐私交易的实现：Aztec 隐私架构介绍

By [EthereumCN](https://paragraph.com/@ethereumcn-2) · 2021-12-23

---

来源 | [Aztec Network](https://medium.com/aztec-protocol/fully-confidential-ethereum-transactions-aztec-networks-privacy-architecture-274f968b13d4)

作者 | Jon Wu

[Aztec](https://aztec.network/) 是以太坊上一个旨在解决隐私问题的 zk-rollup：也就是说它是唯一一个从头开始构建的完全保护用户隐私的 [Layer 2](https://ethereum.org/en/developers/docs/scaling/layer-2-rollups/)。

为了理解隐私交易这种范式改变以及直接在网络架构中建立隐私的重要性，我们得先讨论“为什么说以太坊不是一条隐私的链”。

以太坊：一条公共区块链
===========

大家可能已经听说过**公共账本**这个词，它由两个部分组成：**账户**和**余额**。

以太坊上最原始的交易是将 ETH 从一个账户 (地址) 发送到另一个账户。网络通过增加某个账户的余额和减少另一个账户的余额来记录这些交易 —— 换句话说，ETH 实际上并没有“转移”。

让我们详细看看一个例子：snoopdogg.eth 想发送一笔交易给 cozomomedici.eth。

![只是两个商人](https://storage.googleapis.com/papyrus_images/84b183d31713f5366b6d4eb0885e87892c0beeb549594b806c90704412fac627.png)

只是两个商人

以下是交易的经过：Snoop 一开始有 100 个 ETH，然后他的账户扣了 20 个 ETH。而 Cozomo 一开始有 0 个 ETH，然后他的账户被计入 20 个 ETH。Snoop 的最终账户余额为 80 ETH，Cozomo 则为 20 ETH。转账完成。

![ETH 转账交易的账本示意图](https://storage.googleapis.com/papyrus_images/a299830fa30c511ee8f7f5f589fe9767c2099b1dfd82fcb900c72bfbd3d5bc29.png)

ETH 转账交易的账本示意图

我们可以在 [etherscan.io](http://etherscan.io) 上看到每个账户计入和扣除的交易款项，下图中显示的 ”ins“(转入) 和 "outs"(转出) 记录是公开的，所有人可见。下面是一个 ENS 名为 twinkienft.eth 的近期交易历史记录。

![在这里记录了 ta 所有的光辉事迹：twinkienft.eth 的公共交易！](https://storage.googleapis.com/papyrus_images/205963782fd658ea4748a0baf70afedf93ae4f57fd49b80cc6c9429673b8861a.png)

在这里记录了 ta 所有的光辉事迹：twinkienft.eth 的公共交易！

你可能会问：”谁是 twinkienft.eth 啊？” 我也没有头绪，但我可以看到 ta 所有的交易记录！你去 [etherscan.io](http://etherscan.io/) 上看看，你也可以观察所有被记录在区块链的交易。

![0x9dae… 就在 etherscan.io 的首页！](https://storage.googleapis.com/papyrus_images/47b3fed14b5572e4300ec2b2457d04b38951cad330f09ed50cc5afb1cf79a0a2.png)

0x9dae… 就在 etherscan.io 的首页！

大家可以看到这里明显有问题：我们不仅可以看到所有的账户交易，还可以看到它们的金额、资产和交易方。

这其实就是公共区块链带来的作用。由于其公开属性，公共区块链具有可审计性和可验证性。

但这也意味着，如果某人的隐私泄露了 (无论是有意还是无意的) —— 我们可以查看他们的完整交易历史。

跟踪公共交易数据是一项大生意：像 [Chainalysis](https://www.chainalysis.com/) 和 [Nansen](https://www.nansen.ai/) 这样的公司会做一些复杂的分析来关联各种钱包并监控其交易活动，并对谁持有着什么资产做出概率假设。

大家想象一下，如果你每次刷卡买羊角包时，都得向全世界展示你的银行账单。这真的很傻，对吧？

这就是以太坊的现状。

解决方案：账户加密？
==========

"呃，好吧，" 你可能会说，"这很容易解决，只要将账户、余额和持有者加密就可以了。" 咄，白痴！我怎么会这么蠢。

![这就是我每天的感受...](https://storage.googleapis.com/papyrus_images/141970be4b87bcda686f3bd4db7d3a9b97ef2e0dd85836382085f667ce7b9664.png)

这就是我每天的感受...

除了讨论一下加密账户如何实现之外：

请回忆一下之前所讲的账本。经过对账户和交易加密之后，我们会得到：

![似乎行得通](https://storage.googleapis.com/papyrus_images/8ad2563e6ff372e6ba4286d8e87aa649c5c3cec8793581d4b03eaddba9ec3d55.png)

似乎行得通

那么加密之后，网络应该如何检查账户，确保没有双花或者共谋的作恶行为。事实证明，要解决这个问题是非常困难的。

回到刚才那个例子。如果 Snoop 和 Cozomo 需要进行交易，那么他们必须要交互，因为网络不能帮助检查他们是否进行了有效的交易。

1.  Snoop 请求 Cozomo 的加密账户状态
    
2.  Cozomo 向 Snoop 发送已加密的状态
    
3.  Snoop 对 Cozomo 的状态进行解密，确认交易前的余额
    
4.  Snoop 向 Cozomo 发送一笔加密支付
    
5.  Cozomo 向 Snoop 发送他最新的加密状态
    
6.  Snoop 解密 Cozomo 的最新状态，确认交易后的余额 (并且 Cozomo 确实获得了他被承诺的金额)
    

这种精心设计的流程有很严重的缺点：很昂贵、很耗时，并且你每次只能和一个人进行交互 —— 双方还必须同时在线。

更糟糕的是，当他们结束了一场双方对话之后，任何一方都没有办法说服世界上的其他人，他们只是互相验证了他们的一笔交易。

使用票据 (note) 记账不香吗？
==================

但是，如果我们把归属结构颠倒过来呢？以太坊默认使用账户模式，其中账户中包含余额。换句话说，查一下账户，你就会得到它的余额信息。

那如果我们换一种思维方式呢？比如说某笔资产 (用 note 来表示) 的持有者是某人。

![账户里包含余额信息 vs. 资产票据推导出持有者](https://storage.googleapis.com/papyrus_images/542bd35e009cdfab5e1ccda660762a161d570c30b4a5d98db15568f2f73d7655.png)

账户里包含余额信息 vs. 资产票据推导出持有者

Bitcoin 就是使用这种模式，叫做 [UTXO](https://en.wikipedia.org/wiki/Unspent_transaction_output) (unspent transaction output, 未使用的交易输出)。但是不用纠结这个术语是什么意思了，把 UTXO 当作现金 (银行票据) 就好。

让我们先思考一下，为什么使用现金记账会更安全、更隐私 —— 或者更准确地说，比基于账户的系统更安全、更隐私。

它之所以安全，是因为只有交易现金的双方知道其所有权已经易手！而全宇宙的其他人都不会知道。

你可以把现金交易模式想象成某件物品 (note) 的所有权的变更，而账户交易模式则是两个账户的状态的变更。

![图示：某张加密票据的所有权变更](https://storage.googleapis.com/papyrus_images/259b6bd67fbb0b05faedd49d3e8e800d0afedb2ebb726b39167b7bc48077e04c.png)

图示：某张加密票据的所有权变更

当一笔 Aztec 交易在进行时，网络只需简单地为给定的票据重新分配所有权，而不是更新账户余额 (增加或减少余额)。

为什么这个模式这么有用？事实证明，加密一张票据要**简单得多**，因为只需在上面写两个东西：这个票据值多少钱以及它的所有者是谁。那么当它转手时，只需涂掉旧的所有者的名字，然后写上新的所有者的名字。

在 Aztec 上进行简单转账
===============

那么，在一笔简单的票据交易中，到底会发生什么呢？

假设 Snoop 有两张面值为 50 ETH 的票据 (总额为 100 ETH)，而 Cozomo 手上没有任何票据。

Snoop 手上的那两张票据需要销毁掉，并且要创建两张新票据：面值为 80 ETH 的票据分给 Snoop，面值为 20 ETH 的票据则分给其新的所有者 Cozomo。

但是，如果必须披露这些票据的价值，如何保护隐私呢？

嗯..他们并没有披露这些信息，至少没有公开。当然，Snoop 和 Cozomo 知道他们交易的资产价值，就像一笔现金交易一样，但他们不需要向全世界公开。

为了保护他们相互的隐私，Snoop 发布了一笔带锁的交易，他知道只有 Cozomo 的私钥才能解开这把锁。类比一下，这有点像将这张票据放进一个小小的保险箱中。当然，他们都知道箱子里有什么 (20 ETH)，所以 Snoop 必须要相信 Cozomo 不会在屋顶上大喊：“有人刚给我转了 20 个 ETH！”

但除此之外，所有权被重新分配的票据会返回到一个数据结构中，这个数据结构包含了所有曾经创建的票据 —— 这是一个[默克尔树哈希](https://en.wikipedia.org/wiki/Merkle_tree)，我将在下文简要地介绍一下它。

![在网络观察者看来，系统的状态会是什么样子的 —— 每张票据的面值和所有者都是完全加密的。](https://storage.googleapis.com/papyrus_images/5f5ea6b291389adac3fa8d7ec965a1828c5e7fe43df8037fd58198b5a5394b78.png)

在网络观察者看来，系统的状态会是什么样子的 —— 每张票据的面值和所有者都是完全加密的。

好管家
===

我们知道 Snoop 销毁了两张票据，创建了两张新的票据，然后把其中一张新票据转给了他的朋友 Cozomo。那么我们如何确保他们不会共谋作恶，比如双花？如果 Snoop 销毁了总值为 100 ETH 的两张票据，然后创建了总值为 200 ETH 的两张新票据，那怎么办？或者，他们直接创建任意数额大小的票据呢？

回想一下这两个步骤：

1.  Snoop 销毁了两张面值为 50 ETH 的票据并分别创建了面值为 20 ETH 和 80 ETH 的票据
    
2.  Snoop 将面值为 20 ETH 的票据转给 Cozomo
    

为了确保第一步没有发生可疑的行为，Snoop 需要做的就是向系统 (Aztec) 证明他打算创建的两张票据和他准备销毁的两张票据是等值的。

这被称为连接-分割交易，这种交易符合这条简单的等式：**A + B = C + D**

**下面是烧脑部分，跟上了！**

为了证明转出票据 (C + D) 等值于转入票据 (A + B, 或者说 100 ETH)，Snoop 在他的浏览器中本地生成了一个零知识证明 ([zero-knowledge proof](https://en.wikipedia.org/wiki/Zero-knowledge_proof)，ZKP)。

利用零知识证明，他能够证明出这条等式 **A + B = C + D**，而无需揭露他们的任意资产价值。

然后 Aztec 验证了这一证明，并表示：”由于这是零知识证明，那么这一定是有效的。“ 此时，智能合约销毁这两个转入票据，然后生成两个转出票据，并将新的转出票据作为加密承诺记录在票据登记表中。

所有权证明
=====

值得讨论的是，如何在 Aztec 中证明票据的所有权，这和在以太坊中证明类似。你如何证明你控制了某个以太坊地址的访问权 —— 通过使用你的钱包对一个信息进行签名。

那么你如何证明你能够访问 Aztec 的某张票据？一个非常非常奇特的加密签名叫做零知识证明。

这个证明说，”在 Aztec 状态中，a) 存在着一张特定价值的票据，b) 我拥有这张票据的所有权。“

那么 Aztec 系统的状态怎么存储？它存储在两个[默克尔树](https://en.wikipedia.org/wiki/Merkle_tree)中：

*   一颗是票据树，包含着所有曾经创建的票据；
    
*   一颗是无效树，包含着所有曾经被销毁的票据
    

如果你在 Aztec 中拥有一张票据，这意味着这张票据存在于”票据树“中，并且在”无效树“中不存在对应的无效票据。

![左边这棵”票据树“生气勃勃，而右边这个”无效树“则伤心欲绝。如果右边的树会说话，它可能会说”我讨厌死你了“之类的话。](https://storage.googleapis.com/papyrus_images/2226f2e0e4a1393549c0596ce42c847858bfdc2a99021c5f62a6f5ccb1ca06ce.png)

左边这棵”票据树“生气勃勃，而右边这个”无效树“则伤心欲绝。如果右边的树会说话，它可能会说”我讨厌死你了“之类的话。

当我们说到”销毁“一张票据，这实际上意味着添加一张无效票据到”无效树“中，而不是删掉”票据树“中的一张票据。

![默克尔树简图](https://storage.googleapis.com/papyrus_images/3799993aaebc9c92a88ff68f6ded786e1467ee0eacc706b32dc20f60cd2b8d03.png)

默克尔树简图

为了发送那些已证明为我所有的票据，将需要创建一个全新的默克尔树 (和默克尔根)。一旦”票据树“和”无效树“的默克尔根移动到新的值中 (换句话说，系统的状态已更新)，这些默克尔根就会被发布到以太坊的主链上，且交易就会被视为已记录。

写在最后
====

我希望本文能让读者深刻地理解到为什么隐私如此具有挑战性：我们需要在不违反或暴露用户数据的情况下，验证交易是合法且正确执行的。

这些独特的限制意味着隐私保护架构必须从头开始架构。Aztec 是唯一一个以这种方式构建的 L2 —— 用户的隐私通过其核心架构受到保护，并利用零知识证明来维护网络运作。

ECN的翻译工作旨在为中国以太坊社区传递优质资讯和学习资源，文章版权归原作者所有，转载须注明原文出处以及ethereum.cn，若需长期转载，请联系[eth@ecn.co](http://mailto:eth@ecn.co/)进行授权。

---

*Originally published on [EthereumCN](https://paragraph.com/@ethereumcn-2/aztec)*
