现在生活中,大家为了隐私,并不希望直接将个人信息给别人看,比如我们去住酒店时,需要登记姓名、身份证号信息,但是如果我们直接把身份证给前台人员的话,前台人员就可以看到我们的民族、住址等信息。那么我们有什么办法呢?用户属性的选择性披露能够降低风险。

1、生成属性默克尔树

关于Merkle Tree默克尔树的介绍,​​可以参考这篇文件​​。默克尔树能够将一个区块中的所有交易形成一个哈希值,并将这个哈希值放到区块头,任何对交易的篡改都会导致哈希值变化。我们可以将用户的属性作为交易,计算所有属性的默克尔树,比如我们要对个人的属性构建默克尔树:



solidity Dapp 基于merkle的选择性披露合约——我的还是我的_字段


下边是合约初始化时,构建merkle树。



solidity Dapp 基于merkle的选择性披露合约——我的还是我的_区块链_02


2、生成proof

假如你现在要去网吧,网管要验证你的年龄大于18,你可以生成对应的proof(披露字段、merkleproof、披露字段index),其中只暴露年龄,其他身份属性不暴露,示例如下:



solidity Dapp 基于merkle的选择性披露合约——我的还是我的_初始化_03


proof的组成:

  • 哈希值路径,hash0,hash5
  • 实际的年龄,例如19;

下边是生成用户的proof;



solidity Dapp 基于merkle的选择性披露合约——我的还是我的_区块链_04


3、验证

网管在收到你提交的proof后,需要进行验证,主要包括以下步骤:

  1. 找到第三方的发布的权威合约,例如公安、民政等;
  2. 从合约里获取用户对应merkleroot;上图的蓝色部分;

3.使用披露字段(年龄)、字段序号index、MerkleProof、MerkleRoot等进行默克尔验证。

4.验证通过,显示可信的披露内容为true。

网管验证完成了你的年龄,但是并没有获得除了年龄之外的其他身份信息,从而实现了选择性披露。

总结

以上我们讲解了在用户身份中具有多个属性时,用户只选择性的暴露其中某个属性,