原创:郭宇
本文面向有一定密码学基础,或者对密码学感兴趣的读者。文中虽有大量数学公式出现,但都比较简单不难理解。
导言:zkPoD 是什么?
zkPoD 实现了去中心化的「零知识有条件支付」,支持上 GB 数据的零信任公平交易。关于「零知识有条件支付」的概念请看这篇概述文章 『zkPoD:区块链,零知识证明与形式化验证,实现无中介、零信任的公平交易』。 zkPoD 是一个全新的实现 ZKCP 目标的方案。目前 zkPoD 已经支持上 GB 的数据,支持低 TPS 公链,也支持高 TPS 联盟链;既支持二进制数据,也支持带有内部丰富类型与结构的表格数据。与传统的「受信第三方」相比,zkPoD利用区块链来作为一个「Trustless 第三方」,实现「零信任公平交易」。
zkPoD 也是一个实现数据与价值双向流通的底层基础协议
zkPoD 开源代码与更多文档请见:https://github.com/sec-bit/zkPoD-node
Proof-of Delivery (PoD) 协议
PoD 是实现 zkPoD系统的核心协议。PoD 协议实现了借用区块链智能合约来进行「数据」和 「Token」的原子交换,并且保证买卖双方的公平性。PoD 并没有像 ZKCP[1] 那样采用单一的 zkSNARK 方案来实现原子交换,而是利用了 Pedersen Commitment,Schnorr Protocol 等密码学经典方案。这样 PoD 可以做得更高效,同时易扩展。PoD 协议还将利用形式化的证明来构建坚实的「信任根基」。
本文介绍一个极简的 PoD 协议——PoD-Tiny,这个协议简化了很多细节,并不实用,但是可以帮助读者快速理解 PoD 的原理和面临的挑战。
假设我是卖家,而你需要从我手里买一个数据文件,这个协议的一个大致流程是:
- 步骤一:我把「数据」加密后,传给你
- 步骤二:你把「Token」交给区块链「智能合约」
- 步骤三:我用「密钥」交换「智能合约」手里的「Token」,然后你紧接着可以从智能合约中读取「密钥」进行「数据」解密
是不是很简单?聪明的你此刻正在高度怀疑这个过程是不是哪有问题。
「公平交易」中的关键问题
- 关键问题(1):你收到的加密数据确实是你想要的数据
- 关键问题(2):你收到加密数据之后,不付钱就跑路怎么办
- 关键问题(3):而我出示给智能合约的密钥必须是真密钥,否则拿不到 Token
- 关键问题(4):我出示真密钥之后,必须要能拿到 Token
我们接下来就抽丝剥茧,讨论下 PoD-Tiny 是怎么巧妙解决这些问题的。
锁定数据的特征:Authenticator
对于关键问题(1),我们需要一个锚点,什么是你想要的数据。这里简单起见,假设我们事先约定了一个数据文件的唯一标签,或者特征。然后你购买的数据需要能和这个标签一一对应。
一般来说,大家喜欢用 Hash 来标记对一个字符串的特征,比如计算
h = MD5("hello,zkPoD!")
我们看下这个字符串 “hello,zkPoD!” 总共有 12 个字节大小,也就是 96 个 bit。于是我们可以将这 12 个字节转换成一个有限域上的整数(这里我们假设有限域的大小接近 256 bit )。这样我们可以把这个字符串编码成一个整数,我们姑且用一个符号表示这个整数, 假设是 m。
我们通过下面的运算产生这个数据的「承诺」。
A = mG*
承诺也叫 Commitment,它可以做到和数据的一一对应,同时并且能够隐藏数据的值。这里的 A 在 zkPoD 系统中被称为「认证信息」 Authenticator。而这里的G 是一