我很高兴地宣布比特币网络已经成功进行了第一笔零知识支付(ZKCP)

ZKCP是一种交易类型,它允许购买者以隐私、可扩展、安全的方式从卖家那里使用比特币购买信息,而且无需信任任何人;而且只有在支付完成时,出售的信息才会发送给买家。买家和卖家无需互相信任,或者依赖任何第三方。

想象一下电影风格的”公文包交换”(其中一方用公文包装满现金,另外一方则提供机密文件),但是不会出现满是碎报纸和追打的场景。

其中的使用案例之一就是电子书拥有者从生产厂家购买DRM信息,在供应商的服务器离线后,他们能够加载他们自己的文档。这一类的销售本质上 是不可逆转的,可能会涉及到多个司法管理程序,涉及到多个经济状况不稳定的参与方- 这意味着所有参与方都会承担很大的风险或者很难达成共识。使用ZKCP就可以避免 很多不然会会出错的交易成本

在目前的交易中,我从Sean Bowe那里用0.1BTC购买了一个16×16大小数独问题的解决方案,Sean Bowe是Zcash项目的一员,Zcash项目在巴巴多斯举办的Financial Cryptography 2016(http://fc16.ifca.ai/)会议上也进行了发言。我从加利福尼亚远程执行了交易中我的需要做的部分。

这次交易涉及到两个交易:

ZCKP实施的工程工作基本都是由Sean Bowe完成的,同时还得到了Pieter Wuille,Madars Virza和我的帮助。

详情见幻灯片(https://z.cash/zkcp3.pdf)

背景

我第一次提议ZKCP协议是在2011年的比特币维基(https://en.bitcoin.it/wiki/Zero_Knowledge_Contingent_Payment)的文章中,作为说明比特币脚本原语是多么强大的例子。

零知识证明

我的ZKCP协议可以给任意程序的区块创建零知识证明。存在很多种专门的零知识证明: 常用的数字签名就是一种,以及秘密交易中的范围证明(https://people.xiph.org/~greg/confidential_values.txt)。

对于普通的计算来讲,零知识证明就是一个密码学系统,它允任何人运行任意程序,并且可以混合使用公开和私密输入,从而向其他人证明该特定程序接受这些输入,而且不会泄露操作过程或私密输入。

如果这看起来像不可能的魔法,为了说明我想出了一个非常简单只用了布尔逻辑和哈希加密但是足够有效的ZKP系统(https://people.xiph.org/~greg/simple_verifyable_execution.txt),或者可以查看Matthew Green的 图像版ZKP系统(http://blog.cryptographyengineering.com/2014/11/zero-knowledge-proofs-illustrated-primer.html)。

我最初为ZKCP写了说明,在2011年之前并没有现成的这样的系统,但这被认为是可能的,特别是在特定的约束能被ZKCP系统使用的情况下

在2012年,Gennaro,Gentry,Parno和Raykova发表了一篇文章“Quadratic Span Programs and Succinct NIZKs without PCPs”(https://eprint.iacr.org/2012/215)”),其中描述了一种特别有效的方法。从那时起,几个组继续推进了这项工作,创造编译器,性能提升,以及最关键的,各种实用的工具,比如libsnark。该GGPR’12加密系统需要受信任的设置,但是对于ZKCP来说没有实际的限制,因为买家可以执行它。由于这些工作,ZKCP现在可以成为一个可用的工具。

拓展阅读:

因为这些高效ZKPs尖端技术,依靠新的强密码的假说,它们的安全性暂时还没有定论。但应用zkcp,我们唯一的选择是第三方的信任,他们的作用也对我们是一种提升。

ZKCP的工作原理

如果你接受零知识证明系统作为一个黑盒,ZKCP剩余的协议非常简单。

买家首先创建一个程序,来决定是否给定的输入值就是买家想要购买的数据。这个程序只会验证信息,它不会生成信息-买家也无需知道如何生成它。比如,写一个验证数独解法是否正确的程序很容易,但是写一个解数独的程序很难,解数独是一个NP完全的问题。买家只需要写一个数独验证器。

买家在证明系统中扮演受信任的角色,并且负责给卖家发送所产生的设置信息。

卖家选择一个随机加密密钥然后加密买家希望买的信息

卖家利用ZKP系统证明一个复合语句:

  • Ex是一个输入的加密结果,它满足买家的程序。
  • Y是Ex的解密秘钥的SHA256哈希值。

卖家向买家发送Ex,Y,证明和他的公钥。一旦买家的电脑验证了这个证明,买家就知道了是否该输入值生成了哈希值Y。

因此买家初开始想要购买他的程序的输入值,但是现在他只需要购买哈希的像原。比特币已经提供了一种出售哈希像原的安全方式。

买家向下面的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同跨链原子交换或闪电支付使用的相同。

这种交易的钱包支持已经在Bitcoin Core中实现了(https://github.com/bitcoin/bitcoin/pull/7601)。这项钱包支持也在数独ZKCP客户端和服务端中使用,可在https://github.com/zcash/pay-to-sudoku获取

买方的程序可以是任意长而复杂的且不添加任何额外对区块链的负担——唯一的影响是设置和证明所需时间的增加,这一切发生在比特币之外。没有一个除买方或卖方以外的人知晓买方的程序(也就是,他们并不了解的被出售信息的本质)。

Limitations and alternatives

这种方法比区块链上进行智能合同更具可扩展性的和隐私性,它不被比特币的智能合约的任何性能或功能上的局限性所阻碍。

这种方法受到2个主要的限制。首先,它是可互动的:在没有交流的情况下,买方不能简单地广播一个报价,就会有一个有兴趣的卖家接受报价。其次,ZKP体系,虽然很实用,但并不是那么迅速。例如,在我们的岩石中,ZKP系统证明了5个SHA256的解和数独限制,并且在笔记本上只花了20秒(验证只需要几毫秒)。

一种替代ZKCP的方法是 Peter Todd’s2014 “paypub” protocol。 在Paypub,买家会展示一个他们想买东西的一个随机子集而不是零知识证明,而当卖家在收到钱之后,他们将不得不解锁剩下的部分。Paypub避免了去处理一些零知识证明的复杂性——只允许一些只能被人类证明的信息流通——但花费在一些可被欺骗的漏洞上时,只能使用一些比较大的、可验证的随机信息。

总的来说,我认为像这些“不可信”的智能合同有高频的自动交易,但却只有非常低的价值——这样,传统的解决冲突的方法间接剥夺了参与者获得公正的意义——或是选择价值很高的交易,并且不能接受在速度、可靠性、或传统的冲突解决隐私时的缺陷。

我期待着令人兴奋的应用的出现,大家会发现,他们的技术会变得越来越实用。

Gregory Maxwell