Fabric v1.x 私有数据(PrivateData)交易流程及代码分析

一、私有数据机制介绍

对于一些组织来说,总会有一些机密数据,比如产品价格、用户电话、用户地址等信息,这些数据可能希望只被某几个组织知道,或者仅仅自己知道。可以将这些机密数据存储到私有数据库中,然后通过私有数据收集策略来定义有哪些peer有权获得这些私有数据,这些授权peer同样是将这些数据存储到私有数据库里,对于ordering来说,也只能看到私有数据的哈希。
另外私有数据同样是通过Gossip协议在peer间传输的。

二、私有数据的交易流程

之前一篇文章中的交易流程章节分析了普通交易的详细流程。私有数据的交易流程与之相比有些许不同,具体流程如下:

  1. 首先由client请求关于私有数据的交易提案;
  2. 然后背书节点仿真执行交易,并把私有数据存储到一个临时数据库里;
  3. 背书节点同时将这些私有数据通过gossip协议传播给其他有权限的记账节点,这些记账节点同样将私有数据存储到临时数据库里;
  4. 传播到指定的数量后背书节点将结果进行签名,返回给client端的数据不包含私有数据,只会返回签名和私有数据key和value的哈希值;
  5. client将提案的响应发送给ordering后,ordering无法看到私有数据的内容,只能看到一串哈希值;
  6. 然后ordering将交易区块传输给记账节点,记账节点会进行一些验证,除了验证背书策略,还要验证ordering发送的哈希值与本地临时数据库里保存的私有数据是否匹配,如果验证成功,记账节点就会将临时数据库中的数据正式存储到私有数据库里;
  7. 记账节点存储完成后会通知客户端记账的情况。

根据上述的步骤整理出交易流程图:
在这里插入图片描述

三、私有数据集合配置

在chaincode实例化的时候需要指定私有数据收集策略,另外还需要在配置文件中指定名称、收集策略、传播的节点数量、私有数据保存时间等选项,具体实例如下所示:

[
    {
        "name": "collectionMarbles",
        "policy": "OR('Org1MSP.member', 'Org2MSP.member')", // Org1和Org2都有权限访问
        "requiredPeerCount": 0, // Endorsing peer返回执行结果前必须传播给Committing peer的节点最小数量
        "maxPeerCount": 3,    // 最多要传播的节点数量
        "blockToLive":1000000,    // 私有数据需要在DB里保存的时间,超过这个期限私有数据会自动销毁
        "memberOnlyRead": true    // 只有策略定义的member可以访问
    },
    {
        "name": "collectionMarblePrivateDetails",
        "policy": "OR('Org1MSP.member')",    // 只有Org1可以访问
        "requiredPeerCount": 0,
        "maxPeerCount": 3,
        "blockToLive":3,
        "memberOnlyRead": true
    }
]

四、私有数据存储的代码分析

下面是私有数据保存的代码实现,第一段代码使用“collectionMarbles”配置来存储私有数据,包括Name、Color、Size、Owner这些隐私级别较低的数据,根据上面的配置可知,组织Org1MSP和Org2MSP的成员都可以访问这些数据,具体代码如下所示:

// ==== Create marble object, marshal to JSON, and save to state ====
marble := &marble{
    ObjectType: "marble",
    Name: marbleInput.Name,
    Color: marbleInput.Color,
    Size: marbleInput.Size,
    Owner: marbleInput.Owner,
}
marbleJSONasBytes, err := json.Marshal(marble)
// === Save marble to state ===
err = stub.PutPrivateData("collectionMarbles", marbleInput.Name, marbleJSONasBytes)

第二段代码使用“collectionMarblePrivateDetails”配置存储私有数据,包括price这种隐私级别较高的数据,根据上面的配置可知,只有Org1MSP的成员可以访问,具体代码如下所示:

// ==== Create marble private details object with price, marshal to JSON, and save to state ====
marblePrivateDetails := &marblePrivateDetails{
    ObjectType: "marblePrivateDetails",
    Name: marbleInput.Name,
    Price: marbleInput.Price,
}
marblePrivateDetailsBytes, err := json.Marshal(marblePrivateDetails)
err = stub.PutPrivateData("collectionMarblePrivateDetails", marbleInput.Name, marblePrivateDetailsBytes)

最终org1和org2的peer成员都会存储marble对象,而marblePrivateDetails对象只会存储到org1的peer节点中,两个组织的存储图如下所示:
在这里插入图片描述
在这里插入图片描述

发布了32 篇原创文章 · 获赞 3 · 访问量 6028

猜你喜欢

转载自blog.csdn.net/ice_fire_x/article/details/104362297
今日推荐