1、私有数据集概念
集合时两个元素的组合;
- 实际的私有数据:通过gossip协议点对点发送到仅授权查看该数据的组织对等节点上。数据存储在授权组织的对等节点的私有状态数据库中,可以从这些授权对等方上的链码进行访问。
- 该数据的哈希值:私有数据存储在ledger上的体现,即已经被认可、排序并写入每个通道上对等节点ledger副本中的数据。这个哈希值用于证明transaction、状态验证和审计目的。
2、带有私有数据的transaction流程
- 客户端应用程序向私有数据集授权的组织认可的节点提交提议请求调用链码函数(读或者写私有数据)。私有数据或者用于生成私有数据的数据在提议的transient部分。
- 认可的对等节点将私有数据存储在transient data store(节点上临时的存储地点)。授权的对等节点再根据私有数据集合的策略通过gossip协议分配到授权的节点上。
- 认可的节点返回提议响应到客户端,提议响应包括认可的读写集,包括了公有数据和私有数据键值对的哈希。没有私有数据被返回到客户端。
- 和之前的transaction流程一样,将提议响应提交到orderer上进行排序并打包成块,分发到通道上所有的节点上,不同在于节点对私有数据验证的时候只要通过私有数据的哈希进行机密的验证即可,不需要知道真正的私有数据。
- 在块提交阶段,私有数据集合授权的节点通过私有数据集合策略判断它们是否对私有数据有权限,如果有,它们会先查看本地transient data store来看看是否在认可阶段已经有了私有数据,如果没有就会从授权的其他节点处拉取私有数据,并和公有块中的hash值进行验证,最终提交到它们本地的复制的私有状态数据库。最后,私有数据会从transient data store中删除。
3、共享私有数据
关于共享和验证私有数据的两个层面:
- 只要满足认可策略,不一定要成为集合的成员才能写入集合中的键,可以在链码、键或集合级别定义认可策略。
- 从v1.4.2开始,有一个链码API GetPrivateDataHash()允许非成员对等点上的链码读取私有数据的哈希值,使得链码可以对照先前transaction中私有数据创建的链上哈希来验证私有数据。
4、私有数据共享模式
没有搞太清楚,似乎是强调key level的transaction访问控制和认可策略。总的来说transaction可以同时含有私有数据和公有数据,通过key来区分,在transaction整个工作流程中,需要验证私有数据或者认可私有数据都是通过其哈希值来进行的。