我很高兴地宣布在比特币网络上首次成功实现了零知识合约支付 (ZKCP)。
ZKCP 是一种交易协议,允许买方以私密、可扩展、安全的方式使用比特币从卖方购买信息,并且不需要信任任何一方:预期信息只有在付款完成时才会被转移。买方和卖方无需彼此信任或依赖第三方仲裁。
想象一下电影中“公文包交换”的场景(一方拿着装满现金的公文包,另一方装着秘密文件),但没有其中一个公文包装满碎纸的可能性,以及随之而来的刺激的追逐场景。
一个应用示例是,特定品牌的电子书阅读器所有者合作从一个即将倒闭的制造商那里购买 DRM 主密钥,以便在供应商的服务器下线后,他们可以在自己的阅读器上加载自己的文件。这种类型的销售本质上是不可逆的,可能会跨越多个司法管辖区,而且涉及到财务状况不确定的各方,这意味着双方要么承担很大的风险,要么不得不做出艰难的安排。使用 ZKCP 可以避免在可能出错的销售中涉及的巨大交易成本。
在今天的交易中,我从 Zcash 团队成员 Sean Bowe 那里以 0.10 BTC 的价格购买了 16x16 数独谜题的解决方案,作为在巴巴多斯举行的 2016 年金融密码学大会 上现场演示的一部分。我从加利福尼亚州远程参与了这次交易。
此次转账涉及两笔交易
- 8e5df5f792ac4e98cca87f10aba7947337684a5a0a7333ab897fb9c9d616ba9e
- 200554139d1e3fe6e499f6ffb0b6e01e706eb8c897293a7f6a26d25e39623fae
几乎所有与 ZKCP 实现相关的工程工作都是由 Sean Bowe 完成的,并得到了 Pieter Wuille、我和 Madars Virza 的支持。
查看来自 现场演示 的幻灯片。
背景
我最初在 2011 年的一篇 比特币维基上的文章 中提出了 ZKCP 协议,作为比特币脚本中现有原语具有巨大潜力的一个例子。
零知识证明
我的 ZKCP 协议需要一个针对任意程序的零知识证明作为构建块。许多类型的专用零知识证明存在:常见的数字签名就是一个例子, 保密交易 中的范围证明也是一个例子。
针对通用计算的零知识证明是一种密码系统,它允许一个人运行一个包含公共和秘密输入的任意程序,并向其他人证明该特定程序接受了输入,而无需透露有关其操作或秘密输入的任何其他信息。
如果这看起来像不可能的魔法,为了教学目的,我提出了一个 非常简单但效率低下的 ZKP 系统,它只使用布尔电路和密码哈希,或者参见 Matthew Green 的 图着色 ZKP 示例。
正如我在 ZKCP 的最初文章中指出的,在 2011 年没有这样的系统可用,但人们相信它们是可能的,特别是在针对 ZKCP 的特定约束条件下。
2012 年,Gennaro、Gentry、Parno 和 Raykova 发表了一篇名为“二次跨度程序和无需 PCP 的简洁 NIZK”的论文,其中描述了一种特别高效的构造方法。从那时起,几个小组一直在不断推进这项工作,创建编译器、性能改进,以及最重要的是,像 libsnark 这样的实用工具。GGPR’12 密码系统需要一个可信的设置,但在 ZKCP 应用中,这并不是真正的限制,因为买方可以执行它。由于这项工作,ZKCP 现在可以成为一个实用的工具。
进一步阅读
由于这些高效的 ZKP 是依赖于新的强密码学假设的尖端技术,因此它们的安全性尚未确定。但在像 ZKCP 这样的应用中,我们唯一的替代方案是第三方信任,它们可以以严格优于没有它们的情况下所能做到的方式使用。
ZKCP 的工作原理
如果你接受零知识证明系统作为黑盒的存在,那么 ZKCP 协议的其余部分就相当简单了。
买方首先创建一个程序,该程序可以判断给定的输入是否是买方想要购买的数据。该程序只验证信息,它不生成信息 - 买方甚至不需要知道如何生成信息。(例如,编写一个程序来验证数独解的正确性很容易,但编写数独解算器就比较困难,数独是 NP 完全问题。这里买方只需要编写解决方案验证器。)
买方执行证明系统的可信设置,并将生成的设置信息发送给卖方。
卖方选择一个随机加密密钥,并对买方想要购买的信息进行加密。
使用 ZKP 系统,卖方证明一个复合语句
- Ex 是满足买方程序的输入的加密。
- Y 是 Ex 解密密钥的 sha256 哈希值。
卖方将 Ex、Y、证明及其公钥发送给买方。一旦买方的计算机验证了证明,买方就知道,如果他了解了产生哈希值 Y 的 SHA256 输入,他就可以解密他的答案。
因此买方最初想要购买他程序的输入,但现在他同样乐意购买哈希值的原像。事实证明,比特币已经提供了一种安全地出售哈希原像的方法。
买方向以下 ScriptPubkey 支付款项
OP_SHA256
<Y> OP_EQUAL
OP_IF
<Seller Pubkey>
OP_ELSE
<block_height+100> OP_CHECKLOCKTIMEVERIFY OP_DROP
<Buyer Pubkey>
OP_ENDIF
OP_CHECKSIG
这种支付的效果是,如果卖方提供了 Y 的哈希原像和用他的密钥签名的签名,他就可以收取这笔款项。为了避免买方的资金永远被冻结,如果卖方在(例如)一天内没有收取款项,买方可以取回款项。
因此,当卖方收取款项时,他被迫透露买方解密答案所需的信息。如果他没有这样做,买方会取回他的资金。
这个 ScriptPubkey 与用于跨链原子交换或闪电支付通道的 ScriptPubkey 相同。
比特币核心中已经实现了对这些交易的钱包支持,位于 PR#7601。这种钱包支持被可用的数独 ZKCP 客户端和服务器使用,位于 https://github.com/zcash/pay-to-sudoku。
买方的程序可以任意长和复杂,而不会给比特币的区块链增加任何额外的负担 - 唯一的影响是设置和证明所需时间的增加,这些操作都在比特币之外完成。除了买方或卖方之外,没有人会了解买方的程序(也就是说,他们不会了解正在销售的信息的性质)。
限制和替代方案
这种方法比在区块链内进行智能合约更具可扩展性和私密性,并且它不会受到比特币智能合约的任何性能或功能限制的影响。
这种方法有两个主要限制。第一,它是交互式的:买方不能简单地发出一个广播报价,并让任何感兴趣的卖方在没有来回沟通的情况下接受付款。第二,ZKP 系统虽然速度足够快,可以用于实际应用,但仍然不够快。例如,在我们的演示中,ZKP 系统证明了 SHA256 和数独约束的 5 次执行,并在笔记本电脑上执行大约需要 20 秒。(验证证明只需要几毫秒。)
ZKCP 的一种替代方案是 Peter Todd 在 2014 年提出的 “paypub” 协议。在 Paypub 中,买方不是使用零知识证明,而是会看到他们试图购买的数据的一个随机子集,当卖方收取款项时,他们被迫解锁其余的数据。Paypub 避免了处理零知识证明的复杂性 - 以及允许交换只有人类可以验证的信息 - 但以牺牲一些欺骗漏洞为代价,并且只能用于一个相对庞大的随机可验证信息集。
总的来说,我认为像这样的“无信任”智能合约在以下情况下最有价值:要么是频繁的低价值自动化交易 - 使得传统冲突解决方法的开销剥夺了参与者获得有意义的司法救济的权利 - 或者是在价值非常高的交易中,传统冲突解决方法的速度、不可靠性(尤其是在跨司法管辖区的情况下)或隐私缺失将是不可接受的。
随着这项技术的日益实用,我期待着人们为它们找到令人兴奋的应用。
Gregory Maxwell