Fabric-私有数据介绍
设计概念理解
为什么要设计private data?
- 节省管理开销(链码版本维护、MSP)。我们都知道想要对某些组织比如组织A保持本组织的数据私有化,创建一个通道,且不将组织A加入通道中即可。可是如果这种简单情况复杂化的话,比如说,数据a部分只想对组织A公开,数据b部分只想对组织B公开,这就需要创建两个通道,然后安装、实例化、更新与维护链码,以及成员认证,提供成员关系服务等等活动接踵而至,管理开销并不小。因此,private data的设置中授权可以看到它的组织,然后私有数据会保存到这些组织的节点的私有数据库上(可被授权节点的链码访问,这里需要注意:链码其实是保存在--在通道中的节点上)。私有数据授权给其他组织的节点,利用的是Gossip协议,点对点传送,因此需要设置通道上各组织的锚节点。
- 保留部分数据私有。意思就是授权给某节点的私有数据中的数据记录的某些字段可以对已授权的节点隐藏不可见。
数据的存储是怎样的?
- 实际的私有数据保存在己方节点和授权节点的私有数据库上;
- 实际私有数据经过哈希处理的哈希值存放至账本(区块和数据库),hash值用于状态验证和审计(利用GetPrivateDataHash函数读取验证私有数据)。(被授权拿到私有数据的节点如果想共享该数据给其他方,其实还是一样的道理,也可以使用私有数据进行共享)
私有数据集合和通道两种方式的适用情况?
- 当必须将数据在隶属于通道成员的组织中保密时,使用通道比较合适,因为相当于说共享需求方不属于已有的通道内的组织,所以不知晓他的锚节点,就无法通信,因此必须需要创建新的通道。
- 当账本必须共享给通道内的一些组织,但是只有其中的部分组织可以在交易中使用这些数据的一部分或者全部时,使用集合比较合适。此外,由于私有数据是点对点传播的,所以在交易数据必须对排序服务节点保密时,应该使用私有数据集合。
使用介绍理解
在private_data文件夹下的collections_config.json(集合定义文件)中配置,参照官网的代码实例,我们简单讲解:
[
{
"name": "collectionMarbles",
"policy": "OR('Org1MSP.member', 'Org2MSP.member')", // org1和org2都可以存储私有数据
"requiredPeerCount": 0,
"maxPeerCount": 3,
"blockToLive":1000000,
"memberOnlyRead": true
},
{
"name": "collectionMarblePrivateDetails",
"policy": "OR('Org1MSP.member')", //org1的peer节点可以存储私有数据
"requiredPeerCount": 0,
"maxPeerCount": 3,
"blockToLive":3,
"memberOnlyRead": true
}
]
集合定义由以下几个属性组成:
- name: 私有数据集合的名称。
- policy: 定义了哪些组织中的 Peer 节点能够存储集合数据(也是一种分发策略)。
- requiredPeerCount: 私有数据要分发到的节点数,尽量不设为0(冗余存储,防止数据丢失)。
- maxPeerCount: 为了数据冗余,当前背书节点将尝试向其他节点分发数据的数量。如果当前背书节点发生故障,其他的冗余节点可以承担私有数据查询的任务。
- blockToLive: 对于非常敏感的信息,比如价格或者个人信息,这个值代表数据可以在私有数据库中保存的时间。数据会在私有数据库中保存指定个区块,之后就会被清除。如果要永久保留,将此值设置为 0 即可。
- memberOnlyRead: 设置为 true 时,节点会自动强制集合中定义的成员组织内的客户端对私有数据仅拥有只读权限。
- memberOnlyWrite: true 值表示 peer 节点自动强制仅属于集合成员组织之一的客户端允许从链码写入私有数据。
- endorsementPolicy: 一种可供选择的背书策略,用来覆盖链码级别背书策略的集合。
链码定义也包含私有数据集合的定义。
传递私有数据时使用 --transient 参数。作为瞬态的输入不会被记录到交易中,以此来保证数据的隐私性。瞬态数据会以二进制的方式被传输,所以在 CLI 中使用时,必须使用 base64 编码(序列化与反序列化)。
补充理解
1、私有化数据(键值对)存储在peer节点的私密数据库(private data),存储在CouchDB中的是其经过哈希处理后的键值对。
2、gossip协议下的锚节点是否被正确配置影响到私有数据集能否正常工作。锚节点用来通信,背书节点用来背书和分发数据给授权组织,其他节点可以作为数据备份,冗余存储(这有个疑问,是同组织的其他背书节点还是普通节点?)。
以上就是本次分享的全部内容,各位看官有什么疑问,或者觉得本文有什么错误的地方,欢迎在评论区留言讨论!