从之前学习的内容知道,fabric 不止提供了 channel 间的隐私保护,还提供了 channel 内的隐私保护,叫做 private data collection,可以在 channel 内创建私密通道,只有私密通道的成员才能修改和查看具体的私密数据,可以说是进一步扩展了 fabric 的使用场景。
What is a private data collection?
包含下面两个方面:
- 实际的私密数据。通过组织节点间的 gossip 协议来传输,保存在节点的私有数据库内(SideDB),ordering service 看不到私密的数据。如果想使用 gossip,那么组织之间必须建立 anchor peer(锚节点)。
- 私密数据的哈希。哈希数据会被背书、排序并写入到每个(注意是每个)节点的账本里,用来证明数据的有效性,便于以后的查账。
看下面这张图:
注意其中的 private state 和 hash。
Transaction flow with private data
看下涉及到私密数据的交易流程,与常规的有些不同:
- 应用创建交易的提议,有关的私密数据或者生成私密数据的数据放到提议的 transient 域内,并将提议传给背书节点。
- 背书节点模拟执行智能合约,然后将产生的私密数据存放到节点本地的 transient data store 内(临时的),然后根据 collection 规则,将私密数据通过 gossip 传递给其他被授权的节点。
- 背书节点将提议的结果中的公开数据和私密数据的哈希发回给应用,这里面没有私密数据。
- 像往常一样,应用将交易提交给 ordering service,然后 ordering service 将区块发给所有节点。
- 所有节点接收到区块之后,先验证下自己时候有权利获得私密数据,如果有的话,需要先检查下自己的 transient data store 中是否已经接收到背书阶段的私密数据,如果没有的话就尝试从其他节点获取数据,然后验证下数据的哈希值是否和区块中的一致,然后才将私密数据真正写入到自己的数据库内,并删除 transient data store 中的数据。
Purging data
在有些场景可能想清理掉节点的私密数据,fabric 将来也会提供这种功能。