Wei Dai:为什么隐私是公有链大规模采用的最后障碍之一,如何实现链上隐私?

Captain Hiro

    这篇文章阐述了公有链(又称去中心化账本、加密货币和Web3)背景下的隐私状况。第一部分的内容涉及到了为什么隐私是区块链广泛采用的关键障碍,以及隐私的不同方面是什么。第二部分内容调查了三种不同的隐私处理方法:通过零知识证明,仅以匿名为目标,以及通过一种称为MOCCA的新的抽象概念。
    第一部分:为什么,以及什么是公有链的隐私属性?
    隐私——区块链大规模采用的最后障碍
    由于现代金融系统运行良好,我们不必担心日常交易的安全或隐私问题。当你在超市购物,通过支票支付房租,或者在银行办理短期贷款时,你不必担心你的交易被非相关方进行公开审查。在现代银行和信用卡网络中,交易细节(大部分情况下)停留在相关的金融中介机构和当局内。(理想情况下)用户不必担心他们的敏感信息会被泄露给公众,而当局可以(大部分情况下)追踪非法活动。
    不幸的是,今天在流行的区块链上进行的交易就不是这样的。尽管区块链技术有望实现当前金融生态系统的去中心化和民主化,但大多数系统甚至未能满足我们所期望的最基本的隐私水平。你购买披萨的交易记录可能会被永久记录下来,你的所有交易都可以在Etherscan上被轻易的公开访问。虽然现在有一些以隐私为重点的项目,但由于在功能和易用性方面的不对等,使它们目前还没有得到充分利用。这标志着隐私是大规模采用区块链技术的关键障碍之一。
    公有链环境中的隐私属性不是一个全有或全无的功能。相反,它是一个复杂和多维的问题,在浏览时需要谨慎。让我们首先需要深入了解哪些类型的隐私属性与区块链应用有关。
    隐私的特征轴
    轴A:匿名性和保密性。广义上讲,金融交易的隐私有两种类型:匿名性保密性。当一个非营利组织收到匿名捐款时,他们没有获得任何关于捐赠者的信息(匿名性),但他们知道收到的捐款金额。当你在药店结账时,你的购买记录是保密的——你身后的人不知道你可能开的是什么药,以及这些药的价格,但他们知道你在买药。
    
    匿名性:人们能知道我是交易的发起人么?
    保密性:人们能知道我交易的内容么?
    轴B:链上应用与中介应用。区块链和加密货币的基础理论之一是能够在没有可信的中介机构的情况下进行金融交易。跟随比特币的脚步,几乎所有的加密货币都允许没有中介的直接支付。以太坊等智能合约平台更进一步,它们使支付以外的金融交易可以在没有中介的情况下进行,如交易和借贷。在这篇文章中,我们用链上一词来描述功能和应用,如支付、交易、借贷,用户可以直接作为一个共识节点的运行者来使用。(提醒一下:用户通常不运行自己的共识节点。例如,Web3钱包的第三方RPC端点提供者在实践中应被视为中介机构)。链上应用的一些例子包括比特币和Zcash的支付,Uniswap的交易,以及Compound的借贷。
    
    不幸的是,中介机构在生态系统中仍然是无处不在的。像Coinbase这样的交易所是他们所提供服务的中介——用户需要将资产存入这些交易所进行交易。甚至一些“去中心化”的协议也依赖于中心化运营的中介机构。例如,dYdX和DiversiFi都有中心化交易所运营商。这与Uniswap等链上对应协议不同,它们不需要与共识网络之外的服务器互动。与Coinbase相比,dYdX和DiversiFi的特点是消除了资金安全所需的信任。相反,用户需要信任密码学和代码,特别是STARKs,以保证其资金的安全。支付通道网络(如闪电网络)和roll-ups(如Arbitrum、Optimism、Aztec和Scroll)是另外两类中介应用。虽然目前大多数中介都是中心化的,但它们可以被设计成去中心化的,这对roll-ups应用来说是特别理想的,因为它们直接与侧链竞争。例如,Zk-roll-ups可以有一个具有某种形式的共识机制的roll-up sequencers网络,有效地使roll-up成为一条链。
    上述两种区块链应用的分类为我们提供了一个额外的轴来考虑隐私问题:链上隐私与来自中介机构的隐私。
    
    链上隐私 : 我的信息是否被永久地记录在链上?
    来自中介的隐私: 我的信息是否被披露给我委托代表我行事的实体(想想你的银行、Coinbase和1inch这样的交易聚合商)?
    把这些轴放在一起。通过结合两个隐私特征轴,我们得到了区块链应用的四个隐私概念:匿名性和保密性之间,以及链上与中介之间。下面是一个表格,列出了每个类别的一个隐私问题。
    
    表中展示了每个隐私类别的问题
    链上:
    
  • 匿名性:我在Uniswap上的交易是否可以与我在链上进行的其他活动联系起来,例如NFT交易?
  • 保密性:我在链上的交易总额是公开信息吗?

    来自中介机构:
    
  • 匿名性:交易所运营商(Coinbase、dYdX等)能否根据谁在交易而阻止交易?
  • 保密性:交易所运营商(Coinbase、dYdX等)可以看到并记录交易细节吗?

    当然,对于上述任何一个问题,答案是你的信息被永久地记录在链上并传输给中介机构。有了这样的认识,我们现在就可以深入了解链上和中介区块链应用的隐私是什么。
    免责声明1:虽然大多数应用程序声称是去中心化的,但链上智能合约的开发和访问往往是非常中心化的。例如,一个编码错误往往可以导致数百万美元的漏洞,而去中心化交易所(DEX)交易往往要经过数量不断减少的矿池,这些矿池利用用户的交易为自己牟利(这被称为MEV,即矿工可提取价值)。我们在此不进一步阐述这些问题,因为我们的重点是隐私问题。
    免责声明2:我们不会深入触及隐私的一个重要维度是隐私、监管和合规之间的相互作用。金融中介机构在许多情况下都有法律义务,不仅要了解他们的客户(KYC),还要记录和报告某些金融交易。反洗钱(AML)是其中的主要目标之一。例如,加密货币的透明度最近帮助司法部追回了2016年Bitfinex黑客事件中被盗的价值36亿美元的资金。我们不会触及监管和合规问题,而是在本文中只从技术和理论层面关注隐私问题。
    第二部分:如何构建保护隐私的区块链应用
    让我们先来看看支付,因为它们大多是解决了隐私问题,而且不需要中介机构。Zcash和Monero是两个同时提供匿名性和保密性的大市值加密货币。它们分别依靠零知识证明和环形签名来提供不同程度的匿名性和保密性。我们还有其他建立隐私支付的方法,这些方法更有效,但需要互动,如Mimblewimble,或不需要不断扩大的UTXO集,如Quisquis和Anonymous Zether。
    然而,在支付之外,情况就不那么清楚了。例如,支付之外最成功的应用之一是在去中心化金融(DeFi)领域。但目前我们仍然不知道或没有广泛建立DeFi应用的隐私技术。
    为了全面的对这个问题进行推理,我们首先需要有一个良好的理论模型来谈论链上应用。一般的链上应用可以被建模为迭代计算,由一个过渡函数f指定,它为每个起始状态st和输入计算(st′,输出) f(st,输入)
    
    用户可以在将交易提交给共识节点进行处理之前,将其构建为输入。为了在这个过程中保护用户的隐私,我们需要在不透露用户身份和输入的情况下进行计算。有三种方法:(1)将计算推到链下,(2)保持计算透明但隐藏发起人的身份,以及(3)对加密的输入进行同态计算,输出透明。
    通过ZKP实现链外计算的隐私性
    零知识证明(ZKP)是20世纪80年代末理论计算机科学和密码学领域的一个重要发展(本讲义第1章给出了一个很好的调查)。区块链环境中使用的特殊形式的零知识证明(ZKP)在学术上通常被称为NIZK,即非交互式零知识。当证明是简洁的,它们通常被称为SNARG(或SNARK),或简洁的非交互式论证(知识)。其他感兴趣的特征是透明性(STARKs)和普遍性,这使得证明系统可以用于没有可信设置的多个通路,或者使用一个普遍的可信设置。
    ZKP在公共区块链上的核心应用是执行可验证的、链下计算的能力。通常情况下,验证者是终端用户(在ZK应用平台的情况下)或中介(ZK roll-up),而验证者是区块链,即验证者集。使用ZKP进行一般计算的一个直接方法是直接证明状态转换的正确性。详细说来,用户在链下证明,对于一个特定的链上状态st,用户有一个输入,当应用于检查状态st时,会产生一个具有某种输出的新状态st′,然后共识节点在覆盖旧状态之前验证提议的状态转换的有效性。这是Mina Snapps和Aleo等ZK应用平台采取的方法,这两个平台的灵感来自Zexe的学术工作。
    
    透明链上应用与上述架构的关键区别在于,前者天真地认为,一个更新(st′,输出,π)只对用户用于生成更新的应用状态st有效。如果多个用户在没有协调的情况下与同一个应用程序互动,这将导致 “竞赛条件(race condition)”。为了详细说明这个概念,假设有两个有效的事务针对同一个链上状态st0进行构建,分别将其更新为st1st2。当第一个交易被记录在链上时,链上状态被更新为st1。因此,第二笔交易是使用新的状态st1,而不是st0来验证的,这很可能导致其无效。
    值得注意的是,人们可以通过将应用状态分割成独立的部分或完全消除共享链上状态来绕过这个竞赛条件。这使得这些ZK-应用平台非常适合不需要用户之间共享状态的特定应用(例如ZKPass),但对于大多数需要这些共享状态的链上应用,特别是像恒定功能做市商(CFMMs)这样的链上DeFi协议,就不是那么合适了。对于这些应用来说,由于竞赛条件的问题,在整个应用状态转换中使用ZKPs有点像 “狗熊掰棒子 ”的解决方案。然而,有一个解决方法,那就是增加一个中介或交易运营商,使应用状态对运营商来说是私有的,而不是在所有用户之间共享。不幸的是,如果不采用本文后面讨论的其他解决方案,就没有已知的办法从这些中介那里隐藏交易信息。总而言之,ZK应用平台上的交易所,如Aleo和Mina,实现了以下隐私特性。
    
    表中详细列出了可在Mina和Aleo等ZK应用平台上建立的交易所的隐私特性
    链上
    
  • 匿名性:
  • 保密性:

    来自中介机构:
    
  • 匿名性:
  • 保密性:
透明链上计算的匿名性
    为链上应用添加保密性是很难的。如果我们不试图提供保密性,而只想提供匿名性呢?使用现有的工具已经可以做到这一点:使用CoinJoin和Tornado Cash等tumbler和混合器(mixer),人们可以资助新的伪匿名地址以获得匿名性。不幸的是,这些工具的选择性质意味着它们更多地被恶意用户而不是合法用户所利用。例如,CoinJoin被Colonial Pipeline勒索软件使用,而Tornado Cash经常被用来资助匿名地址,以帮助DeFi黑客。
    有两个项目试图在透明的智能合约平台上建立默认的匿名性。第一个是Aztec Connect,这是一个新兴的以太坊的“zkzk-rollup”,它在与支持的第一层应用程序进行交易时,提供交易匿名性。roll-up合约代表第二层用户(其身份在链上和roll-up供应商处都是隐藏的)与第一层DeFi协议互动,为这些第二层用户提供匿名性。
    第二个是FLAX的学术工作。它提出重新设计一个类似以太坊的智能合约平台,以支持终端用户的内置匿名性。在核心方面,FLAX提出了一个匿名版本的ERC20代币标准,允许匿名原子化的代币使用授权。有趣的是,实现这些 “匿名ERC20”不需要新的加密技术。人们可以在代币合约内使用之前提到的任何隐私支付计划中的相同技术,如Zcash、Monero或Zether。
    下面是一个表格,概述了上面讨论的解决方案的隐私特征。我们在这里省略了中介一栏,因为没有涉及到中介,除了Aztec Connect,它有可能提供来自中介(roll-up供应商)的匿名性,这取决于去中心化的程度和这些供应商的确切行为。
    
    表中详细列出了tubler、混合器、Aztec Connect和FLAX的隐私特征
    链上:
    
  • 匿名性:是(在tumblers和mixers的情况下是可选,在Aztec Connect和FLAX的情况下默认)。
  • 保密性:
通过MOCCA进行链上计算的隐私性
    如果我们可以加密链上的应用程序状态和用户输入,但仍然能够对其进行计算,甚至得出公共的未加密的输出信息,那样会发生什么?让我们把这样一种理想的功能称为神奇的链上保密计算设备(MOCCA)。
    
    直观地说,MOCCA为状态转换函数f提供了可能的最佳隐私。它们可以在链上计算,给定必要的加密输入,并且计算应该产生一个加密的和更新的状态,以及一些透明的输出值。具体来说,程序的状态和输入被加密到链上,这样一来,唯一可以进行的共识操作就是计算状态的转换,这意味着只有应用意图的信息被解密并变得透明。暂时假设我们有这样一个魔盒,那么就很容易复制链上应用程序的功能,同时提供隐私属性。因为应用设计者可以设计他们的应用,只发布相关的信息作为透明的输出,如现货价格或储备金额。
    
    有两种方法来构建MOCCA,通过可信的硬件和通过密码学。在任何一种情况下,我们都可以希望实现没有中介的保护隐私的去中心化应用,并具有以下特性。
    
    表中详细列出了来自MOCCA的应用的隐私特性
    链上:
    
  • 匿名性:
  • 保密性:是(确切的隐私取决于应用的设计)

    来自可信硬件的MOCCA。第一个解决方案是利用可信的执行环境,特别是Intel SGX。这是在Ekiden的学术工作中首次描述,也是Oasis和Secret Network采取的方法。已经有一些应用程序在这些平台上运行,如Secret Swap。然而,众所周知,Intel SGX是有缺陷的。
    来自密码学的MOCCA。我们可以只用密码学来构建图灵完备的MOCCA么?事实证明,答案是肯定的,而且密码学家已经发现了这个难题的所有个别部分。
    拼图的第一块是阈值密钥(threshold key)的生成和重新共享。我们知道如何在节点加入和离开时在动态共识集中生成和管理Shamir秘密共享(secret share),即使是大型共识集。这些允许“n”个共识节点中的任何数量的“t”采取行动,就像他们一起是公钥加密方案或签名方案的密钥持有人一样。这些进展被提出来,分别是为了防止前面的运行(例如Ferveo)和构建简洁的轻客户端(例如链-密钥密码学)。
    加法(Additive)MOCCA和交易所。拼图的第二块是阈值同态加密。著名的和已部署的公钥加密方案,如ElGamal和Paillier都是加法同态的,并支持Shamir秘密共享作为密钥。利用它们,我们可以建立支持加法的MOCCA。
    事实证明,我们已经可以使用只支持加法的MOCCA建立链上交易所(特别是恒定函数做市商,或CFMMs)。这是Penumbra的天才观察,它利用ElGamal加密的加法同态性来汇总交易,并通过阈值解密来揭示一批交易的净额。这以差异隐私的形式提供了交易的保密性。
    来自阈值FHE的图灵完备的MOCCA。为了实现更普遍的计算的MOCCA,我们当然需要完全同态加密(FHE)。自2009年Genry首次构建FHE以来,FHE方案的效率在过去十年中在理论上和实践上都有了稳步的提高,并有可能继续提高(例如,通过挖矿硬件加速)。然而,FHE本身并不是全部的解决方案,因为持有解密密钥仍然使任何一方能够获得在相应的加密密钥下曾经发布到链上的所有信息。这就是以前在区块链环境中部署FHE的努力,如NuCypher和smartFHE在提供保护隐私的链上应用方面的不足之处。
    幸运的是,我们知道如何构建具有阈值解密的FHE方案,其中解密密钥是Shamir秘密共享的。具体来说,每个共识节点可以独立地对加密的程序状态和输入进行计算,得出加密的新程序状态和加密的输出。最重要的是,为了释放透明的输出,共识节点可以通过一轮通信对加密的输出进行阈值解密。这里的阈值属性保证,只要在阈值以下的验证者是恶意的(在任何时代),那么只有预期的信息(即透明输出)被释放,而输入和程序状态永远不会被解密。
    结合上述内容,我们可以为一般的图灵完备的状态转换函数建立一个纯粹依靠密码学的MOCCA,当然这其中还需要修改许多技术细节。(据我所知,区块链环境中阈值FHE的这种确切用法还没有在其他地方说明。如果能指出我所遗漏的先前的工作,我将不胜感激)
    总结
    隐私是公有链大规模采用的最后障碍之一。隐私可以分为两个特征轴:匿名性与保密性链上隐私与来自中介的隐私。有三类方法来实现隐私。
    首先,使用零知识(ZK)证明(特别是STARKs或通用SNARKs),我们可以通过将计算转移到链下的中介机构来实现链上匿名和链上保密,从而牺牲来自中介机构的隐私(例如Mina Snapps和Aleo)。
    其次,在不依赖中介的情况下,我们可以将匿名性(不含保密性)添加到现有的链上应用生态系统中,而无需对应用设计进行重大改变(例如CoinJoin、Tornado Cash、Aztec Connect和FLAX)。
    最后,本文提出了一个被称为MOCCA的抽象概念,即神奇的链上保密计算设备,它可以对加密数据进行计算并发布透明的输出。MOCCA可以用来构建通用的链上匿名和保密应用,而不需要中介。MOCCA可以从可信的执行环境(Oasis和Secret Network)或依靠“区块链的阈值密码学”来构建。具体来说,阈值加法同态加密(ElGamal)可用于构建加法MOCCA,以实现具有匿名和保密性(不同的隐私属性)的链上交易所(Penumbra);阈值完全同态加密(FHE)可用于构建通用的MOCCA,以实现任何保护隐私的链上应用(在这篇文章中提出)。
    ZK方法目前在业界受到的关注最多。然而,我认为,更多的注意力应该放在第二和第三种方法上。将易于使用的匿名性添加到当前的智能合约架构中,是隐私和功能之间的一个很好的中间点(应该有人建立FLAX!)。此外,我们应该促进对阈值FHE的长期研究和开发工作,以支持一般的隐私保护应用。这些方法也不是排他性的,我们可以有支持所有三种计算类型的应用平台:透明的链上、隐私的链下(ZKPs)和“不透明的”链上(MOCCAs)。如果你对上述任何一项感兴趣,请与我联系。
    致谢
    非常感谢Alex Evans和Guillermo Angeris提出的有益的编辑意见。感谢Adrian Brink创造了“不透明(opaque)”一词来描述加密数据的链上计算。
    原文链接:https://wdai.us/posts/navigating-privacy/