Gregory Maxwell:首个成功运行的零知识条件支付(ZKCP)
时间:2016-02-29 来源:巴比特 作者:洒脱喜
我很高兴地宣布,比特币网络上已成功运行了首个零知识条件支付(ZKCP)。 零知识条件支付是一种交易协议,它允许买方使用比特币从卖方那购买信息,并且其方式是私密、可扩展和安全的,并且也无需信任任何人:所传达的信息仅仅是支付是否进行了, 买方与卖方之间并不需要彼此信任,也不需要由第三方来进行仲裁。 想象一下电影式的“公文包交换”(一方的公文包装满了现金,另一方则是了装了秘密文件),但不会出现其中一方用报纸进行欺诈,导致双方疯狂追逐的场景。 一个示例应用是 从一家失败的供应商那购买到电子书阅读器的DRM主密钥,因此当供应商的服务器上线时,他们就可以将自己的文件上传到阅读器。这种类型的销售本质上不可逆的,具有潜力跨越多个管辖区,参与方的金融稳定性也是不确定的,这意味着双方要么承担大量的风险,要么作出艰难的决定。而使用零知识条件支付协议,就可以避免显著的交易成本 。 在今天的一笔交易中,我从Sean Bowe那用0.1比特币购买了一个16×16的数独难题的解决方案(Sean Bowe是Zcash团队的一员),作为在巴巴多斯的2016年金融密码学会议的现场演示的一部分。我从加州远程演示了这笔交易。 转让涉及了两笔交易: 8e5df5f792ac4e98cca87f10aba7947337684a5a0a7333ab897fb9c9d616ba9e 200554139d1e3fe6e499f6ffb0b6e01e706eb8c897293a7f6a26d25e39623fae 这个零知识条件支付协议背后所有的实施工程工作,是由Sean Bowe,Pieter Wuille,我还有Madars Virza共同完成的。 请参阅现场演示的幻灯片 。 背景 我第一次提出ZKCP协议是在2011年,当时是在比特币维基上的一篇文章 ,以此作为一个例子来说明比特币脚本现有原语的强大性。 零知识证明 我的ZKCP协议需要为任意程序构建一个零知识证明 。 很多种专业的零知识证明存在着:普通的数字签名就是一个例子,机密交易(Confidential Transaction )也是。 用于通用计算的零知识证明是一种加密系统,它可以让一个人运行一个混合了公开与私密输入(input)的任意程序,并证明给他人表示这个特定的程序接受了这些输入,而不会透露任何有关它的操作或私密输入。 如果这看起来像是不可能的魔法,为了科普目的,我想到了一个非常简单,但效率不高的零知识证明系统,它无非是使用了布尔电路逻辑(boolean circuits) 以及密码学哈希,或见Matthew Green的关于零知识证明例子的图文解释 。 在2012年,Gennaro、Gentry, Parno和Raykova发表了一篇论文(“二次跨越程序和无需概率可验证明的简洁 NIZKs(非交互式零知识证明) ”),其描述了一个特别有效的结构。从那时起,有几个团队在持续推进这项工作,创造编译器并提升性能,以及最关键的,制造出了像libsnark这样的实用工具。该GGPR’12密码需要一个值得信赖的设置,但对于ZKCP应用而言,实际上也就没有真正的限制,因为买家可以执行它。正因为有了这个工作,ZKCP现在可以成为实用的工具。 进阶阅读: 因为这些高效的零知识证明是尖端技术,它们依赖于新强加密的假设,它们的安全性问题还没有被解决。 ZKCP是怎样工作的 如果你接受了零知识证明系统的存在就是一个黑盒子,那么ZKCP协议的其余部分就是相当简单的了。 买方首先会创建一个程序,它可以决定给定的输入是否就是买家想要购买的数据。这个程序仅会验证这个信息,它不会产生它(买家甚至也不需要有产生这些信息的想法),例如,写一个程序来验证数独解决方案是正确的,它是简单的,但是要写一个数独解算程序则是很难的,因为数独是NP完全难题。这里的买家只需要写出解决方案的验证程序就可以了。 买方执行用于证明系统的可信设置,并将所得设置信息发送给卖方。 卖方选取一个随机加密密钥,并对买家想要购买的信息进行加密。 使用了这个零知识证明系统之后,卖方会证明一个复合语句: Ex是一个输入的加密,它满足买方的程序。 Y是Ex的解密密钥的sha256哈希。 卖方向买方发送了Ex, Y,证明以及他的密钥。一旦买方的计算机验证了证明,买方会知道他是否掌握了Y的SHA256输入, 那他就可以解密出他要的答案。 所以买家最初想为他的程序购买一个输入,但是现在,他会因为购买到了哈希原像而感到高兴。这也证明,比特币已经提供了一种方式,能够将哈希原像以一种安全的方式进行出售。 买方通过下面这个ScriptPubkey来完成他的支付: OP_SHA256 OP_EQUAL OP_IF OP_ELSE
OP_ENDIF OP_CHECKSIG 这笔支付的效果,就是如果卖方提供了Y的哈希原像,并通过他的密钥进行了签名,那他就可以拿到这笔钱。为了避免永久性地占用买方的资金,如果卖方不能在一天内(例如)收集他的支付,则买方可以收回付款。 其结果是,当卖方收集了他的支付,他也就被迫揭示了买家解密答案所需要的信息。如果他没有,买方可以拿回他的资金。 这个ScriptPubkey同样适用于垮链原子交换(cross-chain atomic swap)或者闪电网络支付通道(lightning payment channel)。 Bitcoin Core钱包已在PR#7601 中支持了这些交易。这个钱包支持是通过数独ZKCP客户端和可用服务器来完成的 https://github.com/zcash/pay-to-sudoku. 买方的程序可以是任意长并且复杂的,它也不会对比特币的区块链带来额外的负担,唯一的影响就是设置和证明所需的时间会增加,这一切都是发生在比特币外部的。除了买方和卖方之外,没有人会得知买方的程序(也就是说,他们不会知道被售出信息的性质)。 限制与替代方案 这种方法的扩展性远比在区块链上构建智能合约要好,并且更加私密性,它也不会受到比特币智能合约性能和功能的限制影响。 这个方法的主要限制有两个。首先,它是互动的:在没有和卖方进行来回沟通之前,买方无法简单地制造一个广播报价就能让对方接受支付。 第二,该零知识证明系统,虽然应用起来的速度还算不错,但仍然是不够快的。例如,在我们的演示当中,这个零知识证明系统证明了SHA256和数独限制的5种执行,在笔记本上运行大约需要20秒的时间。(证明的验证时间只需要几毫秒)。 一种ZKCP的替代协议是Peter Todd在2014年提出来的“paypub ”协议。在paypub协议中,它并没有使用一个零知识证明,买方展示了他们想要去购买的数据的随机子集,当卖方收到付款时,他们会被强制解锁。Paypub避免了零知识证明交易的复杂性,也能允许信息的交易只有人可以进行验证,但在欺诈成本上它还是具有脆弱性,并且应用的场景比较有限。 总的来说,我认为像这样的“无需受信”的智能合约具有很大的价值,我期待着人们会发现它的令人兴奋的应用,并期待这项技术变得越来越实用。 |