# 公链隐私探索

By [Kurt Pan](https://paragraph.com/@kurtpan) · 2022-02-26

---

> 原文：[https://wdai.us/posts/navigating-privacy/](https://wdai.us/posts/navigating-privacy/)
> 
> 作者：Wei Dai
> 
> 翻译：Kurt Pan

此文是对公链（又名去中心化账本、Crypto和 Web3）场景下隐私方面的阐述。第一部分会涉及为什么隐私是大规模采用的关键障碍以及隐私有哪些不同方面。第二部分综述了达成隐私的三种不同方法：通过零知识证明，通过仅以匿名为目标，以及通过一种新的称为 MOCCA 抽象。

第一部分：什么是公链隐私以及为什么
=================

### 隐私——大规模采用的最后障碍

现代金融系统运行良好，我们不必担心日常交易的安全性或隐私性。当你在杂货店购物、通过支票支付租金或在银行获取短期贷款时，你不必担心你的交易会受到非相关方的公开审查。在现代银行和信用卡网络中，大部分交易细节保留在相关金融中介和机构内部。理想情况下，用户不必担心他们的敏感信息会被泄露给大众，同时当局也几乎可以追踪那些非法活动。

不幸的是，目前在流行的区块链上进行的交易并非可以做到如此程度。尽管区块链技术允诺使当前的金融生态去中心化和民主化，但大多数系统甚至无法达到我们所期望的最基本的隐私级别。你买的披萨🍕会被[永久记录](https://www.blockchain.com/btc/tx/cca7507897abc89628f450e8b1e0c6fca4ec3f7b34cccf55f3f531c659ff4d79)，你所有的交易都可以轻松地[在 Etherscan 上](https://etherscan.io/address/0xd8da6bf26964af9d7eed9e03e53415d37aa96045)公开访问。是有以隐私为重点的项目的，但由于在功能和易用性方面的不对等，它们目前并未得到充分利用。这标志着隐私是大规模采用区块链技术的主要障碍之一。

公链场景中的隐私并不是一个全有或全无的功能，而是一个复杂且多维的问题，在探索时需要十分小心。我们首先深入了解哪种类型的隐私与区块链应用相关。

### 隐私特征轴

#### A 轴：匿名性和机密性

广义上讲，金融交易的隐私有两种类型：**匿名性**和**机密性**。当一家非营利组织收到匿名捐赠时，他们不会获得有关捐赠者的信息（匿名性），但会知道收到的捐赠金额。而当你在药店结账时，你购买的内容是机密的——你身后的人不知道你会开出哪些药以及它们的价格，但他们知道是_你_正在购买。

> *   **匿名性** ： 人们可以知道我是交易的发起人吗？
>     
> *   **机密性** ： 人们可以知道我的交易内容吗？
>     

#### B轴：链上应用和中介应用

区块链和加密货币的基本论点之一是能够在_无_受信中介的情况下进行金融交易。跟随比特币的脚步，几乎所有的加密货币都允许在无中介的情况下直接支付。以太坊等智能合约平台更进了一步，使支付之外的更多种金融行为能够在没有中介的情况下进行，例如交易和借贷。在本文中，我们使用“链上”一词来描述那些用户可以直接作为共识节点的操作者使用的功能和应用程序，例如支付、交易、借贷。（请注意：用户通常不运行自己的共识节点。例如，Web3 钱包的第三方 RPC 终端提供商在实践中应被视为中介。）链上应用的一些例子包括用比特币和[Zcash](https://z.cash/)支付，在[Uniswap](https://uniswap.org/)上交易，在[Compound](https://compound.finance/)上借贷。

![](https://storage.googleapis.com/papyrus_images/4ad5af32726a1e036fa74a9b33037b821b6b3bc3349608c85bfa87a29581767b.png)

不幸的是，中介在生态中仍然普遍存在。[Coinbase](https://www.coinbase.com/)等交易所是他们提供的服务的中介——用户需要将资产存入这些交易所进行交易。甚至一些“去中心化”的协议也依赖于中心化的中介。例如，[dYdX](https://dydx.exchange/)和[DiversiFi](https://deversifi.com/)都有中心化交易所运营商。这与 Uniswap 等它们的链上同类产品不同，后者不需要与共识网络之外的服务器进行交互。dYdX 和 DiversiFi 超过 Coinbase 之处是消除了对资金安全所需的信任。反之，用户需要信任的是密码学和程序，具体来说是[STARK](https://starkware.co/)，以确保他们的资金安全。

[支付信道网络](https://en.bitcoin.it/wiki/Payment_channels)（例如 [闪电网络](https://lightning.network/)）和[roll-ups](https://vitalik.ca/general/2021/01/05/rollup.html)（例如[Arbitrum](https://developer.offchainlabs.com/docs/rollup_basics)、[Optimism](https://www.optimism.io/)、[Aztec](https://aztec.network/)和[Scroll](https://scroll.io/)）是另外两类中介应用。尽管目前大多数中介都是中心化的，但它们是可以设计为去中心化的，这对于roll-ups来说尤其需要，因为它们直接与侧链竞争。例如，zk-roll-ups 可以有一个带有[某种形式的共识机制](https://ethresear.ch/t/proof-of-efficiency-a-new-consensus-mechanism-for-zk-rollups/11988)的 roll-up 排序器网络，有效地使 roll-up 成为一条链。

![](https://storage.googleapis.com/papyrus_images/8e5f0007bfe5f82da246d3ba395c82f65c22adeb9f36f7980caad2cd84f1e97d.png)

#### 把两个轴放在一起

通过结合两条隐私特征轴（匿名性和机密性，以及链上与中介之间）我们得到了区块链应用的四个隐私概念。下表列出了每个类别中的一个隐私问题。

![](https://storage.googleapis.com/papyrus_images/488d56c1d9462650c3bcaffa7b712f02bfea7561d5afe5d527a3656fc8d2df21.png)

当然，对于上述任何一个问题，答案都是你的信息被永久记录在链上并传输给中介。有了这种理解，我们现在能够深入研究链上和中介区块链应用可以实现哪些隐私。

*   声明 1：尽管大多数应用都声称是去中心化的，但链上智能合约的开发和访问通常是非常中心化的。例如，一个编码错误通常会导致数百万美元的漏洞利用，而 DEX 交易通常会遭遇数量不断减少的矿池，这些矿池利用用户的交易来获取自己的利润（称为 MEV，或矿工提取价值）。我们不会在这里进一步详细阐述这些问题，因为我们的重点是隐私问题。
    
*   声明 2：隐私的一个重要方面，我们不会更深入地讨论，那就是隐私、监管和合规之间的相互作用。在许多情况下，金融中介有法律义务不仅要了解他们的客户 (KYC)，还要记录和报告某些金融交易。反洗钱 (AML) 是其主要目标之一。例如，加密货币的透明性最近[帮助司法部](https://www.wired.com/story/bitcoin-seizure-record-doj-crypto-tracing-monero/)[追回了 2016年Bitfinex 黑客窃取的价值 3.6B美元的资金。](https://www.forbes.com/sites/jonathanponciano/2022/02/08/feds-seize-36-billion-in-stolen-bitcoin-arrest-couple-five-years-after-massive-crypto-exchange-hack)本文将不涉及监管和合规问题，而是从技术和理论层面仅关注隐私问题。
    

第二部分：如何构建保护隐私的区块链应用
-------------------

让我们先来看看支付方面，因为它们大多已被解决，且无需中介。[Zcash](https://z.cash/)和[Monero](https://www.getmonero.org/)是两种同时提供匿名性和机密性的大盘代币。它们分别依靠零知识证明和环签名来提供不同级别的匿名性和机密性。我们还有其他构造私有支付的方法，这些方法更有效，但需要像 [Mimblewimble](https://eprint.iacr.org/2018/1039) 这样的交互，或者像[Quisquis](https://eprint.iacr.org/2018/990)和[匿名](https://eprint.iacr.org/2020/293) [Zether](https://eprint.iacr.org/2019/191)这样没有不断扩展的 UTXO 集。

然而，支付之外的情况就不太清楚了。例如，除了支付最成功的应用之一是去中心化金融（DeFi）领域。我们仍然不知道对DeFi 应用的广泛建立的隐私技术。

要从整体上理解这一点，我们首先需要有一个好的理论模型来讨论链上应用。一般的链上应用可以建模为**迭代计算**，指定为转换函数f，它为每个起始状态st和输入计算 (st’, output) = f(st, input)。

![](https://storage.googleapis.com/papyrus_images/0e3257080389e60e73d7273a58008259c3d2af59f0a1fb5f836ebba134d9d72e.png)

用户可以在在提交给共识节点进行处理之前将交易作为输入。为了在此过程中保护用户隐私，我们需要在不泄露用户身份和输入的情况下进行计算。有三种方法：（1）将计算下链，（2）保持计算透明但隐藏发起者的身份，以及（3）对具有透明输出的加密输入进行同态计算。

### 用 ZKP 达到链下计算的隐私

零知识证明 (ZKP) 是 1980 年代后期理论计算机科学和密码学领域的一项重要发展（[这些讲义](https://cseweb.ucsd.edu/~mihir/cse208-Wi20/main.pdf)的第 1 章给出了一个很好的综述）。区块链场景中使用的特定形式的零知识证明 (ZKP) 在学术上通常称为 NIZK（非交互式零知识）。当证明简洁时，它们通常被称为 SNARGs（或[SNARKs](https://link.springer.com/article/10.1007/s00145-016-9241-9)），或简洁非交互知识论证。额外的有意思的性质是透明性（[S**T**ARK](https://link.springer.com/chapter/10.1007/978-3-030-26954-8_23)）和[通用性](https://eprint.iacr.org/2018/280)，这允许证明系统用于多个电路而无需可信设置或只用一个通用可信设置。

ZKP 在公链中的核心应用是执行可验证的**链下**计算的能力。通常，证明者是用户（在有ZK 应用平台的情况下）或中介（ZK-roll-ups），而验证者是链，即验证者集。使用 ZKP 进行一般计算的一种直接方法是直接证明状态转换的正确性。更详细地说，用户在链下证明对于特定的链上状态st，用户有一个输入，当将其应用于起始状态st时，会产生一个带有某个输出的新状态st'。 然后，共识节点在覆盖旧状态之前验证提议的状态转换的有效性。这是 ZK 应用平台（例如[Mina Snapps](https://docs.minaprotocol.com/en/snapps/how-snapps-work)和[Aleo](https://www.aleo.org/) ，二者均受到[Zexe](https://eprint.iacr.org/2018/962)学术工作的启发。）所采用的方法。

![](https://storage.googleapis.com/papyrus_images/699badf169981239a8bf831b976e505cada4c71d1508766f18fb2eab0c6ddc7b.png)

透明的链上应用与上述架构之间的关键区别在于，一个更新(_st_′, _output_, _π_)仅对用户用于生成更新的应用程序状态st有效。 如果多个用户在没有协调的情况下与同一个应用交互，会导致“竞争条件”。 更详细地说，假设有两个针对相同链上状态_st_0构建的有效交易，将其分别更新为st1和st2。当第一笔交易记录在链上时，链上状态更新为st1。结果，第二笔交易将使用新状态st1而非st0进行验证，这很可能使其无效。

值得注意的是，可以通过将应用状态分割成独立的部分或完全消除共享的链上状态来绕过这种竞争条件。这使得这些 ZK 应用平台非常适合于不需要用户之间共享状态的特定应用（例如[ZKPass](https://minacrypto.com/2022/02/03/snapps-mina-club-interview-with-zkpass-co-founders/)），但并不适用于大多数需要这些共享状态的链上应用，尤其是像恒定功能做市商（CFMM）这种链上 DeFi 协议。对于这些应用，由于竞态条件的问题，使用 ZKP 进行整个应用状态转换有点像那种“前进一步后退一步”的解决方案。但是有一种解决方法，即添加一个_中介_或交换操作员，使应用状态对操作员私有，而不是在所有用户之间共享。不幸的是，如果不采用本文后面讨论的其他解决方案，没有已知的方法可以向这些中介隐藏交易信息。综上所述，Aleo 和 Mina 等 ZK 应用平台上的交易所实现了以下隐私属性。

![表格详细说明了可以在 Mina 和 Aleo 等 ZK 应用平台上构建的交易所的隐私功能。](https://storage.googleapis.com/papyrus_images/1f0700b01f18dec1c05b8d7e00492f9f06bb1b70a07dedb06d52aba0e5669020.png)

表格详细说明了可以在 Mina 和 Aleo 等 ZK 应用平台上构建的交易所的隐私功能。

### 透明链上计算的匿名性

为链上应用增加机密性很难，那如果我们先不尝试提供机密性，而只是专注于提供匿名性呢？使用现有工具已经可以做到这一点：使用[CoinJoin](https://en.bitcoin.it/wiki/CoinJoin)和[Tornado Cash](https://tornado.cash/)等混币器，可以给新的伪匿名地址提供资金以获得匿名性。不幸的是，这些工具的可选参与意味着恶意用户比合法用户会更多地使用它们。例如，[CoinJoin](https://en.bitcoin.it/wiki/CoinJoin)被[Colonial Pipeline 勒索软件](https://anchainai.medium.com/how-does-darkside-ransomware-make-10-million-shut-down-the-colonial-pipeline-and-hide-its-trace-9838e908ba5d)使用，Tornado Cash 经常被用于[资助匿名地址](https://etherscan.io/tx/0xb3283c7c82faa1b6b0d3b8104e87a5239f909ea6d8eeb4026a6d5b671a672f66)以发起 DeFi 黑客攻击。

有两个项目试图在透明的智能合约平台上构建默认情况下的匿名性。第一个是[Aztec Connect](https://medium.com/aztec-protocol/private-defi-with-the-aztec-connect-bridge-76c3da76d982)，它是以太坊的新兴“zkzk-rollup”，在与受支持的一层应用进行交易时提供交易匿名性。roll-up合约代表二层用户（其身份在链上和对roll-up提供者都隐藏）与一层 DeFi 协议交互，为这些二层用户提供匿名性。

第二个是学术工作[FLAX](https://eprint.iacr.org/2021/1249)。它提议重新设计一个类以太坊的智能合约平台，以支持对用户的内置匿名性。其核心是提出了一个匿名版本的 ERC20 代币标准，允许匿名性和代币使用的原子委托。有趣的是，实现这些“匿名 ERC20”不需要新的密码学。可以在代币合约中使用前面提到的任何私有支付方案（例如 Zcash、Monero 或 Zether）中的相同技术。

下表概述了上述解决方案的隐私特性。我们在这里省略了中介一栏，因为不涉及中介——除了 Aztec Connect——它可能提供来自中介roll-up提供者）的匿名性，具体取决于去中心化程度和这些提供者的确切行为。

![](https://storage.googleapis.com/papyrus_images/d467b8c70d81684016ac23e1e35987dbed802b429862c200dd112252502e5112.png)

### 通过 MOCCA 达到链上计算的隐私性

我们是否可以加密链上应用的状态和用户输入，而且仍然能够对它们进行计算，甚至可以导出公开的未加密的输出信息？让我们将这种理想功能称为**魔法链上机密计算设施**(**MOCCA** )。

![](https://storage.googleapis.com/papyrus_images/d1a00127eddc6d21c7f0af3980e473b808790182b34d2087aeadf308f46af94f.png)

直观地说，MOCCA 为状态转换函数f提供了尽可能好的隐私。可以在给定必要的加密输入的情况下_在链上_计算，并且计算应该产生加密的并更新的状态以及一些透明的输出值。具体来说，程序状态和输入被加密到链上，这样唯一可以执行的操作共识就是计算状态转换，意味着只有应用预期的信息才会被解密并变得透明。假设我们有这样一个魔法盒子，那么在提供隐私的同时很容易复制链上应用的功能。应用设计者可以将他们的应用设计为仅发布相关信息作为透明输出，例如现货价格或储备金额。

![](https://storage.googleapis.com/papyrus_images/27496b1768f9422d0931057a3792969c34b395b2c5a99fc479c0d26b091065c9.png)

构建 MOCCA 有两种方法，通过受信任的硬件和通过密码学。无论哪种情况，我们都希望在没有中介的情况下实现隐私保护的去中心化应用，其具有以下属性。

![](https://storage.googleapis.com/papyrus_images/56d19634e7ef0e74f22ce12f77caa6a5b1916605b1652101a6c262f1dc533126.png)

#### 来自可信硬件的 MOCCA

第一个解决方案是利用可信执行环境，比如英特尔 SGX。这首先在[Ekiden的学术著作](https://par.nsf.gov/servlets/purl/10153195)中有所描述，并且是[Oasis](https://www.oasislabs.com/)和[Secret Network](https://scrt.network/)采取的方法。已经有应用在这些平台上运行，例如[Secret Swap](https://secretswap.net/)。但是，众所周知，英特尔 SGX[充满了漏洞](https://arxiv.org/pdf/2006.13598.pdf)。

#### 来自密码学的 MOCCA

我们可以只使用密码学来构建图灵完备的 MOCCA 吗？事实证明答案是肯定的，密码学家已经发现了这个拼图谜题🧩的所有单独组分。

第一片拼图是**门限密钥生成和重新分享**。我们知道如何在节点加入和离开时在动态共识集中[生成和管理 Shamir 秘密分享](https://eprint.iacr.org/2021/339)，即使对于[大型共识集](https://eprint.iacr.org/2020/464)也可以。这于是允许n个共识节点中的任意t个节点一起行动，就好像它们一起是公钥加密或签名方案的私钥持有者一样。这些进步分别用于防止抢跑交易（例如[Ferveo](https://anoma.network/blog/ferveo-a-distributed-key-generation-scheme-for-front-running-protection/)）和构建简洁轻客户端（例如 [链密钥密码学](https://eprint.iacr.org/2022/087)）。

#### 支持加法的 MOCCA 和交易所

第二片拼图是**门限同态加密**。众所周知且已部署的公钥加密方案，如 ElGamal 和[Paillier](https://link.springer.com/content/pdf/10.1007/3-540-48910-X_16.pdf)，都是加法同态的，并且支持将 Shamir 秘密分享作为密钥。使用它们，我们可以构建支持加法的 MOCCA。

事实证明，我们已经可以使用仅支持加法的 MOCCA 建立链上交易所（特别是恒定功能做市商 CFMM）。[Penumbra](https://penumbra.zone/)利用 ElGamal 加密的加法同态特性来聚合交易和门限解密来揭示一个批次的净交易量。这以[差分隐私](https://eprint.iacr.org/2021/1101)的形式提供了交易的机密性。

#### 来自门限全同态加密的图灵完备 MOCCA

为了实现 MOCCA 进行更一般的计算，我们当然需要全同态加密（FHE）。自2009 年[Genry 的FHE构造](https://dl.acm.org/doi/abs/10.1145/1536414.1536440) 以来，FHE 方案的效率在过去十年中在[理论上](https://eprint.iacr.org/2013/340)和[实践](https://eprint.iacr.org/2018/421)上都在[稳步](https://eprint.iacr.org/2011/277) [提高](https://eprint.iacr.org/2014/816)，并且可能会继续提高（例如通过利用[硬件加速](https://arxiv.org/pdf/2109.05371)）。然而，FHE 本身并不是完整的解决方案，因为持有解密密钥仍然可以让任何一方获得在对应加密密钥下发布的所有信息。这就是以前在区块链场景中部署 FHE 的努力，例[NuCypher](https://www.nucypher.com/)和[smartFHE](https://eprint.iacr.org/2021/133)未能提供保护隐私的链上应用的原因。

幸运的是，我们知道构建[具有门限解密的 FHE 方案](https://eprint.iacr.org/2017/257)的方法，其中解密密钥是 Shamir 秘密分享。具体来说，每个共识节点可以独立对加密的程序状态和输入进行计算，得出加密的新程序状态和_加密_的输出。至关重要的是，为了发布透明输出，共识节点可以通过一轮通信对加密输出进行_门限解密_。这里的门限性质保证了，在任何一轮中，只要在门限数量以下的验证者是恶意的，就只会有预期的信息（即透明输出）被发布出来，而输入和程序状态永远不会被解密。

结合以上内容，我们可以为一般的图灵完备状态转换函数构建一个 MOCCA，它完全依赖于密码学，当然省略了大量的技术细节。（据我所知，在区块链场景中门限 FHE 的确切用法尚未在其他地方说明。也希望能有人指出我错过的先前工作。）

总结
==

隐私是大规模公链采用的最后障碍之一。隐私可以分为两个特征轴：**匿名性**与**机密性**以及**链上隐私**与**来自中介的隐私**。实现隐私的方法分为三类。

首先，使用零知识（ZK）证明（特别是 STARK 或通用 SNARK），我们可以通过将链下计算转移到中介来实现链上匿名性和链上机密性，也因此牺牲来自中介的隐私（例如 [Mina Snapps）](https://docs.minaprotocol.com/en/snapps/how-snapps-work)和[Aleo](https://www.aleo.org/)）。

其次，在不依赖中介的情况下，我们可以为现有的链上应用生态添加匿名性（无机密性），而无需对应用设计进行重大更改（例如[CoinJoin](https://en.bitcoin.it/wiki/CoinJoin)、[Tornado Cash](https://tornado.cash/)、[Aztec Connect](https://aztec.network/)和[FLAX](https://eprint.iacr.org/2021/1249)）。

最后，本文提出了一种称为 MOCCA 的抽象，即**魔法链上机密计算设施**，它可以对加密数据进行计算并_发布透明输出_。MOCCA 可用于构建通用的链上匿名和机密应用，而无需中介。MOCCA 可以用可信任执行环境构建（[Oasis](https://www.oasislabs.com/)和[Secret Network](https://scrt.network/)），也可以依赖于“[对区块链的](https://eprint.iacr.org/2020/464)[门限密码学](https://eprint.iacr.org/2021/339) ”。具体来说，可以使用门限加法同态加密（ElGamal）构建加法MOCCA，实现匿名和机密（[差分隐私](https://eprint.iacr.org/2021/1101)）的链上交易（[Penumbra](https://penumbra.zone/)）；[门限全同态加密](https://eprint.iacr.org/2017/257)（FHE）可用于构建通用MOCCA，以实现_任意_隐私保护的链上应用（于本文提出）。

ZK 方法目前在业界受到了最多的关注。然而，我认为应该更多地关注方法二和三。在当前的智能合约架构中添加易于使用的匿名性是隐私性和功能性之间的一个很好的中间点（有人应该构建[FLAX](https://eprint.iacr.org/2021/1249)！）。此外，我们应该促进门限 FHE 的长期研发工作，以支持一般的隐私保护应用。这些方法之间也不是互斥的，我们完全可以拥有支持所有三种计算类型的应用平台：透明链上、私有链下（ZKP）和“不透明”链上（MOCCA）。

---

*Originally published on [Kurt Pan](https://paragraph.com/@kurtpan/BrTuRfywQBFpplmvuEwN)*
