区块链上的隐私
区块链中的隐私保护协议有两大挑战:其中一个挑战是统计学上的,第二个挑战是开发者体验挑战。
很多人对比特币及区块链有误解,认为比特币解决了隐私的问题,但其实不然,比特币是公开透明的账本。V神清晰地梳理了目前区块链隐私的几种解决方案,未来还有很远的路要走。
很多人都认同区块链是一种强大的技术。它们允许大量的交互被编码和实施,提高了可靠性,消除了与中心实体管理的进程有关的商业和政治风险,并减少了对信任的需要。
它们创建了一个平台,来自不同公司甚至不同类型的应用程序都可以一起运行,允许极其高效且无缝的交互,并留下审计跟踪,任何人都可以检查,以确保所有的处理都是正确的。
然而,当我和其他公司谈论如何在区块链上构建应用程序时,总是会出现两个主要问题:可扩展性和隐私。
可扩展性是一个严重的问题。当前的区块链每秒处理3-20个交易,与运行主流支付系统或金融市场所需的处理能力相差几个数量级,更不用说去中心化论坛或物联网的全球小额支付平台了。幸运的是,是有解决方法的,正在积极地致力于实施路线图计划。
区块链的另一个主要问题是隐私。尽管区块链的其他优势是诱人的,但无论是公司还是个人,都不热衷于将所有信息发布到公共数据库中,这些数据库可以不受限制地被自己的政府、外国政府、家人、同事和商业竞争对手随意阅读。
与扩展性不同的是,隐私的解决方案在某些情况下更容易实现(尽管在其他情况下要难得多),其中许多方案与当前存在的区块链兼容,但它们也不太令人满意。
要创建一种“圣杯”技术要难得多,它允许用户在区块链上完成他们现在可以做的一切,但同时也拥有隐私;相反,开发人员在许多情况下将不得不面对部分解决方案、启发法和机制,这些解决方案和机制旨在将隐私带到特定的应用程序中。
圣杯
首先,让我们从“圣杯”技术开始,因为它们实际上提供了承诺,可以将任意应用程序转换为完全保护隐私的应用程序,允许用户从区块链的安全性中受益,使用分布式的网络处理事务,对数据进行“加密”,虽然所有的事情都是公开可见,但信息的底层“含义”完全被混淆。
当然,把握方向的最强大的技术是密码安全混淆。一般来说,混淆是将任何程序转化为程序等效的“黑匣子”的一种方式,即程序仍然具有相同的“内部逻辑”,并且仍然为相同的输入提供相同的输出,但不可能确定这个程序内部运作的细节。
(把它想成是“加密”盒子内部的电线,使加密可以自行抵消,对输出最终没有影响,但是它确实会使你完全不可能看到里面发生了什么。)
不幸的是,绝对完美的黑匣混淆在数学上已知是不可能; 事实证明,总是有一些蛛丝马迹可以从程序中提取出来,通过提供输出和特定的输入集即可实现。
然而,我们可以满足的是一个较低的标准:不可区别性的混淆。从本质上说,给定使用该算法混淆的两个等效程序(例如。X=(a+b)*c和X=(a*c)+(b*c)),无法确定哪个输出来自于哪个原始源。
要了解这对于我们的应用程序来说是仍然足够强大的,请考虑以下两个程序:
- y=0
- y=sign (privkey,0) -sign(privkey,0)
一个只返回零,另一个使用内部包含的私钥对消息进行加密签名,下一次执行相同的操作,从彼此减去(明显相同的)结果,并返回结果,该结果保证为零。
即使一个程序只返回零,而另一个程序返回包含并使用加密私钥,如果不可区分性可以满足,那么,两个混淆的程序不可能区分开。
因此拥有混淆程序的人肯定无法提取私钥,否则,这将是区分这两个程序的一种方法。这是一个相当强大的混淆–大约两年来,我们已经知道如何做到这一点!
那么,我们该如何在区块链上使用这一点呢?这里有一个简单的数字代币方法。我们创建一个包含私钥的混淆智能合约,并接受使用相应公钥加密的指令。
合约将帐户余额加密存储,如果合约想读取存储,则在内部对其进行解密,如果合约想写入存储,则在写入之前对所需结果进行加密。
如果有人想读取帐户的余额,那么他们会将请求作为交易进行编码,并在自己的机器上模拟它;混淆处理的智能合约代码将检查交易的签名,以查看该用户是否有权读取余额,如果他们有权读取余额,则返回解密的余额;否则,代码将返回错误,用户将无法提取信息。
然而,与其他几种此类技术一样,也有一个问题:这种混淆的机制效率极低。十亿美元的开销是正常的,甚至还是不够的;近期论文估计“在同一个cpu上执行[2位乘法]电路需要1.3 * 108多年。
此外,如要防止读写存储成为数据泄漏向量,还必须设置合约,以便读写操作总是修改合同整个状态的很大一部分,这也是很大的一个开销。
最重要的是,当您在区块链上运行代码时,要有数百个节点运行代码,这可以很快就看到技术是如何运行的。不幸的是,这种技术不会很快改变任何事情。
退一步说
然而,虽然对安全模型有重要的妥协,但是有两个分支技术可以让你几乎可以实现混淆效果。第一个是安全多方计算。安全多方计算允许程序(及其状态)在N个当事方之间被分割,这样你就需要其中的M(例如,N=9,M=5)进行协作,以便完成计算,或者显示程序或状态中的任何内部数据。
因此,如果你可以相信大多数参与者是诚实的,那么该方案就像混淆一样好。如果你不能,那么它就毫无价值了。
安全多方计算背后的数学是复杂的,但比混淆要简单得多。 SMPC 也比混淆更有效率,这一点你可以用它进行实际计算,但效率依然很低。加法运算可以处理得相当快,但是每当SMPC实例执行一些非常小的固定数目的乘法运算时,它需要执行一个“降阶”步骤,涉及从每个节点发送消息到网络中的每个节点。
最近的工作将通信开销从二次降低到线性,但即使是每一次乘法操作也会带来某种不可避免的网络延迟。
要求信任对参与者也是一项艰巨的任务;请注意,与许多其他应用程序一样,参与者有能力保存数据,然后未来任何时间点都可以串通。此外,不可能知道他们已经做了这一点,因此不可能激励参与者维护系统的隐私。
因此,与公共链相比,安全的多方计算可能更适合于私有区块链,在这种情况下,激励机制可能来自协议之外。
另一种具有很强特性的技术是零知识证明,特别是SNARKs的最新发展。零知识证明允许用户构建一个数学证明,当给定程序在用户已知的一些(可能是隐藏的)输入上执行时,具有特定的(公开的)输出,同时还不透露任何其他信息。
有很多专门的零知识证明的类型是相当容易实现的;例如,您可以将数字签名看作一种零知识证明。你知道私钥的值,当使用标准算法处理时,私钥可以转换为特定的公钥。ZK-SNARKs允许你为任何功能作出这样的证明。
首先,让我们通过一些案例来说明。该技术的一个自然用例是身份系统。例如,假设你想向系统证明你是(i)某个国家的公民,并且(ii)超过19岁。
假设你的政府在技术上是进步的,并发行加密签名的数字护照,其中包括个人的姓名和出生日期以及私人和公共密钥。你需要构建一个功能,将护照中的私钥签名的数字护照和签名作为输入,如果(i)出生日期在1996年以前,(ii)护照与政府签署公钥,(iii)签名是正确的,否则输出0。
然后,您会做出一个零知识证明,表明您有一个输入,当通过此函数传递时,返回1,并用另一个你希望用于未来与此服务交互的私钥签名证明。该服务将验证证明,如果证明是正确的,它将接受你的私钥签名的消息为有效。
你也可以用同样的方案来验证更复杂的说法,比如“我是这个国家的公民,我的身份证号码不在这套已经被使用过的身份证号码中”,或者“我在从他们那里购买了价值至少10000美元的产品后得到了一些商家的好评”,或者“我持有价值至少250000美元的资产”。
该技术的另一类应用是数字Token所有权。为了建立一个有效的数字Token系统,你不需要严格地有可见的帐户和余额;事实上,你所需要的只是解决“双重支付”问题的方法–如果你有100个单位的资产,你应该能够花这100个单元,但不是两次。
有了零知识证明,我们当然可以做到这一点;声称你将为零知识证明的说法就像是“我知道在这组账户中的一个账户背后的一个秘密号码,而且它与任何已经披露的秘密号码都不匹配”。
此方案中的帐户成为一次性使用:每次发送资产时都创建一个“帐户”,并且发件人帐户被完全消耗。
如果你不想完全消耗一个给定的帐户,那么你必须创建两个帐户,一个由接收人控制,另一个由发送人自己控制其余的“更改”。这实际上是ZCash的方案。
对于涉及双方的智能合约(例如,想一想像金融衍生合同在双方之间谈判),零知识证明的应用相当容易理解。当第一次协商合同时,不是创建一个包含实际公式的智能合约,该公式将最终释放资金 (例如,在二进制选项中,公式是“如果某个数据源释放的索引I大于X,将所有发送到A,否则将所有发送到B”),而是创建一个包含公式的哈希。
当合约终止时,任何一方都可以自己计算出A和B应该得到的金额,并将结果和零知识证明一起提供,也就是有正确哈希的公式提供该结果。区块链可以查出A和B各投入了多少,以及它们得到了多少,但不知道它们为什么投入或得到这个数额。
该该模型可以应用到N方智能合约,Hawk项目正试图做到这一点。
从另一端开始:低技术方法
当试图在区块链上增加隐私时,另一条途径是从非常低技术的方法开始,除了简单的哈希、加密和公钥加密之外,不使用密码。这是比特币从2009开始的道路;尽管它在实践中提供的隐私水平很难量化和限制,但它仍然明显地提供了一些价值。
比特币为增加隐私,最简单的一步是,它使用一次性账户(类似zcash)来存储资金。就像zcash一样,每一笔交易都必须全部清空一个或多个帐户,并创建一个或多个新帐户,建议用户为他们打算接收资金的每个新帐户生成一个新的私钥(尽管有可能拥有具有相同私钥的多个帐户)。
这带来的主要好处是,用户的资金在默认情况下并不是相互关联的:如果你从源头A收到50个coin,从来源头B收到50个coin,其他用户就无法知道这些资金属于同一个人。
此外,如果你将13个coin发送到其他人的帐户C上,从而创建了第四个帐户D,你将其中一个帐户中的剩余37个coin作为“余钱”发送,其他用户甚至无法分辨交易的两个输出中的哪个是“支付”,哪个是“余钱”。
但是,有一个问题。 如果在将来的任何时刻,你同时从两个账户进行交易,那么你将不可撤销地“链接”这些账户,从而让大家很容易发现它们属于同一个用户。
而且,这些联系是传递性的:如果在任何时候,你将A和B连接在一起,然后在任何其他时间把A和C连接在一起,那么你已经创造了大量的证据 ,统计分析可以将你的所有资产联系起来。
比特币开发人员Mike Hearn提出了一种缓解策略,该策略降低了发生这种情况的可能性,称为“合并避免”:本质上,最大限度地减少通过在同一时间花费账户链接在一起的次数。
这绝对有帮助,但即使如此,比特币系统内部的隐私已被证明是高度多孔的和启发式的,距离高质量的隐私保证有点远。
一种更先进的技术叫做CoinJoin。 基本上,CoinJoin协议的工作原理如下:
- N方聚集在一些匿名频道上,例如,Tor。它们各自提供目的地址D [1] … D [N]。
- 其中一方创建一笔交易,向每个目的地地址发送1个coin。
- N方注销,然后分别登录到该频道,并且每人向该支出账户提供1coin。
- 如果N 个coin被存入账户,它们被分配到目的地址,否则退还。
如果所有参与者都诚实地提供1个coin,那么每个人都会投入1个coin,并获得1个coin,但没有人会知道哪个输入映射到哪个输出。如果至少有一名参与者没有放入1个coin,则该过程将失败,1个coin将退还,所有参与者可以再次尝试。
Amir Taaki和Pablo Martin为比特币以及Gavin Wood和Vlad Gluhovsky为Ethereum实施了类似的算法。
到目前为止,我们只讨论了代币匿名化问题。关于两方智能合约呢?在这里,我们使用与Hawk相同的机制,但我们用更简单的密码经济学代替密码学–即“可审计计算”技巧。
参与者将资金发送到一个存储代码哈希的合约中。当涉及发送资金时,任何一方都可以提交结果。另一方可以发送交易来同意结果,允许资金被发送出去,或者可以将实际代码发布到合同中,届时代码将正确运行和分配。
安全保证金可以用来激励各方诚实参与。因此,系统是私人的,只有在有争议时,才能将任何信息泄露到外部世界。
这种技术抽象化后被称为状态通道,并且在保护隐私方面也有可扩展性。
环签名
一种在技术上复杂度适中,但对于代币匿名化和身份识别应用而言非常有前途的是环签名。环签名本质上是一个签名,证明签名者具有与特定公钥之一相对应的私钥,但不透露哪一个。
关于这种数学运算的简单解释是,环签名算法包括一个数学函数,该函数可以通过公钥正常计算,但在知道私钥的情况下,你可以将种子添加到输入以生成输出,输出各种随心想要的值。
签名本身包含一个值列表,其中每个值都被设置为应用于前一个值的函数(加上一些种子);生成一个有效的签名需要使用私钥的知识来“闭环”,迫使你计算的最后一个值等于第一个值。
如果以这种方式生成有效的“环”,任何人都可以验证它确实是一个“环”,因此每个值都等于根据先前值加上给定种子计算的函数,但无法判断哪个环中的“链接”使用了一个私钥。
还有一个是环签名的升级版本,被称为可链接的环签名。它增加了一个额外的属性:如果您使用相同的私钥签名两次,则可以检测到这一事实 – 但不会显示其他信息。
在代币匿名的情况下,应用程序非常简单:当用户想要花钱时,不是让他们提供常规签名来直接证明其公钥的所有权,我们将公钥合并为一组,然后用户只需简单地证明该组的成员身份。
由于可链接性属性,在组中具有一个公钥的用户只能从该组中花费一次; 相冲突的签名会被拒绝。
环签名也可以用于投票应用程序:我们使用它们来验证投票,而不是使用环签名来验证一组代币的支出。
环签名也可以用于身份识别程序:如果你想证明你属于一组授权用户,而不透露哪一位,则环形签名非常适合这种情况。与简单签名相比,环签名在数学上涉及更多,但它们实现起来相当实用。
秘密共享和加密
有时,区块链应用并不只是解决数字资产的传输,或者只是记录身份信息或处理智能合约,而是将其用于更多以数据为中心的应用:时间戳、高价值数据存储、存在证明(或如证书撤销的情况下,证明不存在证据等)。一种常见的副作用是使用区块链构建“用户控制自己的数据”的系统的想法。
在这些情况下,有必要再次注意到区块链不能解决隐私问题,它只是真实性的解决方案。因此,将医疗记录以明文形式放入区块链中是一个非常糟糕的想法。
但是,它们可以与其他提供隐私的技术结合起来使用,以便为许多行业创建完整的解决方案,以实现预期的目标。区块链是供应商中立的平台,可以存储一些数据以提供真实性保证。
那么隐私保护技术是什么?对于简单的数据存储(例如医疗记录),我们就可以使用最简单,最古老的一种:加密!在区块链上哈希后的文档可以先被加密,所以即使数据存储在像IPFS上,只有拥有私钥的用户才能查看文档。
如果用户想授予其他人以解密形式查看某些特定记录的权利,但不是全部,则可以使用类似确定性钱包的东西来为每个文档派生不同的密钥。
另一个有用的技术是秘密共享,允许用户以给定的N个用户(例如,M =5,N = 9)的M个可以协作来解密数据。
隐私的未来
区块链中的隐私保护协议有两大挑战:
其中一个挑战是统计学上的:为了使任何隐私保留方案在计算上实用,该方案只能在每次交易时改变区块链状态的一小部分。但是,即使变更的内容是隐私,也不可避免地存在一些元数据。
因此,统计分析总是能够分析出之间的联系;至少,他们将能够捕捉交易何时发生的模式,并且在很多情况下,他们将能够缩小身份并找出谁与谁交互。
第二个挑战是开发者体验挑战。图灵完备的区块链对开发人员来说效果很好,对去中心化的底层机制完全不了解的开发人员来说,它们非常友好:它们创建了一个分布式的“世界计算机”,它们看起来就像一台中心化的计算机。
实际上,“看,开发者们,你可以编写任何想编写的代码,只不过是在这个底层上有一个新层,在上面开发出让各种去中心化应用。 ”
当然,抽象并不完美:交易费用高,高延迟,gas和区块重组对于程序员来说是新事物,但是障碍并不是那么大。
就隐私而言,正如我们所看到的,没有什么魔力子弹。尽管有针对特定用例的部分解决方案,并且通常这些部分解决方案提供了高度的灵活性,但它们提供的抽象与开发人员习惯的抽象很不相同。
从“10行python脚本中删除发送人余额中的Xcoin并将Xcoin添加到接收人的余额”改为“使用可链接的环签名进行高度匿名化数字代币”,这并不是那么简单。
像Hawk这样的项目走出非常值得欢迎的一步:它们提供了将任意N方协议转换为零知识协议的承诺,只相信区块链的真实性,以及一个隐私特定方:本质上,结合中心化和去中心化两种方式的最佳选择。
我们能否进一步发展,创建出一个无需信任任何一方的隐私协议?这仍只是一个积极的研究方向,我们只能等待,看看我们会走多远。
风险警示:蓝狐所有文章都不构成投资推荐,投资有风险,建议对项目进行深入考察,慎重做好自己的投资决策。
原文作者:Vitalik Buterin
原文地址:blog.ethereum.org
译者:由蓝狐笔记社群“Carlo”等人翻译
本文由 @蓝狐笔记社群“Carlo”等人 翻译发布于人人都是产品经理。未经许可,禁止转载。
题图来自 Unsplash,基于 CC0 协议
你以为你这样解释我就看的懂了吗?太小看我了