本文翻译自:https://blog.ethereum.org/2016/01/15/privacy-on-the-blockchain/
,Vitalik Buterin于2016年1月15日发布
区块链是一项强大的技术。它们允许以一种极大地提高可靠性、消除与由中心实体管理的流程相关的业务和政治风险并减少对信任的需要的方式来执行大量的交互。
然而,当我和其他人与公司讨论在区块链上构建应用程序时,两个主要问题总会出现:可扩展性和隐私。可扩展性是一个严重的问题;目前的区块链每秒处理3-20笔交易,其管理能力远不及主流支付系统或金融市场所需的处理能力,更不用说物联网的去中心化平台或全球微支付平台了。幸运的是,有一些解决方案,我们正在积极地实现这些解决方案的路线图。区块链的另一个主要问题是隐私。与区块链的其他优点一样引人注意的是,无论是企业还是个人都不太愿意将自己的所有信息发布到一个公共数据库中,这个数据库可以不受本国政府、外国政府、家庭成员、同事和商业竞争对手的任何限制任意读取。
与可扩展性不同,隐私解决方案在某些情况下更容易实现(但在另一些情况下要困难得多),其中许多与当前存在的区块链兼容,但也不太令人满意。创造一种“理想”技术要难得多,这种技术允许用户在区块链上做他们现在能做的所有事情,但要保护隐私;相反,在许多情况下,开发人员将被迫处理部分解决方案、启发式方法和机制,这些解决方案和机制旨在为特定的应用程序类带来隐私。
理想方案
首先,让我们从理想的技术开始,它们确实提供任意应用程序转换成完全的承诺保护隐私的应用程序,允许用户受益于一个区块链的安全,使用分布式的网络来处理事务,但“加密”数据,即使一切都被计算在普通的场景中,底层的“有意义”的信息完全混淆。
最有前途的技术当然是加密的模糊处理。一般来说,模糊是一种将任何程序转变成一个“黑盒”的计划,以这样一种方式,该项目仍然有相同的“内在逻辑”,而且还提供了相同的输出对于相同的输入,但它是不可能确定程序其他细节是如何工作的。
不幸的是,绝对完美的黑盒混淆在数学上是不可能的;事实证明,总有一些东西,你可以从程序中提取出来,通过观察它,而不仅仅是它给出的特定输入集的输出。然而,有一种更弱的标准叫做不可分辨模糊,我们可以满足:本质上,给定两个等价的程序,它们已经被使用该算法进行了模糊处理。和,我们无法确定这两个输出中的哪一个来自哪个原始源。要了解它如何仍然强大到足以满足我们的应用程序,请考虑以下两个程序:
一个只返回零,另一个使用内部包含的私钥对消息进行加密签名,在另一次执行相同的操作,彼此减去(显然相同的)结果并返回保证为零的结果。即使一个程序返回0,另一个包含并使用加密私钥,如果不可分辨性满足然后我们知道两个混淆程序不能相互区别,所以有人拥有混淆项目肯定无法提取出私钥,否则,这将是区分两个程序的一种方式。这是一个相当强大的混淆——大约两年来,我们已经知道如何做到这一点!
那么,我们如何在区块链上使用这个呢?这里有一个简单的数字令牌方法。我们创建一个包含私钥的混淆的智能合约,并接受用相关的公钥加密的指令。合约将帐户余额加密存储,如果合约希望读取存储,则在内部对其解密,如果合约希望写入存储,则在写入之前对所需的结果进行加密。如果有人想读取他们的帐户余额,那么他们将该请求编码为事务,并在自己的机器上模拟它;混淆的智能合约代码将检查事务上的签名,以查看该用户是否有权读取该余额,如果他们有权读取该余额,则将返回解密的余额;否则,代码将返回一个错误,用户无法提取信息。
然而,与其他几种此类技术一样,有一个问题:处理这种混淆的机制效率低得可怕。十亿倍的开销是正常的,而且常常是非常乐观的;最近的一篇论文估计,“在同一个CPU上执行[一个2位乘法]电路将需要1.3 * 108年”。此外,如果希望防止对存储的读写成为数据泄漏的载体,还必须设置合约,以便读写操作总是修改合约整个状态的大部分——这是开销的另一个来源。最重要的是,当您有数百个节点在区块链上运行代码的开销时,您可以很快看到这项技术是如何工作的,不幸的是,它不会很快改变任何东西。
退一步采用的方案
但是,有两个技术分支几乎可以达到混淆的程度,尽管它们对安全模型有重要的影响。第一个是安全多方计算。安全多方计算允许一个程序(及其状态)在N个方之间以一种你需要M个方(例如。N = 9, M = 5)合作完成计算或揭示程序或状态中的任何内部数据。因此,如果您可以相信大多数参与者都是诚实的,那么这个方案就如同混淆一样好。如果你不能,那么它就毫无价值。
安全多方计算背后的数学是复杂的,但比混淆要简单得多。SMPC的效率也比混淆要高得多,即您可以使用它来进行实际计算,但即使如此,它的效率仍然非常低。加法操作可以相当快地处理,但是每次SMPC实例执行一些非常小的固定数量的乘法操作时,它都需要执行一个“程度缩减”步骤,其中包括从网络中的每个节点向每个节点发送消息。最近的工作将通信开销从二次型降低到线性型,但即使这样,每个乘法操作仍然会带来一定程度的不可避免的网络延迟。
对参与者的信任要求也很苛刻;请注意,与许多其他应用程序的情况一样,参与者有能力保存数据,然后在历史上的任何未来点合谋进行揭露。此外,我们也不可能知道他们做了什么,因此也不可能激励参与者去维护系统的隐私;基于这个原因,安全多方计算可能更适合于私有区块链,而不是公共区块链。私有区块链的激励机制可以来自协议之外。
另一种具有强大特性的技术是零知识证明,特别是最近发展起来的“简洁的知识论证”(SNARKs)。零知识证明允许用户构造一个数学证明,证明给定的程序在对用户已知的某些(可能隐藏的)输入执行时具有特定的(公共已知的)输出,而不显示任何其他信息。有许多专门类型的零知识证明,很容易实现;例如,可以将数字签名视为一种零知识证明,表明您知道私钥的值,在使用标准算法处理私钥时,可以将其转换为特定的公钥。另一方面,ZK-SNARKs允许您对任何函数进行这样的证明。
首先,我们来看一些具体的例子。该技术的一个自然用例是在身份系统中。例如,假设你想要向一个系统证明你是(i)一个特定国家的公民,(ii)超过19岁。假设您的政府在技术上是先进的,并且发行了加密签名的数字护照,其中包括一个人的姓名和出生日期,以及私钥和公钥。你会构造一个函数需要一个数字的护照和护照的签名私钥签署的作为输入,输出1如果(i)出生日期是在1996年之前,(ii)护照与政府签署的公钥,和(iii)签名是正确的,否则输出0。然后进行零知识证明,表明输入在通过此函数时返回1,并使用另一个私钥对证明进行签名,该私钥将用于将来与此服务的交互。服务将验证验证,如果验证正确,它将接受用您的私钥签名的消息为有效。
你也可以使用同样的机制来验证更复杂的说法,如“我是这个国家的公民,和我的身份证号码不是在这组已经使用得ID号码中”,或“我从一些商人那里买至少价值10000美元的产品后,我获得了有利的评论”,或“我持有资产价值至少250000美元”。
该技术的另一类用例是数字令牌所有权。为了拥有一个有效的数字令牌系统,你不需要严格地拥有可见的账户和余额;事实上,你所需要的只是一种解决“双倍花费”问题的方法——如果你有100单位资产,你应该能够一次性花掉这100单位,而不是两次。有了零知识证明,我们当然可以做到;所谓的“零知识证明”类似于“我知道在已经创建的这组帐户中的一个帐户后面有一个秘密数字,它与已经暴露的任何一个秘密数字都不匹配”。此方案中的帐户只使用一次:每次发送资产时都创建一个“帐户”,并且发送方帐户将被完全使用。如果您不希望完全使用一个给定的帐户,那么您必须简单地创建两个帐户,一个由接收方控制,另一个由发送方自己控制其余的“更改”。这本质上就是Zcash所使用的方案。
对于两方智能合约(例如:考虑一些类似于双方协商的金融衍生品合同的东西),零知识证明的应用是相当容易理解的。当合同第一次谈判,不是创建一个智能合约包含实际的公式,其中的资金最终将被释放(例如。在二进制选项中,公式是“如果某个数据源释放的索引I大于X,则将所有内容发送给a,否则将所有内容发送给B”),创建一个包含公式散列的合约。当合同即将结束时,任何一方都可以自己计算A和B应该收到的金额,并提供结果和零知识证明,即具有正确散列的公式可以提供该结果。区块链计算出A和B各投入了多少,得到了多少,但不知道为什么投入或得到这么多。
这个模型可以推广到n方智能合约,而Hawk项目正试图做到这一点。
从另一端开始:低技术方法
当尝试在区块链上增加隐私时,可以采用的另一种方法是从技术非常低的方法开始,除了简单的哈希、加密和公钥加密之外,不使用任何加密。这是比特币在2009年开始的道路;尽管它在实践中提供的隐私程度很难量化和限制,但它仍然明显地提供了一些价值。
比特币在某种程度上增加隐私的最简单的步骤是使用一次性账户,类似于Zcash,来存储资金。就像Zcash,每笔交易必须完全空的一个或多个账户,并创建一个或多个新的账户,建议为用户生成一个新的私钥对每一个新的帐户,他们打算接收资金(尽管也可能有多个账户有相同的私钥)。这样做的主要好处是,用户的资金在默认情况下没有相互关联:如果您从源a收到50个币,从源B收到50个币,其他用户无法判断这些资金是否属于同一个人。此外,如果你花13个硬币到别人的账户C, 从而创建第四个帐户D,你发送剩下的37个币从其中一个账户作为“余额修改”,其他用户甚至不能分辨这两个输出事务是“付款”还是“修改余额”。
然而,有一个问题。如果在将来的某个时候,您同时使用两个帐户进行一个事务处理,那么您将不可逆转地“链接”这些帐户,从而向全世界清楚地表明它们来自一个用户。更重要的是,这些联系传递:在任何时候,如果你联系在一起的A和B,然后在其他点A和C链接在一起,等等,那么你已经创建了大量的证据,统计分析可以连接你的整个的资产。
比特币开发者麦克·赫恩(Mike Hearn)提出了一种降低风险的策略,称为“合并规避”(merge avoidance):本质上,这是一个很炫的术语,指的是非常非常努力地将账户连接在一起的次数降到最低,同时从账户中支出。这当然是有帮助的,但即便如此,比特币系统内部的隐私已被证明具有高度的渗透性和启发性,甚至没有任何接近高担保的东西。
一种更高级的技术叫做CoinJoin。本质上,CoinJoin协议的工作原理如下:
- N个参与方通过某种匿名渠道走到一起。例如Tor。它们各自提供一个目标地址D[1]…D [N]。
- 一方创建一个事务,该事务向每个目标地址发送一个币。
- N个参与者退出,然后分别登录到该通道,每个人向该账户贡献一枚币,资金将从该账户中支付。
- 如果N个币支付到账户,它们被分配到目的地地址,否则它们被退还。
如果所有参与者都诚实并提供一枚币,那么每个人都将投入一枚币并取出一枚币,但是没有人知道哪个输入对应哪个输出。如果至少有一个参与者没有投入一枚币,那么这个过程就会失败,币会被退回,所有的参与者都可以再试一次。阿米尔·塔奇(Amir Taaki)和巴博罗·马丁(Pablo Martin)为比特币实现了类似的算法,加文·伍德(Gavin Wood)和弗拉德·格鲁霍夫斯基(Vlad Gluhovsky)为以太坊实现了类似的算法。
到目前为止,我们只讨论了令牌匿名化。那么两方智能合约呢?在这里,我们使用与Hawk相同的机制,只不过我们用更简单的加密经济学(即“可审计计算”技巧)替换了密码学。参与者将他们的资金发送到一个存储代码散列的合约中。当需要发送资金时,任何一方都可以提交结果。另一方可以发送交易以达成交易结果,允许资金被发送,也可以将实际代码发布到合约中,此时代码将正确运行并分配资金。保证金可以用来激励当事人诚实参与。因此,系统在默认情况下是私有的,并且只有当存在争议时,才会将任何信息泄露给外部世界。
这种技术的一个泛化称为状态通道,除了在隐私方面的改进外,还有可伸缩性方面的好处。
环签名
环签名是一种技术,它在技术上比较复杂,但在令牌匿名化和身份应用方面都非常有前途。环签名本质上是一种签名,它证明签名者有一个私钥,该私钥对应于一组特定的公钥中的一个,而不需要透露是哪一个。两句话解释数学上这是如何工作的,它是一个环签名算法包含一个数学函数算通常可以仅使用一个公钥进行计算,但知道私钥允许您添加一个种子到输入,来输出任何你想要的特定值。签名本身由一系列值组成,其中每个值都被设置为应用于前一个值的函数(加上一些种子);生成有效的签名需要使用私钥的知识来“关闭循环”,强制计算的最后一个值等于第一个值。给出一个有效的“环”以这种方式生产的,任何人都可以确认它确实是一个“圈”,所以每个值等于前一个值的函数计算+给定的种子,但是没有办法分辨“链接”在环中使用的哪个私钥。
还有一种升级版的环签名,称为可链接环签名,它增加了一个额外的属性:如果您使用相同的私钥签名两次,就可以检测到这个事实——但是不会泄露其他信息。在令牌匿名化的情况下,应用程序是相当简单的:当用户想花一枚币,而不是让他们提供常规的签名来直接证明公钥所有权,我们一起把公共密钥分成组,要求用户简单地证明加入该组织。由于可链接性属性,在组中拥有一个公钥的用户只能从该组中使用一次;不一致的签名被拒绝。
环签名也可以用于投票应用:我们使用环签名来验证一套币的花费,而不是使用环签名来验证投票。它们还可以用于身份应用程序:如果您想证明自己属于一组授权用户,而不需要透露是哪一个用户,那么环签名就非常适合这个用途。环签名在数学上比简单签名更复杂,但实现起来很实用;在Ethereum上可以找到一些环签名的示例代码。
秘密共享和加密
有时,区块链应用程序并不尝试协调数字资产的传输、记录身份信息或处理智能合约,而是用于更以数据为中心的应用程序:时间戳、高值数据存储、存在的证明(或不存在的证明,如证书撤销的情况),等等。一个常见的想法是使用区块链构建“用户可以控制自己的数据”的系统。
在这些情况下,需要再次强调的是,区块链并不能解决隐私问题,只是一种真实性解决方案。因此,将明文医疗记录放在区块链上是一个非常糟糕的主意。然而,它们可以与其他提供隐私的技术相结合,从而为许多行业创造一个实现预期目标的整体解决方案,区块链是一个与供应商无关的平台,在这里可以存储一些数据,以提供真实性保证。
那么这些保护隐私的技术是什么呢? 在简单数据存储的情况下(例如医疗记录),我们可以使用其中最简单和最古老的一种:加密!在区块链上散列的文档可以首先进行加密,因此即使数据存储在IPFS之类的地方上,也只有拥有自己私钥的用户才能看到这些文档。如果用户希望授予其他人以解密形式查看某些特定记录的权利,但不是所有记录,那么可以使用类似于确定性钱包的方案来为每个文档派生不同的密钥。
另一种有用的技术是秘密共享,允许用户加密一段数据的方式是给定N个用户的M(例如,N个用户的M)。M = 5, N = 9)可以合作解密数据,但不能少。
隐私的未来
在区块链中,隐私保护协议面临两大挑战。挑战之一是统计方面的:为了使任何隐私保护方案在计算上切实可行,该方案必须在每个事务中只更改区块链状态的一小部分。然而,即使更改的内容是隐私的,也不可避免地会有一些非隐私的元数据。因此,统计分析总是能够找出一些东西;至少,他们将能够捕捉交易发生时的模式,并且在许多情况下,他们将能够缩小身份范围并找出谁与谁交互。
第二个挑战是开发者体验挑战。图灵完备的区块链对开发人员是友好的,因为他们非常友好给开发者而可以完全不懂的底层分布式的机制:他们创建一个分布式的“世界计算机”,看起来就像一个集中的电脑,实际上说“看,开发人员,你可以编写你的代码了,除了这个新的底层现在将为你做一切神奇地分布式”。当然,抽象并不完美:高交易费、高延迟、gas和块重组是程序员需要面对的新问题,但障碍并不大。
在隐私方面,正如我们所看到的,没有这样的灵丹妙药。虽然有针对特定用例的部分解决方案,而且这些部分解决方案通常提供高度的灵活性,但是它们所提供的抽象与开发人员所习惯的抽象有很大的不同。从“10行python脚本中包含一些代码,用于从发送方的余额中减去X个硬币并将X个硬币添加到接收方的余额中”,到“使用可链接环签名的高度匿名数字令牌”,这并不是一件小事。
如Hawk一类的项目是非常受欢迎的,它们有着正确的方向:他们提供的承诺将任意N方协议转换成零知识证明协议只信任真实性的区块链,一个特定方的隐私:本质上,结合两全其美的集中和分布式的方法。我们能不能更进一步,创建一个协议,信任零方的隐私?这仍然是一个积极的研究方向,我们只能等待,看看我们能走多远。