区块链交易隐私如何保证?华为零知识证明技术实战解析

Posted Pam

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区块链交易隐私如何保证?华为零知识证明技术实战解析相关的知识,希望对你有一定的参考价值。

转载:https://bbs.huaweicloud.com/blogs/306971

【摘要】 零知识证明技术不管应用于金融还是其他领域,都可以对隐私保护,性能提升,或者安全性等场景带来很多帮助。本文通过介绍华为如何在同态加密及零知识证明框架的集成介绍来介绍了一些对金融领域交易隐私保护的思路,通过代码结和应用场景描述了zksnark如何集成到现有联盟链体系保护交易隐私。以及目前零知识证明领域应用的技术挑战,华为是通过什么样的技术解决当前的挑战问题的,并提出对未来区块链的隐私保护思路。

什么是零知识证明?

        证明者在不泄露任何有效知识的情况下,验证者可以验证某个论断是正确的。图1给出一个有趣的例子,Alice把自己的签名的信封放到一个保险箱中,Bob说他知道这个保险箱的密码,Alice让Bob证明给她看。Bob打开保险箱,把信封拿出来给Alice。Alice验证信封上的签名,确认了Bob确实知道这个密码。这个例子就是Bob没有告诉Alice密码却证明自己知道密码的的过程很好的解释了零知识证明的概念。基于非对称加密和数字签名的证书认证过程,其实也是一个零知识证明的过程,验证者并不需要知晓CA证书,就可以验证对方是由CA签发的下一级证书。零知识证明技术不管应用于金融还是其他领域,都可以对隐私保护,性能提升,或者安全性等场景带来很多帮助。下面,主要从隐私维度来分享华为零知识证明相关技术。

                                    图1 零知识证明

零知识证明应用于同态加密保护交易隐私,使能金融业务

        目前金融转账交易场景中对于隐私保护已经越来越重视,隐私也成为区块链急需解决的一个重要问题。那基于如下问题, A向B转账10元,需要区块链节点记账,但是不想让区块链节点知道交易金额以及最新余额,也是金融场景中一个非常常见的问题。

                                            图2  同态加密

       基于这种场景如何解决区块链技术应用于金融的隐私和可用性?华为目前引入同态加密(解决隐私问题)。同态加密(英語:Homomorphic encryption)是一种加密形式,它允许人们对密文进行特定形式的代数运算得到仍然是加密的结果,将其解密所得到的结果与对明文进行同样的运算结果一样。 换言之,这项技术令人们可以在加密的数据中进行诸如检索、比较等操作,得出正确的结果,而在整个处理过程中无需对数据进行解密。在此基础上创新式提出了同态加密范围证明(一种针对数字的零知识证明技术,在不泄露具体数字值的情况下,获得数字的范围,从而验证数字所代表的交易的有效性)。

       基于集成到区块链系统中的同态加密库以及修改同态加密库实现的零知识证明能力实现了隐私转账的能力,一个密文和另一个密文相加或相乘实现转账中的密文交易,零知识证明在整个的计算过程中不暴露任一方的信息证明对方可以完成转账这一流程,在不泄露具体数字的情况下得到数字的范围。从而验证数字所代表交易的有效性。

使用同态加密库的app端sample代码示例

       下面我们看一下零知识证明在代码中是如何应用的,Demo代码使用地址:https://support.huaweicloud.com/devg-bcs/bcs_devg_0020.html。下面讲解的代码都可以在上面的地址中下载全量代码查看。

 

                              图3  同态加密链代码1

                                            图4  同态加密链代码2

        图3是同态加密的链代码,首先定义好一个transaction的结构,在进行初始化,基于Query方法可以根据B的地址调用链码获取B的公钥 ,第二个红框获取A的当前加密余额,PrepareTxInfo方法构建A向B的转账信息,最后通过invoke调用完成A到B的转账的过程。在图4 transfer链代码方法中,首先通过getstate获取A和B两个账户的当前余额,然后最重要的一步,要去验证他的余额,所以说我们这个方法validatetxinfo,基于范围/等式证明验证交易数据的合规性,基于同态加密算法计算交易后的账户余额,最后更新交易后A账户和B账户的余额。同态加密的这一步中,应用了零知识证明的相关的这个技术和能力来实现了这个同态加密更加的高效和安全。

基于zksnark的零知识证明技术

交互式证明和非交互式证明

                                   图5   交互式证明

       零知识证明又分为交互式证明非交互式证明,有两个有趣的例子很好的解释了这个概念。如上图5所示,男子向女子声称有CD处的钥匙,女子不相信说“你拿出来给我看啊”,男子想“你让我拿我就拿多没面子啊”,男子说”这样吧,按下面步骤玩个游戏”

1.女子站在A点

2.男子从B点走到C点或者D点

3.男子从B点消失后,女子从A点走到B点

4.女子喊话“从左边出来”,或者“从右边出来”

5.男子按照女子的要求从对应一侧走出

女子说“你肯定作弊,刚才我喊左边出来,你刚好就是从左边进去的”,

男子说:“你回到A点,我们再来一遍”

如果每次都成功,说明B确实有CD处的钥匙,该证明是需要A,B不停的交互

非交互式零知识(NizK)证明方案由算法设置、证明和验证定义。

具体来说,我们有params=Setup(),其中输入是安全参数,输出是ZKP算法系统的参数。

证明语法由证明=证明(x,w)给出。该算法接收某些NP语言L的实例x和见证w作为输入,并输出零知识证明。

验证算法接收证明作为输入,并输出位b,如果验证者接受证明,则该位等于1。通俗一点就比如说我有一个秘密,我不想告诉别人,但是我又得让别人相信。我是知道这个秘密的,类似于这种,但是我们为什么需要有这种非交互式呢?因为交互式证明的其实只对原始的验证者有效,其他的任何人都不能够信任这个证明。这种场景下呢,就会导致这个验证者可以和这个证明人串通,证明人可以伪造证明。验证者也可以用这种方式做一些伪造。因此,验证者必须保存一些数据,直到相关的证明被验证完毕。这样就会造成一些秘密参数泄露的这种风险。这种交互式证明也有它的用处,就比如说一个证明人只想让一个特定的验证者来去验证,但是这个证证明人和验证者必须保持在线,并且去对每一个验证者执行同样的计算。

什么是zk-snark?

       zk-SNARK 是 Zero-knowledge succinct non-interactive arguments of knowledge 的缩写,他的意思是: zero knowledge:零知识,即在证明的过程中不透露任何隐私数据: succinct:简洁的,主要是指验证过程不涉及大量数据传输以及验证算 法简单; non-interactive:无交互。证明者与验证者之间不需要交互即可实现证 明,交互的零知识证明要求每个验证者都要向证明者发送数据来完成证明, 而无交互的零知识证明,证明者只需要计算一次产生一个 proof,所有的验证者都可以验证这个 proof。 zk-SNARK 是证明某个声明是真却不泄露关于该声明的隐私信息的一 个很有创新性的算法,他可以证明某人知道某个秘密却不会泄露关于这个秘密的任何信息。这个算法可以解决什么问题呢?

它是对所有零知识证明问题的通用解决方法,由加密数字货币zcash首次使用并开源。

zk-SNARK的优点:

1.通用库,可以解很多零知识证明问题

2.验证证明性能较高(300tps)

zk-SNARK的不足:

1.底层模型不容易理解,用户需要根据具体的零知识证明问题,在上层构建自己的业务模型,这块开发的工作量较大。

2.生成每笔交易时延较长(57s)

应用场景

       ZKP的应用场景包括匿名可验证投票数字资产安全交换安全远程生物识别认证安全拍卖,具体如下。

       匿名可核查投票:投票是保障一个国家或控股公司民主的重要组成部分。然而,选民的隐私可能在投票过程中被泄露。此外,投票结果很难得到安全的核实。ZKP是实施匿名可核查投票的一种可用方法。根据ZKP的使用,符合条件的选民可以在不泄露身份的情况下投票表决显示他们的权利。此外,ZKP允许符合条件的选民要求提供可核查的证据,证明他们的选票包含在负责报告投票结果的机构的最终计票中。

       数字资产的安全交换:数字资产是二进制数据的集合,它们是唯一可识别和有价值的。如果两个用户希望交换其数字资产,则用户的隐私,包括身份和交换数字资产的内容,可能会在交换过程中泄露。根据ZKP的使用,数字资产可以在不泄露用户隐私的情况下交换。此外,ZKP生成了可验证的证据,其中包含数字资产交换的过程。

       安全远程生物识别身份验证:远程生物识别身份验证是一种可用于通过使用指纹、面部图像、虹膜或血管模式等生物识别模式识别用户访问权限的方法。但是,在实施远程生物识别认证时,用户的生物识别模式可能会泄露给不受信任的第三方。使用ZKP可以解决这个问题。此外,ZKP生成还提供了可核查的证据,其中包括识别用户访问权限的过程。

       安全拍卖:政府拍卖是政府从多个供应商中选择最低出价的拍卖,这些供应商以竞争性方式销售其商品和服务。本次拍卖包括两个阶段。在第一阶段,多个供应商投标,但公众不知道。在第二阶段,这些投标是开放的。政府选择中标供应商,后者出价最低。然而,中标供应商的选择可能会泄露其他中标供应商的投标和身份。ZKP可以解决这个问题。ZKP为每个输标供应商生成可核查的证据。该证明证实输标供应商的投标与中标供应商的投标之间的差额是正的。

zk-snark应用于区块链的挑战及实现

      零知识证明是指一方(证明者)向另 一方(验证者)证明一个陈述是正确的, 而无需透露除该陈述正确以外的任何信 息,适用于解决任何NP问题。而区块链恰好可以抽象成多方验证交易是否有效 (NP问题)的平台,因此,两者是天然相适应的。将零知识证明应用到区块链中 需要考虑的技术挑战分为两大类:一类 是适用于隐私保护的区块链架构设计方案,包括隐秘交易所花资产存在性证明匿名资产双花问题匿名资产花费与转移、等技术挑战;另一类是零知识证明技术本身带来 挑战,包括参数初始化阶段算法性能以及安全问题等技术挑战。

华为集成了zksnark架构到区块链系统中来解决上面的挑战。我们知道有多种方法可以为区块链启用zkSNark。这些都降低了配对函数和椭圆曲线操作的实际成本。

1. 提高合约虚拟机的性能

相较第二种更难实现。可以在合约虚拟机中添加功能和限制,这将允许更好的实时编译和解释,而无需在现有实现中进行太多必要的更改。下面的转账场景就是基于此种方案的实现。

2. 仅提高某些配对函数和椭圆曲线乘法的在合约虚拟机的性能

通过强制所有区块链客户端实现特定的配对函数和在特定椭圆曲线上的乘法作为所谓的预编译契约来实现。好处是,这可能更容易和更快地实现。另一方面,缺点是我们固定在一定的配对函数和一定的椭圆曲线上。区块链的任何新客户端都必须重新实施这些预编译的合同。此外,如果有人找到更好的zkSNark、更好的配对函数或更好的椭圆曲线,或者如果在椭圆曲线、配对函数或zkSNark中发现缺陷,必须添加新的预编译合同。

转账应用

                                            图6   转账初始化

        图6包含了对这个余额初始化的一个过程,及生成交易也就是真正转账的过程,下一步就是验证,证明,完成验证,最后一步,才是生成交易,也就是收款的一个过程。拿初始化举个例子,比如说爱丽丝初始化了一个100块钱的一个余额,然后鲍勃十块钱。转账的过程如下,爱丽丝转20块钱给鲍勃,就会生成生成一对Spending key / Paying Key  ,相当于临时交易的一个账户,Paying Key给对方,Spending Key留给自己,用于证明交易链上的交易是谁的。

        然后再基于这个生成相应的这个交易和相关的证明。完成交易生成这一步。下一步进行转账的验证证明的这个过程,验证逻辑如下, 验证逻辑:Nullifier NF.axxxxx1 和NF.axxxxx2 是否在Nullifiers 列表中,也就是说,是否有被花过;验证NF.axxxxx1 和NF.axxxxx2 是格式是否合法的花费凭据,且对应的commitment在链上(Proof + Merkle tree root),这里有需要验证Merkle tree root在 是有效的;验证input == output 金额守恒,即:100 + 0 = 80+0+20;数字范围满足要求:100-20 >0 && 20 > 0,把这个过程都验证完了以后呢,最后一步就是完成验证。完成验证的话,他其实还会做一些这个类似于交易内容的隐藏,身份隐藏,交易行为的隐藏,来保护整个的这个转账交易的过程的这个安全性。包括做一些类似于混淆电路的能力。有混淆的交易内容,且加密,验证者并不知道使用链上是哪个Commitment作为输入,只知道没有被花过,且在链上。身份隐藏让其无法确定接收方是谁,交易行为隐藏让其无法确定这个交易是发送还是接收。做一些安全性的保证之后呢,然后来完成整个的验证的过程。最后,生成交易,然后收款,整个转账过程就结束了。基于零知识证明的一个简单的一个能力,包括一个基础的转账,被华为集成在整个零知识证明使用接口中。集成的整个零知识证明架构也能用来开发一些零知识证明基础应用,做一些简单的解决方案。

总结

      交易隐私保护这块的技术应该是比较多的,零知识证明技术并不一定是一个最好的选择,在安全领域中还有很多诸如同态,秘密分享,不经意传输,或者基于TEE硬件的一些隐私保护能力,可以去做一些隐私保护。但是零知识证明其优点也是很显著,未来区块链的隐私保护仍然任重而道远,如何实现快速高效、可信的零知识证 明算法以及如何实现能够抵抗量子计算 的零知识证明算法,都是需要进一步解决的问题。基于线上我们提供的一些基本的能力,要是大家感兴趣,可以到之前的网址下载相应的代码示例。

作者: Pam

出处: https://www.cnblogs.com/pam-sh/>

关于作者:网安在读

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(mir_soh@163.com)咨询.

零知识证明实战在线旅游业ZoKrates

在这个教程中我们将学习如何使用零知识证明技术解决在线旅游行业中服务提供商在不透露太多商业秘密的情况下如何向OTA平台证明其服务能力的问题。我们将使用以太坊区块链上的零知识证明应用开发框架ZoKrates来完成这个应用。

区块链开发教程链接: 以太坊 | 比特币 | EOS | Tendermint | Hyperledger Fabric | Omni/USDT | Ripple

1、在线旅游应用背景简介

我们假设如下的场景:在线旅游OTA平台作为面向终端消费者的唯一入口提供度假旅游服务,因此它需要与若干提供具体服务的供应商合作,例如航空、酒店、导游等,并将这些服务整合为一个完整的产品包出售给客户:

当OTA平台针对特定的目标群体提供度假产品包时,它就从合作伙伴中根据该产品包的特性筛选满足条件的供应商。因此如果一个新的供应商例如一个新酒店要加入该网络,就需要向OTA平台提供其服务能力的证明,例如酒店综合评价不低于3.5,或者房间价格区间为$100~$150。

这一筛选过程可以视为:OTA平台给出一组KPI,供应商则需要证明自己符合这一组KPI。例如在上面的描述中就涉及到两个KPT:

  • 酒店综合评价:rating >= 3.5
  • 房间价格区间: $100 < price < $150

供应商只需要证明其满足特定的KPI要求就可以了,它并不需要提供自己的具体KPI数值,这个证明过程就是零知识证明。

现在让我们用ZoKrates来实现这个具体的零知识证明应用。

2、安装ZoKrates

ZoKrates是以太坊上第一个zk-SNARK实现,可以直接使用预置的docker镜像:

docker run -ti zokrates/zokrates /bin/bash

也可以用源代码自己构建:

git clone https://github.com/JacobEberhardt/ZoKrates

cd ZoKratesdocker 

build -t zokrates .

docker run -ti zokrates /bin/bash

cd ZoKrates/target/release

3、ZoKrates建模:使用DSL

我们假设OTA只接收综合评价在45的酒店,并且由于OTA设计的该度假产品目标客户群体是成本敏感型,因此要求房间价格区间为$100$150,这些要求转化为Zokrates的DSL(领域专用语言)描述如下:

def main(private field price, private field rating) -> (field):
  field minPrice = 100
  field maxPrice = 150
  field minRating = 4  
  
  field result = if price >= minPrice && price <= maxPrice 
                    && rating >= minRating then 1 else 0 fi
  
  return result

在上面的代码中,函数接收两个字段:价格/price和评分/rating,这两个字段都是私有/private的,因此基于该函数构造的任何证据都不会包含可以重构这两个字段的信息。如果price参数符合指定的最低/最高价格区间,并rating参数高于4,那么该函数就返回1,否则返回0。

看起来zokrates的DSL有点像Python,但它不是。Zokrates会编译这个DSL编写的程序并生成可以进行验证的R1CS(一阶约束系统)表示。

每一个我们希望构造证据的程序都需要从这种高层的DSL转换为数学上可以验证的表示,例如ZoKrates使用的R1CS表示,从DSL到R1CS的转换过程意味着将上述程序分解为基本的数学运算:

幸运的是,ZoKrates已经帮我们完成了上述分解工作,只需要将上述代码存入文件kpibounds.code,然后用ZokRates编译:

./zokrates compile -i kpibounds.code

输出结果如下:

...
(1 * ~one) * (1 * ~one + 21888242871839275222246405745257275088548364400416034343698204186575808495616 * _2305) == 1 * _2306
(1 * _2305) * (1 * ~one) == 1 * _2307
(1 * _2306) * () == 1 * _2308
(1 * ~one) * (1 * _2307 + 1 * _2308) == 1 * _2309
(1 * ~one) * (1 * _2309) == 1 * ~out_0
return (1 * ~one) * (1 * ~out_0)
Compiled code written to 'out'
Human readable code to 'out.code'
Number of constraints: 2305

注意上面输出的最后一行,这说明上述代码的R1CS表示中包含了2305个约束。这么简单的一个问题就产生这么多约束,是不是感觉有点过分了?好消息是验证的数据大小和约束的数量没有关系!我们只需要上传验证,证据是在链下计算的。

4、ZoKrates计算见证

为了构造证据,我们需要一个所描述问题的有效解,直接用zokrates命令行:

./zokrates compute-witness -a 120 4

-a表示我们传入参数,第一个参数是我们的产品价格,第二个参数是评级得分。上述命令执行后ZoKrates给出了见证的R1CS表示:

...
# _2305 = Rust::Identity(1 * _2304)
(1 * ~one) * (1 * ~one + 21888242871839275222246405745257275088548364400416034343698204186575808495616 * _2305) == 1 * _2306
(1 * _2305) * (1 * ~one) == 1 * _2307
(1 * _2306) * () == 1 * _2308
(1 * ~one) * (1 * _2307 + 1 * _2308) == 1 * _2309
(1 * ~one) * (1 * _2309) == 1 * ~out_0
return (1 * ~one) * (1 * ~out_0)
Witness:~out_0 1

最后一行很重要,因为它表明见证是有效的。我们可以试着传另一组参数:

./zokrates compute-witness -a 120 3

你可以得到如下的输出结果:

...
Witness:~out_0 0

5、ZoKrates设置:生成密钥对

构造zksnark应用需要一对密钥用于证据生成和验证,这同样是用zokrates命令行来完成:

./zokrates setup

上述命令执行后,生成文件proving.key和verification.key分别用于证据的生成和验证。

6、ZokRates生成证据

有了生成密钥,现在可以用zokrates命令行生成证据了:

./zokrates generate-proof

输出如下:

...
"H":["0x99b2d8f0e11c030ec383d6993a745c6ca6a2d2c96ff968aca54c7f12f1af6b9", "0xee87810b5bafcb94259b5fb18db449e737250d8814f2bd3f6423a04dab91a74"],
"K":["0x2256ad47f190e9da72bee9e6a1b56785dd7c0b4f402effe5dcc9895aff280528", "0x104fc9c7ba4f4a70b2f0c26c76baa014f4ffbaf82a3f49fc60cee407e78c5a17"]
,
"input":[0]

"input": [0]指的是公开输入,由于我们将所有输入都定义为私有,因此不需要公开输入。

在ZoKrates内部使用了libsnark,因此在执行上面命令之前我们需要先计算见证、生成密钥对。生成的证据存入json文件proof.json。随后我们将该文件上传以便进行验证。

7、ZoKrates验证证据

现在我们终于可以利用以太坊区块链了。我们将向Rposten测试链上传一个用于验证的智能合约。

为了创建 验证代码,我们需要前面生成的验证密钥,然后执行如下命令:

./zokrates export-verifier

该命令会生成一个新的文件:verifier.sol,这就是一个solidity智能合约。我们利用Solidity IDE将其部署到Ropsten测试链:

注意在这里我们选择了较早的Solidity编译器版本0.4.24。整个验证合约为559行代码,其中包含了所需的椭圆曲线操作代码。部署结果如下:


我们现在就可以访问这个合约的verifyTx方法了。在remix ide中我们手工输入proof.json中的数据:

发送交易之后我们需要稍等一会儿,然后检查验证是否成功。验证合约同时也会触发一个成功事件:

COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL.


原文链接:ZoKrates实战在线旅游业 — 汇智网

以上是关于区块链交易隐私如何保证?华为零知识证明技术实战解析的主要内容,如果未能解决你的问题,请参考以下文章

零知识证明实战在线旅游业ZoKrates

MEXC Global科普:什么是区块链零知识证明?

安比实验室郭宇:当深度神经网络遇上零知识证明

零知识证明以及其在 BSV 区块链中的应用简介

技术科普万纳链密码学方案介绍——零知识证明

区块链中的隐私保护技术