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

核心提示【摘要】 零知识证明技术不管应用于金融还是其他领域,都可以对隐私保护,性能提升,或者安全性等场景带来很多帮助。本文通过介绍华为如何在同态加密及零知识证明框架的集成介绍来介绍了一些对金融领域交易隐私保护的思路,通过代码结和应用场景描述了zks

摘要:零知识证明技术,无论是应用于金融还是其他领域,都可以给隐私保护、性能提升、安全等场景带来很多帮助。介绍了华为如何整合同态加密和零知识证明框架引入金融领域交易隐私保护的一些思路,描述了zksnark如何整合到现有的联盟链体系中,通过代码结和应用场景保护交易隐私。以及目前零知识证明领域面临的技术挑战,华为用什么样的技术来解决目前的挑战,提出了未来区块链隐私保护的思路。

什么是零知识证明?

证明者可以在不透露任何有效知识的情况下验证断言是否正确。图1给出了一个有趣的例子。爱丽丝把她的签名信封放在保险箱里。鲍勃说他知道保险箱的密码。爱丽丝要求鲍勃证明给她看。鲍勃打开保险箱,把信封拿给爱丽丝。爱丽丝验证了信封上的签名,确认鲍勃确实知道密码。这个例子是Bob在不告诉Alice密码的情况下证明自己知道密码的过程,很好的解释了零知识证明的概念。基于非对称加密和数字签名的证书认证过程实际上是一个零知识证明过程。验证者可以在不知道CA证书的情况下验证对方是CA颁发的下一级证书。零防技术无论是应用于金融还是其他领域,都可以给隐私保护、性能提升、安全等场景带来很多帮助。下面,我们将从隐私维度分享零知识证明的相关技术。

图1零知识证明

零知识证明应该应用到同态加密中,以保护交易隐私并使能金融业务。

目前,金融转账交易场景下的隐私保护越来越受到重视,隐私已经成为区块链亟待解决的重要问题。那是基于下面这个问题。A转账10元给B,需要区块链节点记账,但区块链节点不想知道交易金额和最新余额也是金融场景中很常见的问题。

图2同态加密

基于该场景如何解决区块链技术应用于金融的私密性和可用性?华为目前推出同态加密。同态加密是加密的一种形式,它允许人们对密文进行特定形式的代数运算,得到仍然被加密的结果,解密得到的结果与对明文进行相同运算得到的结果相同。换句话说,这项技术允许人们在加密的数据中进行搜索和比较等操作,并得到正确的结果,而无需在整个过程中解密数据。在此基础上,创新性地提出了同态加密范围的证明。

基于集成到区块链系统中的同态加密库和改进的同态加密库,通过零知识证明实现了秘密转移的能力。一个密文与另一个密文相加或相乘,实现传输中的密文交易。零知识证明,证明对方在整个计算过程中,不需要透露具体的数字就可以完成转账过程,可以得到数字的范围。以便验证由数字表示的交易的有效性。

使用同态加密库

我们来看看零知识证明在代码中是如何应用的。演示代码使用的地址:https://support . Huawei cloud . com/devg-BCS/BCS _ devg _ 0020 . html,下面讲解的代码都可以从上面的地址下载。

func事务处理错误{ addrA:= calcAddr setup:= SDK _ client。basesetuimpl { config file:conf,ChannelID:channelid,OrgID: orgid,ConnectEventHub: false,ChainCodeID: idchaincode,} if err := setup。初始化;呃!= nil { fmt。Println)返回错误。新)}设置。chain codeid = txchaincode transRec:= SDK _ client。TransRecord{} resps,err := sdk_client。Query}) if err!= nil { fmt。Println) return err} err = json。Unmarshal.Payload,transRec) if err!= nil { fmt。Println) return err} var pubKeyB字符串设置。ChainCodeID = idchaincode resps,err = sdk_client。Query}) if err!= nil { fmt。Println)返回错误。New) } pubKeyB = string。有效载荷)fmt。println cipher balance akeya:= trans rec。Balance txInfoSer,err := pswapi_sdk。如果出错,请准备好信息!= nil { fmt。Println)返回错误。新)}设置。ChainCodeID = txchaincode_,err = sdk_client。调用,[]byte,[]byte})如果err!= nil { fmt。Println)返回错误。New) }返回nil}

图3同态加密服务代码

图3示出了同态加密的业务代码。先写一个事务方法,返回值是error。第一步是初始化sdk_client对象,即setup变量。然后通过sdk_client基于key“query balance”查询账户A的加密余额。Querry方法,用同样的方法基于key“query pubkey”得到B的公钥。第二步是通过PrepareTxInfo方法构建从A到B的传输信息,最后一步是通过调用invoke完成从A到B的传输过程。

功能转移按钮。response { AddrA:= args[0]AddrB:= args[1]txInfo:= args[2]if字符串。Compare == 0 {logger。错误返回垫片。Error } transRecA,err := stub。GetState if err!= nil {返回填充符。error } if trans reca = = nil { return shim。error } var transre struct = trans record { } err = JSON。如果出错,则解组!= nil {logger。错误返回垫片。Error } transRecB,err := stub。GetState if err!= nil {返回填充符。error } if trans reca = = nil { return shim。error } var transRecBStruct = trans record { } err = JSON。如果出错,则解组!= nil {logger。错误返回垫片。error } ciphelbalanceakeyablock:= transrecstruct。balance cipher balancebkeyblock:= transRecBStruct。Balance newCipherBalanceA,newCipherBalanceB,newCipherTxA,newCipherTxB,err := pswapi_cc。如果出错,则验证TxInfo!= nil {logger。错误返回垫片。Error } transRecAStruct。balance = newCipherBalanceA transre struct。TX = newCipherTxA transRecAStruct。TXType = "P" AvalbytesUpdate,err := json。元帅如果犯错!= nil {logger。错误返回垫片。错误} err =存根。如果出错,请输入状态!= nil {logger。错误)返回垫片。Error) } transRecBStruct。balance = newCipherBalanceB transRecBStruct。TX = newCipherTxB transRecBStruct。TXType = "R" BvalbytesUpdate,err := json。元帅如果犯错!= nil {logger。错误返回垫片。错误} err =存根。如果出错,请输入状态!= nil {返回填充符。错误)}返回shim。成功)}

图4同态加密链代码

图4是同态加密核的转移链代码。在这个方法中,首先通过getstate获得A和B两个账户的当前余额,然后最重要的一步就是验证他的余额。在validatetxinfo方法中,基于范围/等式证明验证交易数据的合规性,基于同态加密算法计算交易后的账户余额,最后更新交易后的账户A和账户B的余额。在同态加密这一步骤中,应用零知识证明的相关技术和能力,促使同态加密更加高效和安全。

根据

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

图5交互式证明

知识的零证明分为交互证明和非交互证明。有两个有趣的例子来解释这个概念。如上图5所示,男方向女方声称自己有光盘的钥匙,女方不相信,说:“给我看看。”那人心想:“你要我收下,我就没面子了。”那人说:“我们来玩一个游戏,如下。”

1.女人站在a点。

2.男人从B点走到C点或d点。

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

4.那个女人喊着“从左边出来”或者“从右边出来”

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

女人说:“你一定作弊。刚才我在左边喊,你刚从左边进去”,

那人说:“你回A点,我们再来一次。”

如果每次都成功,说明B确实有CD上的密钥,证明A和B需要不断的交互。

非交互式零知识证明方案由算法设置、证明和验证定义。具体来说,我们有params=Setup,其中输入是安全参数,输出是ZKP算法系统的参数。证明语法由证明=证明给出。该算法接收某NP语言L的实例X和见证W作为输入,输出零知识证明。验证算法接收证明作为输入,并输出位B,如果验证者接受证明,则位B等于1。比如流行,我有一个秘密。我不想告诉别人,但我必须说服别人。我知道这个秘密,类似于这个,但是我们为什么需要这种不互动呢?因为交互证明只对原始验证者有效,所以其他任何人都不能信任这个证明。在这种情况下,验证者可以与证明者串通,证明者可以伪造证书。验证者也可以通过这种方式进行一些伪造。因此,验证者必须保存一些数据,直到相关证书被验证。这将导致一些秘密参数被泄露的风险。这种交互证明也是有用的。例如,证明者只希望一个特定的验证者进行验证,但是证明者和验证者必须保持在线,并且为每个验证者执行相同的计算。

什么是?

Zk-SNARK是Zero-knowledge简洁的非交互式知识论证(Zero-knowledge Non-interactive arguments of knowledge)的缩写,意思是:零知识,即在证明过程中不会泄露任何隐私数据;简洁,简明,主要是指验证过程不涉及大量数据传输,验证计算方法简单;非交互:没有交互。证明可以在证明者和验证者之间没有交互的情况下实现。交互式零知识证明需要每个验证者向证明者发送数据来完成证明,但是没有交互式零知识证明。证明者只需要计算一次就可以生成一个证明,所有的验证者都可以验证这个证明。Zk-SNARK是一个非常创新的算法,可以证明一个陈述是真实的,而不会泄露关于该陈述的私人信息。它可以证明某人知道一个秘密,而不透露关于它的任何信息。这个算法能解决什么问题?

它是所有零知识证明问题的通用解决方案,最早由加密数字货币zcash使用,并且开源。zk-SNARK的优势:

1.万能库,可以解决很多零知识证明问题。

2.经验证,性能良好。

zk-SNARK的缺点:

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

2.生成每个事务的时间延迟很长。

应用场景

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

匿名可验证投票:投票是保证一个国家或控股公司民主的重要一环。但投票过程中可能会泄露选民的隐私。此外,很难安全地核实投票结果。ZKP是实现匿名可验证投票的一种有效方法。根据ZKP的用途,合格的选民可以在不暴露身份的情况下投票以显示他们的权利。此外,ZKP允许合格选民要求提供可核实的证据,证明他们的投票被计入负责报告投票结果的机构的最终计票中。

数字资产的安全交换:数字资产是二进制数据的集合,具有唯一的可识别性和价值。如果两个用户想要交换他们的数字资产,用户的隐私,包括身份和交换的数字资产的内容,可能在交换期间被泄露。根据ZKP的使用,数字资产可以在不泄露用户隐私的情况下进行交换。此外,ZKP提供了可核实的证据,包括数字资产交换的过程。

安全的生物特征认证:远程生物特征认证是一种通过使用生物特征模式(如指纹、面部图像、虹膜或血管模式)来识别用户访问权限的方法。然而,当实现远程生物特征认证时,用户的生物特征模式可能被泄露给不可信的第三方。使用ZKP可以解决这个问题。此外,ZKP代还提供了可验证的证据,包括识别用户访问权限的过程。

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

零知识证明

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

华为将zksnark架构集成到区块链系统中,以解决上述挑战。我们知道有很多方法可以让zkSNark为区块链服务。这些都降低了配对函数和椭圆曲线运算的实际成本。

1.提高合同虚拟机的性能。

比第二种更难实现。可以向契约虚拟机添加功能和限制,这将允许更好的实时编译和解释,而无需对现有实现进行太多必要的更改。以下传输场景基于该方案的实现。

2.仅在与一些配对函数和椭圆曲线乘法的契约下提高虚拟机的性能。

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

转移申请

图6传输初始化

图6包含了初始化这种平衡的过程。生成交易即真实转账的过程包括验证、证明、验证、交易生成即收款等步骤。以初始化为例。假设爱丽丝初始化一个100元的余额,然后鲍勃收费10元。转账的过程可以描述为:爱丽丝转账20元给鲍勃,内部生成一对消费密钥/支付密钥,相当于一个账户,用于临时交易。支付密钥给对方,消费密钥留给自己,用来证明交易链中的交易属于谁。

当获得生成的交易和相关证书时,交易生成步骤完成。下一步是核实转让。验证逻辑如下:

作废器NF.axxxxx1和NF.axxxxx2是否在作废器列表中,即是否已经失效;

验证NF.axxxxx1和NF.axxxxx2是合法格式的消费凭证,对应的承诺在链上。这里,需要验证Merkle树根是有效的;

验证输入==输出量守恒,即100+0 = 80+0+20;

数字范围符合要求:100-20 > 0 > 20 > 0。

验证过程完成后,转到最后一步。经过验证后,我们会做一些类似隐藏交易内容、身份、交易行为的事情来保护整个转账交易过程的安全,包括可以做一些混淆电路。交易内容混乱,加密。验证者不知道链上的哪一个承诺作为输入,只知道没有花掉,在链上。身份隐藏使得无法确定接收方是谁,事务隐藏使得无法确定这个事务是发送的还是接收的。在保证安全性的基础上,可以完成整个验证过程。最后生成交易,然后收钱,整个转账过程结束。基于零知识证明的转移被华为集成在零知识证明接口中。该集成的零知识证明架构还可以用于开发一些隐私应用,实现区块链隐私保护的解决方案。

摘要

交易隐私保护的技术有很多。零知识证明技术不一定是最佳选择。在安全领域,有很多隐私保护能力比如同态,秘密共享,随意传输,或者一些基于TEE硬件的隐私保护能力,可以用来保护一些隐私。但是零知识证明的优势也是显著的,未来区块链的隐私保护还有很长的路要走。如何实现快速、高效、可靠的零知识证明算法,如何实现能够抵抗量子计算的零知识证明算法,都是需要进一步解决的问题。基于网上提供的一些基础能力,如果有兴趣可以从之前的网站下载相应的代码示例。

 
友情链接
鄂ICP备19019357号-22