欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

PoD-Tiny:实现零信任交易的最简协议

来源:本站整理 作者:佚名 时间:2019-08-06 TAG: 我要投稿

导言: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 = m*G
承诺也叫 Commitment,它可以做到和数据的一一对应,同时并且能够隐藏数据的值。这里的 A 在 zkPoD 系统中被称为「认证信息」 Authenticator。而这里的G 是一个椭圆曲线循环群的生成元。
「认证信息」Authenticator 可以向所有人公开,我们不用担心会泄露原始数据信息。这是因为,通过 A 难以反算出来 m。这个逆运算是一个有限域的「求对数」运算。假如有限域比较大的话,这个对数运算是非常非常困难的,这就是常说的「离散对数难题」假设。抛开这些理论细节,我们只要知道,Authenticator 可以放心交给任何人,而不用担心 m​ 被逆向破解。
「认证信息」为什么要采用这种「承诺」形式,而不是采用大家所熟知的 Hash 运算。这是因为「承诺」具有加法运算同态性。所谓同态性质,大家可以这么理解:明文数据具有的某种运算,可以同态映射到密文的运算中。假设有三个数据明文,m1,m2还有 m3,其中 m1 = m2 + m3。
他们的 Authenticator 分别计算如下:
A1 = m1*G, A2 = m2*G, A3 = m3*G,
我们可以计算 A1 ?= A2 + A3
来验证 m1 ?= m2 + m3。大家可以发现,虽然一个吃瓜群众知道了 A1,他也不能反算出m1。但是他仍然知道 m1 等于另外两个数的和,虽然他完全不知道这三个数具体的值是多少。
注:这里的加法是模加,a + b 是 a + b mod p的简写。为了易读性,后续的加减乘除一律约定是有限域上的运算。
剩下的事情就简单了,在 PoD协议中,我们可以任选一个随机数 k 作为一次性密钥,来加密m,计算 E(m) = k + m。 E(m) 就是加密数据。我可以把 K = k*G 也发给你,这样你手里有三样东西,A ,K,还有 E(m)。你就可以用下面的公式来「同态地」校验加了密的 E(m) 确实是数据 m 的密文:
E(m)*G ?= K + A
并且,通过上面的公式,你还能知道一个关键信息:密钥是一个关联到 K 的数值。尽管这时候你完全不知道 m 和 密钥 k。这个信息也是解决关键问题(3)的关键所在。
总结一下:
通过同态性,买家可以在数据加密的情况验证数据是否满足一些条件
回忆一下关键问题(2):
关键问题(2):你收到加密数据之后,不付钱就跑路怎么办
解决这个问题是核心方法是「零知识证明」。如果买家拿到加密数据之后,从中分析不出来任何多余的信息,那么就不会损害卖家利益,也就能解决关键问题(2)。简单讲,如果加密数据是零知识的,就不怕买家拿了加密数据不给钱就跑路。所谓的「零知识」,大家可以这么通俗理解:买家拿到的加密数据后,就像拿到一堆随机数一样,没有任何信息量。怎么做到零知识呢?PoD-Tiny 采用了经典 Schnorr 协议的思想。
插播科普:Schnorr 协议 与 「零知识」
Schnorr 协议是非常经典的教课书例子,我这里快速带大家过一遍。Schnorr 协议的用途之一是用来做身份认证,它是一个两方安全协议,一方「证明者」Alice ,向另一方「验证者」Bob证明她拥有一个公钥对应的私钥。
首先 Alice 产生一对「公私钥」,(PK, sk)。然后 Bob 持有 Alice 的公钥 PK。当 Alice 要向 Bob 证明身份时,他们会通过一个「三步交互协议」来完成证明:证明 Alice 拥有私钥 sk。如果 Bob 接受了这个证明,那么 Bob 会认为 对面证明有私钥的人就是 Alice。下面简单描述下这个协议:

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载