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

 网络   2022-10-28 13:37   42

甚么是零学识证实?

证实者正在没有泄漏一切无效学识的状况下,验证者也许验证某个论断是正确的。图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。上面讲解的代码均可以正在下面的地方中下载全量代码检察。

func transaction() error {

addrA := calcAddr(userdata.PubKey)

setup := &sdk_client.BaseSetupImpl{

ConfigFile: conf,

ChannelID: channelid,

OrgID: orgid,

ConnectEventHub: false,

ChainCodeID: idchaincode,

}

if err := setup.Initialize(); err != nil {

fmt.Println("fail to init sdk: ", err.Error())

return errors.New("fail to init sdk: " + err.Error())

}

setup.ChainCodeID = txchaincode

transRec := sdk_client.TransRecord{}

resps, err := sdk_client.Query(setup, "QueryBalance", [][]byte{[]byte(addrA)})

if err != nil {

fmt.Println("Fail to query balance of sender: ", err.Error())

return err

}

err = json.Unmarshal(resps[0].ProposalResponse.GetResponse().Payload, &transRec)

if err != nil {

fmt.Println("fail to unmarshal balance result: ", err.Error())

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

return err

}

var pubKeyB string

setup.ChainCodeID = idchaincode

resps, err = sdk_client.Query(setup, "QueryPubkey", [][]byte{[]byte(addrB)})

if err != nil {

fmt.Println("Fail to query pubkey of receiver: ", err.Error())

return errors.New("Fail to query pubkey of receiver: " + err.Error())

}

pubKeyB = string(resps[0].ProposalResponse.GetResponse().Payload)

fmt.Println("Get B's ID successfully")

cipherBalanceAKeyA := transRec.Balance

txInfoSer, err := pswapi_sdk.PrepareTxInfo(cipherBalanceAKeyA, tx, userdata.PubKey, pubKeyB, userdata.PriKey, propwd)

if err != nil {

fmt.Println("fail to prepare tx info: ", err.Error())

return errors.New("fail to prepare tx info: " + err.Error())

}

setup.ChainCodeID = txchaincode

_, err = sdk_client.Invoke(setup, "Transfer", [][]byte{[]byte(addrA), []byte(addrB), []byte(txInfoSer)})

if err != nil {

fmt.Println("Invoke Transfer error for user: ", addrA, err.Error())

return errors.New("Invoke Transfer error for user: " + addrA + err.Error())

}

return nil}

图3同态加密生意代码

图3是同态加密的完结生意代码,开始写一个transaction的方式,前往值是error。第一步须要施行初始化猎取sdk_client工具也便是setup变量。然后经过sdk_client.Querry方式基于key“QueryBalance“盘诘账户A的加密余额,异样的方式基于key "QueryPubkey"拿到b的公钥。第二步PrepareTxInfo方式构建A向B的转账信息,最终一步经过invoke挪用告竣A到B的转账的历程。

func (t *TransChaincodeDemo) transfer(stub shim.ChaincodeStubInterface, args []string) pb.Response {

AddrA := args[0]

AddrB := args[1]

txInfo := args[2]

if strings.Compare(AddrA, AddrB) == 0 {

logger.Error("A' addr is the same B'Addr")

return shim.Error("A' addr is the same B'Addr")

}

transRecA, err := stub.GetState(AddrA)

if err != nil {

return shim.Error("Failed to get state")

}

if transRecA == nil {

return shim.Error("Entity not found")

}

var transRecAStruct = TransRecord{}

err = json.Unmarshal(transRecA, &transRecAStruct)

if err != nil {

logger.Error("fail to unmarshal user's trans record")

return shim.Error("fail to unmarshal user's trans record")

}

transRecB, err := stub.GetState(AddrB)

if err != nil {

return shim.Error("Failed to get state")

}

if transRecA == nil {

return shim.Error("Entity not found")

}

var transRecBStruct = TransRecord{}

err = json.Unmarshal(transRecB, &transRecBStruct)

if err != nil {

logger.Error("fail to unmarshal user's trans record")

return shim.Error("fail to unmarshal user's trans record")

}

cipherBalanceAKeyABlock := transRecAStruct.Balance

cipherBalanceBKeyBBlock := transRecBStruct.Balance

newCipherBalanceA, newCipherBalanceB, newCipherTxA, newCipherTxB, err := pswapi_cc.ValidateTxInfo(txInfo, cipherBalanceAKeyABlock, cipherBalanceBKeyBBlock)

if err != nil {

logger.Error("fail to validate trans information")

return shim.Error("fail to validate trans information")

}

transRecAStruct.Balance = newCipherBalanceA

transRecAStruct.TX = newCipherTxA

transRecAStruct.TXType = "P"

AvalbytesUpdate, err := json.Marshal(transRecAStruct)

if err != nil {

logger.Error("fail to marshal balance update info")

return shim.Error("Marshal Error")

}

err = stub.PutState(AddrA, AvalbytesUpdate)

if err != nil {

logger.Error("fail to store state: ", err.Error())

return shim.Error(err.Error())

}

transRecBStruct.Balance = newCipherBalanceB

transRecBStruct.TX = newCipherTxB

transRecBStruct.TXType = "R"

BvalbytesUpdate, err := json.Marshal(transRecBStruct)

if err != nil {

logger.Error("fail to marshal balance update info")

return shim.Error("Marshal Error")

}

err = stub.PutState(AddrB, BvalbytesUpdate)

if err != nil {

return shim.Error(err.Error())

}

return shim.Success([]byte("Success"))}

图4同态加密链代码

图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留给自身,用于证实买卖链上的买卖是属于谁的。

拿到天生的买卖以及相干的证实,就告竣了买卖天生这一步。下一步就要施行转账的验证证实,验证逻辑以下:

1. Nullifier NF.axxxxx1以及NF.axxxxx2是否正在Nullifiers列表中,也便是说,是否有被花过;

2. 验证NF.axxxxx1以及NF.axxxxx2是花样是否合法的破费说明,且对于应的commitment正在链上(Proof + Merkle tree root),这边有须要验证Merkle tree root正在 是无效的;

3. 验证input == output金额守恒,即:100 + 0 = 80+0+20;

4. 数字范围满意要求:100-20 >0 && 20 > 0

历程验证完了以来就投入最终一步。告竣验证还会做一些一致于买卖实质的潜伏,身份潜伏,买卖动作的潜伏,来损坏整体的这个转账买卖历程的安全性,席卷做一些混合电路的才略。混合买卖实质且加密,验证者并没有分解利用链上是哪个Commitment算作输入,只分解没有被花过,且正在链上。身份潜伏让其没法决定领受方是谁,买卖动作潜伏让其没法决定这个买卖是发归还是领受。基于安全性的保险,才华告竣整体验证历程。最终天生买卖,然后收款,整体转账历程就停止了。基于零学识证实的转账,被华为集成正在零学识证实利用接口中。集成的零学识证实架构也能用来开垦一些隐私之类的利用,完结区块链隐私损坏的束缚规划。

归纳

买卖隐私损坏这块的本领应该是较为多的,零学识证实本领并没有特定是一个最佳的挑选,正在安全范畴中还有良多诸宛如态,奇奥瓜分,没有经意传输,大概基于TEE硬件的一些隐私损坏才略,也许去做一些隐私损坏。不过零学识证实其优点也是很昭著,他日区块链的隐私损坏仍然任重而道远,若何完结加紧高效、可托的零学识证 明算法和若何完结恐怕抵当量子算计 的零学识证实算法,都是须要进一步束缚 的课题。基于线上咱们供给的一些根底的才略,假如专家感趣味,也许到以前的网址下载相映的代码示例。

本文地址:http://yz.ziyouea.com/p/46857.html
版权声明:本站文章来自网络,如有违规侵权请联系我们下架。