零知识证明的区块链应用:数资科技自研区块链的底层架构

数据观  •  扫码分享
我是创始人李岩:很抱歉!给自己产品做个广告,点击进来看看。  

1月7日,由中关村大数据产业联盟主办,中国信息协会、数据观、大数据文摘等协办的线上网络分享会——“区块链100分”在当晚准时举办。本期分享会的主题为《零知识证明的区块链应用:数资科技自研区块链的底层架构》。

活动中,数资科技技术总监,前瑞星公司产品总监、架构师、区块链技术负责人,国家发改委微软架构师尹松为大家作分享。

以下是尹松分享的全文内容(略有删减):

零知识证明(zeroknowledgeproof)

我们都知道:在信息安全方面,安全的密码算法和完善的密码协议一直都是研究的两大重点和方向。对于安全算法,从最初的对称密钥密码学算法到非对称密码算法,从经典的RSA算法到椭圆曲线算法,再到AES算法,算法已经具备了相当的安全性。但即使有了非常安全的密码算法,如果对应的密码协议是不健全的、存在漏洞的,那么整个系统还是很易遭受攻击者攻击,甚至击破。所以密码协议安全的研究一直是密码学研究的热点之一。而零知识证明,实质上就是一种涉及两方或者更多方的协议,无数的事实证明零知识证明在密码学当中非常有用,同时其的证明验证在区块链技术中也起着重要作用。

零知识证明(zeroknowledgeproof),是由S.Goldwasser、S.Micali以及C.Rackoff在20世纪80年代提出的。从本质上讲,零知识证明是一种协议。所谓协议,就是两个或两个以上的参与者为完成某项特定的任务,而采取的一系列步骤,包括以下三个特征:

1)协议自始至终是有序的过程,每一步都必须依次执行,在前一步未执行完之前,后面的步骤不可执行;

2)协议至少需要两个参与者,一个人可以通过执行一系列的步骤来完成某项任务,但这无法构成协议;

3)通过执行协议必须能够完成某项任务。

零知识证明还有一个特点就是在完成协议基本证明任务的基础上,没有向验证者透露所证明内容的相关信息,很好的保护了隐私。

零知识证明协议至少包括两方,一方为证明者,一方为验证者。证明者是试图向验证者证明其拥有某项知识、或某个论断、或某个能力是正确的,其是拥有的,但却不向验证者透露任何“有价值的”信息,一定程度的保护了自身的隐私。我们一般将零知识证明中的证明者用P表示,而验证者用V来表示。

有关于零知识证明最经典的模型,是JeanJacquesQuisquater和LouisGuillou提出的洞穴模型。以下这张图片能帮助大家理解。

这是一个介绍零知识证明的基本思想的著名故事。在这个故事中,佩吉(Peggy)发现了用来在山洞中打开魔法门的秘密单词。洞穴的形状像一个环,入口在一侧,魔术门挡住了另一侧。维克多想知道佩吉是否知道这个秘密词。但佩吉(Peggy)不想向维克多(Victor)透露自己的知识(秘密词)或向整个世界透露自己的知识事实。这样,Peggy如何向Victor证明自己知道秘密词,而不让Victor知道秘密词的内容呢?

他们标记了从入口A和B进入的左右路径。首先,当佩吉(Peggy)进入时,维克多(Victor)在山洞外等着。然后,维克多(Victor)进入山洞,大喊他想让她用来返回的路径名称,随机选择A或B。只要她确实知道魔术字,这很容易:她在必要时打开门,然后沿着所需的路径返回。

如果Peggy不知道魔术字(秘密词),当维克多(Victor)给出与他输入的路径相同的路径的名称,则他只能按命名路径返回。由于Victor会随机选择A或B,因此他有50%的机会正确猜测。如果他们要重复多次(连续说10次),他成功预期到Victor的所有请求的机会就会越来越小,甚至最后趋近于零。

因此,如果佩吉(Peggy)反复出现在维克多(Victor)的名字出口处,他可以得出结论,佩吉确实很可能知道这个秘密词。

分割选择协议是交互式零知识证明协议的雏形,其类似于如下将任何东西等分的经典协议:

1)P将东西分成两半。

2)V给自己选择一半。

3)P拿走剩下的一半。

分割选择协议之所以起作用,是因为P没有办法重复猜出V要他从那一边出来。如果P不知道洞穴密门的咒语,那么其只能从进去的路原路返回。在协议的每一轮中,其中有一半的机会猜中V将叫他从哪一边出来,也就是说,有一半的机会骗V。但经过n次之后,P能欺骗V的机会是2的n次方分之一。

我们总结一下,当P与V完成一个协议后,这个协议是否是零知识证明协议,其必须满足下面三个条件:

1.完备性。当P向V的声称是真的,V有一个大的概率接受P的结论。

2.有效性。当P向V的声称是假的,V有一个大的概率拒绝P的结论。

3.零知识性。当P向V的声称是真的,V在不违背协议的情况下,无论V采用任何手段,只能接收到P给出的结论,而无法得到其它任何信息。(无法得知秘密的本身)

以上是零知识证明的原理,大家不理解也没太大的关系。只要记住一点就可以抓住零知识证明的精髓:无须向别人展示你掌握的秘密信息,即可让别人相信你掌握了这个秘密。

零知识证明技术在区块链中的运用

大家都知道:区块链上的全部数据都是天然全公开的,所有人都可以查看,翻阅和验证。比特币、以太坊的地址仅仅做到了匿名方式(隐蔽了地址后面的真实身份),一旦某个人知道了钱包地址对应的身份(比如交易所需要实名认证),他就可以通过这个地址的交易信息不断挖掘关联交易的账号,确定新的身份。不仅可以看到你的余额、你所有的转账记录,还能找到和你有关系的其他人员身份。这个我们称之为隐私数据的雪崩效应。

零知识证明这个密码学相关技术,其最大解决的痛点就是匿名性,也就是说其能很好的保护“隐私”,也可以说是一种安全性的提高。也就是说无论是个人还是机构,不想让第三方看到的“东西”,有一个叫零知识证明的技术提供技术支撑。

设想一下医疗保险的一个场景,购买保险需要提供个人的体检报告来证明健康状况。如果用区块链来实现的话,代表着个人的体检报告就要记录到区块链上,昭告天下了,我感觉这样子对于任何人来说都是不妥当的。这么隐私的数据,没有任何人愿意被别人知道。那么区块链是不是就解决不了这些问题了呢?

这里我们要说到一个大的概念:隐私计算。零知识证明正好是隐私计算中的一种技术。私密计算就是用来解决这样的问题。私密计算支持在区块链上记录计算结果,用共识完成对于计算结果的验证,而不暴露计算所用到的原始数据。

我们用哈希计算举个例子:我手中有个原始数据(可以是任何隐私数据),我先在区块链上记录一个哈希值(隐私数据的哈希值)。如何来证明我知道这个哈希值的原始数据(隐私数据),但是不暴露这个原始数据?目前研究的技术主要是安全多方计算(MPC)和零知识证明。现有的匿名交易的实现主要有三类:使用环签名的比如Monero,使用零知识证明的ZCash,还有最近火起来的使用Mimblewimble协议的Grin等。Mimblewimble协议的交互需要双方见面,或者同时在线,这会导致其应用场景比较受限。而环形签名如果没有足够多的人一起的话,匿名性是不高的。

零知识证明的方法就好很多了:对于隐私交易,我们可以把整个区块链系统想象成一个大的地址。所有人都往这个地址里转Token,所有人都可以从这个地址里把Token转走。不像环形签名,所有人之间不需要合作,转账随时可以进行,无需等待。另外,整个系统中,历史上所有的隐私交易都被混合在一起,使整体的匿名性、隐私性也要高很多。

那么零知识证明是怎样实现转入和转出的分离,并且可以被验证呢?每个人在转入Token的时候,都自己生成一个数字(秘密数据),转账的时候在Token上附带一个用这个数字生成的哈希值A,写入区块链系统。在提取Token的时候,只需要向区块链系统证明:我知道一个秘密(私有数据),这个秘密生成的哈希值是A。区块链上的共识层在确认这个证明是有效性后,放行Token的提取。因为哈希值A在区块链上,说明转入的Token是确实存在的,而谁有哈希值A背后的数字,说明那个人真的是转入Token的人。而零知识证明保证了在整个操作过程中,没有人知道我的数字(秘密数据)是什么,也就无法伪装成我把Token提取走。

到此为止,问题仍然存在:上面的这个证明并没有实现转入和提取的隔离。在提取的时候暴露了哈希值A,任何人通过A就可以找到转入的那笔交易,从而把两笔交易关联起来。这个问题如何解决?

那么我们需要把证明过程升级一下。所有的转入交易都会附带一个哈希值,我们把所有的哈希值组成一个哈希值列表。我的哈希值A也在这个列表中。如果我可以证明:我知道一个秘密,这个秘密生成的哈希值在哈希值列表中。那么我的哈希值A没有暴露,也就没人能把我的转入交易和提取交易关联起来了。

上面所讲的,就是零知识证明可以做到的事情。当然零知识证明不仅仅可以用来作匿名交易这个事情。比如上面的买医疗保险的例子,同样可以使用零知识证明来实现。

我们如何在区块链中运用零知识证明,是一个很大的话题。数资科技的区块链底层正在尝试利用零知识证明来打造一个能够处理隐私数据的区块链核心。

为了便于理解,我仍然拿上面的哈希值来做例子。大家可以随时把源数据换成隐私数据就行,便于大家的理解。我们都知道哈希运算是一个函数,我们需要先把哈希函数转换成一个代数表达式(高中的代数)。

哈希函数本身可以就看作一个特别复杂的代数表达式,所以这一步很容易。但是对于逻辑语句、控制语句的函数,就不太容易直接用代数表达式了,这也是目前区块链中应用零知识证明的一个瓶颈。我的思路是利用LUA语言进行扩展,对逻辑处理进行优化处理,并形成代数表达式的固定处理模型。

下面操作涉及的数学知识较多:变成代数表达式以后,我们需要构造一组多项式,使得代数表达式满足条件的一组解,成为这组多项式的系数。这样处理的结果是:这组多项式可以互相整除。

我们的核心思想是对计算过程的抽样检验。在零知识证明中,任何人都不知道原始数据是什么样的,只能进行点点抽查。在抽查点上,计算是不是符合规则。把计算过程表示成多项式,这样抽样检查使用这个多项式,就可以通过有限的(与多项式的次数有关系,次数越少,检查点越少)抽样获得最后的结果了。验证的过程是一个交互的过程,这个过程涉及到了两个人之间的交互。有没有方法在区块链上进行实现验证过程呢?区块链上只有用节点来验证结果,如果没有人生成随机的点,那么采用上面的方法就无法实现自动化处理了。

我们可以把随机的点换成固定的点,提前部署区块链上,就无须交互过程了。但是这样就引入了一个新问题出现:如果提前知道了采样的点,即使没有符合条件的多项式,也可以伪造一个“只在采样点上符合条件的多项式”。就是说可以通过伪造证明,来达到目的。这里需要对整个的处理过程再优化一下:引入同态加密。通过同态加密的方法,把固定的采样点藏起来,把加密后的数据写入区块链,一样可以完成验证,同时还不暴露采样点的信息,这样就形成了我们最终的一个方案。

责任编辑:张薇

随意打赏

提交建议
微信扫一扫,分享给好友吧。