Post

区块链隐私计算行业分析

独立思考来自于更多维度的了解信息,本文是对当前区块链生态中隐私问题的概括性介绍,希望给读者一个宏观视角来观察当前加密行业在隐私方面的进展,区块链及其衍生出来周边生态也被熟知为智能合约、去中心化App、Web3.0等,为了统一术语消除歧义,本文用公链一词指代。

本文第一部分介绍为什么隐私问题是未来公链大规模应用的一大障碍,以及对当前公链隐私问题的两个思考维度。第二部分探索调研当前业界实现公链隐私保护的三种主要技术途径:链下零知识证明计算、链上混币交易实现匿名性、秘密分享与同态加密等前沿密码学技术实现链上隐私。最后,展望未来公链隐私方面的发展趋势,希望本文可以为中文去中心化社区的发展做出一份贡献。

为什么公链需要隐私?

隐私是公链走入大众的一大障碍

现代金融系统是一个运行良好的体系,广大民众每天都在使用并且不需要担心资金安全与交易隐私,因为保证用户的财产安全与交易隐私是银行等金融机构的基本义务。当你用银行卡结算买车时,逢年过节给亲戚好友发红包时,在手头不宽裕的时候向银行小额贷款时,完全不会担心这些交易细节被公之于众,在现代银行和信用卡结算网络中,用户的交易数据只存在于相关金融机构与监管部门内部。在理想的状况下不会泄露这些数据,并且监管部门还可以用这些数据追踪不法分子的交易往来,保障社会秩序与金融运转。

然而在当前大多数你所听说过的区块链项目中,情况不是这样。即便区块链技术以去中心化、不可篡改性、安全程度高等特性广为人知,然而当前区块链跟现代金融系统比,它甚至不能满足支付、交易等活动中最基本的隐私需求,链上的一切交易都是公开可查询的。可能你听说过区块链是由各种密码学算法组成的分布式系统,这没错,但请不要误以为区块链会保护你的交易数据不被别人看到。这听起来有点违反常理,但切切实实存在。用比特币买披萨的记录会被永远的记录在比特币网络中,可以被任何人查询[1]到。同样的道理,在以太坊上参与的一切去中心化活动,以及所有账户的余额,都可以用Etherscan[2]这个网站轻松查到。这个问题在区块链技术诞生之初就一直存在,即便近年来发展出一些关注隐私的公链项目,但大都因为在功能性和易用性方面缺乏好的设计,在去中心化社区中并没有得到广泛应用。这一切都表明克服公链隐私问题势在必行,隐私成为公链步入大众,进一步广泛应用的一大障碍。

公链隐私问题的两个思考维度

在一切开始之前,首先要明确的问题是,当谈及公链中的隐私时,我们在谈什么,业界喜欢准确且轮廓清晰的问题描述。接下来从公链的隐私概念以及隐私所在的架构位置这两个维度展开探讨。

维度1,匿名性与机密性。宽泛的说,在现代金融交易系统中隐私有两方面:匿名性和机密性。试想一个非盈利的公益组织收到匿名捐款,如果从捐款交易中除了金额以外不能获得任何与捐款人账户有关的信息,这被称为匿名性。另一种场景,当购买商品时别人不知道你购买了什么商品以及你花了多少钱,别人只知道你在购买商品,这被称为机密性。考虑到当今流行大多数区块链支持智能合约,这类链不单是一个账本,而且是一个支持图灵完备编程语言的去中心化状态机。综上所述,可以把思考区隐私的第一个维度一般化的概括为:

• 匿名性:别人是否知道交易的发起方/合约的调用方。

• 机密性:别人是否知道交易的内容/合约的状态与参数。

维度2,链上计算与中介计算。区块链以及诸多加密货币的基本论点之一是能够在没有可信第三方情况下直接进行金融活动。以比特币为代表的加密货币都允许在没有可信第三方的情况下直接支付,以太坊等支持智能合约的区块链进一步使得除了支付以外的通用合约能够在无需可信第三方的情况下安全执行。在本文中,使用术语“链上”来描述那些用户直接作为共识节点参与活动的行为,如支付、交易、借贷等。链上的一些例子包括直接使用比特币[3]或ZCash[4]支付,以及去中心化交易所Uniswap[5]上的交易,合约中抵押资产的杠杆贷款等。但需要注意的是,成为共识节点对计算机的算力、存储、带宽等有较高要求,而用户一般是持有个人计算机或者移动设备的普通人,他们通常不会运行共识节点,而是通过Web3钱包与区块链交互,在这种情况下钱包的RPC提供商就被视为中介。

下面这个事实会让很多人感到惊讶,在宣称去中心化的公链生态中,中介无处不在。例如,用户要想参与数字货币交易,需要把资产存入Coinbase[6]交易所,此时中心化交易所就扮演中介的角色,此外还有宣称是去中心化的交易所项目,但其实它们也需要中心化的中介,例如dYdX[7]和DiversiFi[8]都存在中心化的运营商,相比于Coinbase[6]这样的交易所,只是采取链下撮合链上结算的方式,使用STARKs[9]解决了资金安全的信任问题,但其本质上仍然是中介。注意Uniswap[5]链上交易所与上述交易所不同,它的用户不需要与区块链共识网络之外的服务器发生交互。除了交易所之外,当前公链生态中还有另外两类中介,第一类被称为Payment Channel网络,典型的就是比特币闪电支付[10],另外一类被称为roll-ups[11],包括Arbitrum[12],Optimism[13],Aztec[14]和Scroll[15]等。需要额外说明一点,这些中介可以是中心化的,但也可以被设计成去中心化的,比如roll-ups[11]的设计目标就是成为去中心化的侧链,以此来增加主链的可扩展性,还有zk-roll-ups,社区目前在探讨是否可以通过特别设计的共识机制[16],来使其成为真正去中心化的Layer2。上述公链生态的两种表现形式,为隐私提供了第二个思考维度。

• 链上隐私:交易/合约执行信息是否被永久记录在链上。

• 中介隐私:交易/合约执行信息是否披露给代表用户在链上发起交易的第三方实体,例如中心化交易所Coinbase[6]或Layer2中zk-roll-ups节点等。

总结一下,现在有了思考公链隐私的两个维度,第一个维度是匿名性与机密性,第二个维度是链上隐私与链下隐私,把这两个维度结合起来,可以把隐私问题细分得到下面待解决的四个子问题:

• 链上匿名性:例如根据用户在链上交易所Uniswap中的交易信息,是否可以查询到用户在链上进行的其他活动,比如NFT交易。

• 链上机密性:例如用户在链上的交易金额以及执行合约的输入数据是否是公开可查询的。

• 链下匿名性:交易所运营商(Coinbase[6]、dYdX[7]等)是否能组织特定用户的交易,比如近期出现的封禁俄罗斯用户交易事件。

• 链下机密性:交易所运营商(Coinbase[6]、dYdX[7]等)是否能查看并记录交易内容的具体信息。

上述所有问题的解决途径将在接下来探讨。此刻可以确定的是,在存在中介的公链生态中,技术上来看都是这样的情况:用户的数据经由中介后公开的记录在链上。请读者理解这一点后把它记在心中,接下来探讨采用不同的技术,在链上和中介分别可以实现什么样的隐私。

这里是一段短的声明:虽然加密行业中多数项目宣称是去中心化的,但链本身及其生态的设计与开发往往是中心化的,例如公链和合约的代码都是开源的,但实际上除了项目开发者,任何其他人都不会仔细阅读这些代码,读者试想你是否知道以太坊数据结构的实现方法,是否了解Uniswap[6]流动性资金池的恒值函数。此外,矿工们为了追求利润,世界上越来越多共识节点集中到几个大型的矿池,这进一步削弱了区块链的去中心化特性,还有链上合约漏洞导致数百万美元损失的新闻屡见不鲜。但本文不会探讨这些问题,主要关注公链生态中的隐私问题,另外本文也不会涉及对隐私与监管、合规关系的探讨,因为一般情况下金融机构不仅有了解客户(Know Your Customer)的监管义务,而且在反洗钱(AML)的要求下,还需要有保存和向有关部门披露交易内容的法律义务,因此隐私与监管、合规的关系是一个大话题,本文仅仅从理论技术层面探讨公链的隐私问题。

当前公链如何实现隐私?

从技术角度来看支付是最容易实现隐私的功能,以资金盘较大的两条隐私链Zcash[4]和Monero[17]为例,它们分别使用零知识证明数和环签名技术提供链上的匿名性与机密性。此外还有相对更高效的链上隐私支付方案Mimblewimble[18],不过它的缺点是需要多轮的交互,引入了较大的攻击面。或者是生成不固定地址的方案,例如Quisquis[19]、Anonymous[20]和Zether[21]等。总的来说,链上支付的隐私问题不难解决。然而业界对于除支付外的其他去中心化活动,即智能合约隐私化的技术路线并不明确,例如DeFi领域的绝大多数去中心化应用,目前没有被广泛使用的隐私保护方案。

为了完整的介绍链上计算的隐私保护方案,首先要形式化描述链上计算的抽象模型。一切的链上计算都可以抽象成状态机,通过执行函数在不同状态间转移,把它记为函数f(s_t,input)=(s_(t+1),output),其中input是调用合约的输入,output是合约运行结果,合约计算过程可以用下面这张图表示。

可以看出来,对链上计算过程的实施隐私保护,其实就是在不泄露调用者身份和输入的情况下执行智能合约。概括来讲当前业界的解决方案可以分为三大类。

• 把计算过程转移到链下,使用零知识证明验证计算的正确性。

• 链上计算保持公开透明但隐私调用者的身份。

• 使用同态加密算法保护输入和链上状态,只解密输出结果。

通过零知识证明实现链下计算隐私

零知识证明是上世纪八十年代密码学与理论计算机界重要的科研成果,这篇笔记[22]系统性的概括了零知识证明技术的发展过程,还有这篇预印文[23]介绍了目前被广泛使用的zk-SNARKs背后的数学原理,本文不包括对零知识证明算法的介绍。注意一点,当前区块链中使用的零知识证明技术在学界被称为非交互式的,简称NIZK(Non-Interactive Zero Knowledge),当证明数据的长度与输入数据长度成线性关系时,即空间复杂度为时,被称为简洁证明算法,这两个特性连起来即zk-SNARKs。此外,当前业界还在关注的一些其他特性,例如初始化过程的公开性,即这种证明算法可以在不可信的网络中执行可信的初始化过程;还有初始化过程的全局性,即只需要全局初始化一次,就可以证明任何的图灵完备程序。

零知识证明技术在区块链中主要被用于验证链下计算的正确性,例如roll-ups方案中,链下的节点充当中介,它扮演证明算法中的证明者,链上的验证节点扮演证明算法中验证者,可以在不泄露链下合约状态与用户输入的前提下,验证计算执行的正确性,链上的验证节点在验证通过后再更新链上状态。这种方法最早是有学界Zexe[26]提出的,受此启发,业界中如Mina zkApps[24]和Aleo[25]都是采用上述方法。

需要注意的是,上述方法看似完美但仍然存在问题,首先计算过程对证明算法中的证明者是公开的,因此无法保护链下计算的隐私,此外在链上缺乏锁定机制的情况下,还可能会导致条件竞争。由于新的状态来自于用户调用合约时刻的状态,这意味着如果有多个用户在缺乏协调机制的情况下,对链上同一个合约状态进行修改,会导致并发条件竞争的问题。举一个具体的例子,假如链上有状态,用户通过链下计算得到状态,接下来是验证过程,注意还没有真正的更新到链上,此刻用户调用合约,把链上状态从转移到并更新到链上,接着用户的新状态被验证结束,验证节点把更新到链上。可以看到这个过程中状态覆写导致用户的更新无效。现在业界的方法是避免状态共享,通过区分不同用户在链上的状态来解决条件竞争问题,这种方法非常适合用户间不存在状态共享的应用场景,例如ZKPass[27]。但对于生态中绝大多数需要共享链上状态的场景,这种方法并不适用,尤其是DeFi场景。

此外,在这种技术途径下,负责链下计算的节点或者Layer2/侧链实际上充当了中介的角色,状态对于中介是公开的,在一些场景中,比如基于恒值函数做市的去中心化交易所,恶意的套利者可以通过公开在中介上的交易信息实现front-running攻击。在不涉及本文后面讨论的其他方法前提下,目前没有已知的方法可以对这些中介隐藏信息。综上所述,使用零知识证明的这种途径可以实现链上计算的匿名性和机密性,但不能实现链下或者说中介计算的机密性。

公开透明的链上信息也需要隐私

从技术角度讲,既然不依赖中介为链上生态添加机密性保护比较困难,那么是否可以只为链上生态添加匿名性。答案是的,例如CoinJoin[28]和Tornado Cash[29]通过混币交易的思想来达成这一目的,这类方法的思路是把多个实际交易合并成一个包含有多个发起者和接受者的大交易,用户通过不断的生成新地址来实现匿名性,但很明显这种匿名性的保障比较弱,已经有观点表示这些链上的一些交易可以被追踪。

再回到零知识证明的技术途径,Aztec Connect[30]是以太坊上即将上线的链上”zkzk-rollup“隐私解决方案,它可以被理解成是在主链与zk-rollup链之间的零知识证明跨链方案,这样可以使得链下的zk-rollup合约与链上合约交互式计算,为用户提供了匿名性保护。FLAX[31]是近期的预印文,它通过重新设计合约虚拟机来提供匿名性,主要思想是为代币标准ERC20添加匿名特性,因此在这个链上实现新的支持匿名性的代币门槛很低,开发者甚至不需要了解密码学就可以完成,而且这类代币的特性跟上面所提到的ZCash、Monero、Zether特性基本一致。

基于前沿密码实现链上计算隐私

能不能用一种方法,把链上状态以及用户输入都加密,只解密链上计算的输出结果。这样便可以在无需中介的前提下,同时实现链上的匿名性与隐私性。本节介绍用来实现这种特性的一些方法,这些方法大体上可以被分为两类,基于可信硬件执行环境的,以及基于若干前沿密码学技术的。

一句话概括,这种方法支持状态转移函数在密态内容上执行,用户把状态和输入加密后保存到区块链,只把链上计算的结果公开。这样可以支持很多隐私保护的Defi场景,例如支付、借贷、交易所等,例如在隐私保护的去中心化交易所中,除了把代币价格和流动池可用量公开,其他所有信息都保持加密。

首先是使用可信硬件执行环境的方法,目前被业界广泛使用的是Intel SGX[32]硬件,它可以被理解成处理器中的一块区域,在这块区域中的代码和内存都是保密且不可被篡改的,理想状态下,即便是持有该设备的最高权限管理员用户也无法查看或是更改篡改的内容。这一技术途径首先由学界Ekiden提出,接着Oasis[33]和Secret Network[34]这两个公链落地实现,目前具有隐私保护特性的去中心化交易所Secret Swap[35]正是运行在Secret Network[34]链上。但这种技术途径的缺点也比较明显,其隐私性的前提是假设可信硬件执行环境是安全,一旦可信硬件被攻破或者被生产商植入后门,隐私性将不复存在,不幸的是Intel SGX已经被多次发现漏洞[36],并且硬件漏洞相比软件漏洞更难以修复。

另外是使用密码学算法在密态内容上计算的方法。简单介绍下门限秘密分享的概念,的秘密分享就是将秘密分享给个参与方,在允许合谋的前提下,任何不超过个参与方都不能得到秘密的任何信息,至少要个参与方合作才可以恢复出秘密。文献[37]给了一种在共识节点动态加入和退出的情况下,维护门限秘密分享的解决方案,此外文献[38]进一步提升了门限秘密分享在大规模共识网络中的性能。通过把密钥或者签名私钥秘密分享到共识网络,可以构建隐私保护的去中心化交易所[39],以及简洁轻客户端[40]。

ElGamal或Pailliar是当前业界广泛使用的两种加法同态算法,把它们的密钥作为秘密,分享到去中心化网络,可以支持链上的隐私加法运算,据此可以实现基于恒值函数的去中心化的交易所,例如Penumbra[41]正是使用ElGamal的加法同态特性,以及秘密分享的门限特性。通过各秘密分享参与方合作恢复密钥,解密公开特定的信息。此外还有研究使用差分隐私[42]实现基于恒值函数的隐私交易所。

最后,全同态加密是实现更通用的链上隐私计算的一项重要手段,自从2009年Genry[43]之后,全同态加密取得了很大的进展,这包括理论算法进步和工程硬件加速,全同态加密落地实践只是时间问题。当然只依靠全同态加密并不能解决当前公链隐私问题,比如NuCypher[44]和smartFHE[45]使用全同态加密技术途径,但解密密钥由中心化节点保存的,这显然削弱了区块链的去中心化特性。因此,若在区块链中使用全同态加密,如何在共识网络中管理密钥是无法绕过的一个话题。和上述方法一样,文献[46]提出使用门限秘密分享算法把密钥分享到共识网络,各个节点在密态内容与密态输入上执行计算,之后共识节点通过交互合作恢复出密钥,解密获得输出结果。

总结

隐私问题是公链走向大规模应用路上的一大障碍,当谈及公链隐私时,往往有两个思考维度,从隐私的特性来看有匿名性和机密性,从所处的位置来看有链上隐私和中介(链下)隐私。目前业界主要有三种实现公链隐私的技术途径。

首先,使用零知识证明技术,尤其是zk-STARKs和zk-SNARKs这两种常被使用的算法框架把计算转移到链下,这种技术途径可以在链上同时实现匿名性与机密性。但需要注意在这种方式中,链下计算的隐私是缺乏保护的,例如Mina zkApps[24]和Aleo[25]。其次,可以在不依赖链下中介且不对区块链架构大改的情况下,为现有的链上生态添加匿名性(不包括机密性),例如CoinJoin,Tornado Cash,Aztec Connect,和FLAX。

最后,本文用“基于前沿密码实现链上计算隐私”这一不太正式的称谓,来概括性介绍基于可信执行环境、门限秘密分享、同态加密技术等实现隐私的方法,这一类方案在无需中介的前提下实现了的链上匿名性与机密性。例如使用可信硬件执行环境的Oasis[33]和Secret Network[34],还有FLAX在功能性、易用性与链上隐私之间上谋得一种平衡,提供了一种新思路。此外使用门限秘密分享实现隐私公链,Shamir门限秘密分享方案可以看做是一种门限加法同态加密方案,基于此可以实现支持加法计算链上的匿名性和机密性隐私,例如隐私去中心化交易所Penumbra[41],近年来学界持续提出的新门限全同态加密方案,可以考虑用来实现支持通用计算的链上匿名性与机密性。

在上述三种技术途径中,虽然目前业界对零知识证明实现隐私方案投入了最大的关注,但实际上第二、三种技术途径也同样需要关注,考虑到第三种技术途径中门限全同态加密技术带来的隐私效果是最佳的,因此业界应该推动对门限全同态加密的长期学术研究和工程开发工作。当然这几类技术途径并不是相互排斥的,它们甚至可以同时出现在系统中,比如公开的主链支持链上计算、零知识证明实现隐私的链下计算、以及门限全同态的另外一条链支持隐私链上计算。

参考

[1]. https://www.blockchain.com/btc/tx/cca7507897abc89628f450e8b1e0c6fca4ec3f7b34cccf55f3f531c659ff4d79

[2]. https://etherscan.io/

[3]. https://bitcoin.org/en/

[4]. https://z.cash/

[5]. https://uniswap.org/

[6]. https://www.coinbase.com/

[7]. https://dydx.exchange/

[8]. https://deversifi.com/

[9]. https://starkware.co/

[10]. https://lightning.network/

[11]. https://vitalik.ca/general/2021/01/05/rollup.html

[12]. https://developer.offchainlabs.com/docs/rollup_basics

[13]. https://www.optimism.io/

[14]. https://aztec.network/

[15]. https://scroll.io/

[16].https://ethresear.ch/t/proof-of-efficiency-a-new-consensus-mechanism-for-zk-rollups/11988

[17]. https://www.getmonero.org/

[18]. https://eprint.iacr.org/2018/1039

[19]. https://eprint.iacr.org/2018/990

[20]. https://eprint.iacr.org/2020/293

[21]. https://eprint.iacr.org/2019/191

[22]. https://cseweb.ucsd.edu/~mihir/cse208-Wi20/main.pdf

[23]. https://arxiv.org/abs/1906.07221

[24]. https://docs.minaprotocol.com/en/snapps/how-snapps-work

[25]. https://www.aleo.org/

[26]. https://eprint.iacr.org/2018/962

[27].https://minacrypto.com/2022/02/03/snapps-mina-club-interview-with-zkpass-co-founders/

[28]. https://en.bitcoin.it/wiki/CoinJoin

[29]. https://tornado.cash/

[30].https://medium.com/aztec-protocol/private-defi-with-the-aztec-connect-bridge-76c3da76d982

[31]. https://eprint.iacr.org/2021/1249

[32].https://www.intel.com/content/www/us/en/developer/tools/software-guard-extensions/overview.html

[33]. https://www.oasislabs.com/

[34]. https://scrt.network/

[35]. https://secretswap.net/

[36]. https://arxiv.org/pdf/2006.13598.pdf

[37]. https://eprint.iacr.org/2021/339

[38]. https://eprint.iacr.org/2020/464

[39]. https://anoma.network/blog/ferveo-a-distributed-key-generation-scheme-for-front-running-protection/

[40]. https://eprint.iacr.org/2022/087

[41]. https://penumbra.zone/

[42]. https://eprint.iacr.org/2021/1101

[43]. https://dl.acm.org/doi/abs/10.1145/1536414.1536440

[44]. https://www.nucypher.com/

[45]. https://eprint.iacr.org/2021/133

[46]. https://eprint.iacr.org/2017/257

This post is licensed under CC BY 4.0 by the author.