官方文档:点这里


1简介

同一个通道中,允许某一组织在对同一通道内其他组织保持部分的数据私有。也就是说有一部分被标识为私有的数据只能具有权限的组织查看和操作,而其余组织不具备查看和操作私有数据的权限。
通常如果需要保持数据私有可以另外创建一个通道只为私有数据服务,但是如果涉及到多个业务方时,为每一个组织另外创建通道会增加额外的管理类开销。并且也不能在进行私有数据操作的时候,让其余没有权限的组织节点都知道有这么一笔交易发生。
从Fabric 1.2开始,引入了一个私有数据集合的概念,它允许通道内的指定的某一个组织中的部分成员可以对私有数据进行操作,而其他没有权限的节点只能知道有这么一笔交易发生而不能了解交易的细节。

1.1私有数据集合


私有数据集合包括两个部分:

  1. 私有数据实体:通过Gossip协议在具有权限的节点之间传输,并且只有具有权限的节点可以看到。这部分私有数据存储在具有权限的节点的私有的状态数据库中。可以通过链码API在具有权限的节点上进行访问。并且私有数据不涉及排序服务,因为是通过Peer节点间的Gossip协议进行传输的。所以要求每一个节点都需要设置参数CORE_PEER_GOSSIP_EXTERNALENDPOINT,并在通道内设置锚节点用于跨组织通信。

  2. 私有数据的哈希值:这一部分数据用于背书,排序以及写账本到通道内的每一个Peer节点。哈希值作为交易的证明用于状态验证还可以用于审计。

1.2什么时候使用私有数据


  • 当所有的数据都需要在通道内的成员之间保密的时候,使用通道比较合适。
  • 当交易要在所有组织之间传播,并且要求只有通道内的部分组织成员可以查看或操作交易内的某一部分数据时,需要使用私有数据集合。并且部分数据需要对排序节点进行保密时,使用私有数据集合。

1.3私有数据的交易流程

1. 当客户端提交一个调用链码的功能(读或写私有数据)提案请求到具有该私有数据集合操作权限的背书节点时,私有数据或者是用于通过链码生成私有数据的数据时,通过提案中的`transient`字段进行发送。
2. 背书节点模拟交易并将私有数据存储到`peer`节点上的`transient data store`一个临时的数据存储区,并基于私有数据定义的策略,通过`Gossip`协议发送到其他具有权限的节点。
3. 背书节点将提案响应发送给客户端。提案响应包括已经背书的读写集。读写集包括公共数据和私有数据的哈希值。发送给客户端的不包括任何的私有数据。
4. 客户端应用提交交易(包括带有私有数据哈希值的提案响应)到排序节点。带有私有数据哈希值得交易将和正常交易一样包括在区块中。带有私有数据哈希值得区块分发到所有节点上。用这种方式,通道中所有的`peer`节点可以通过私有数据的哈希值对交易进行验证而不需要知道任何的私有数据信息。
5、 在区块提交时,具有权限的节点通过集合策略确定是否具有访问私有数据的权限。如果具有权限,他们将会检查本地的`transient data store`确定他们是否已经在进行链码背书的时候接收到私有数据。如果没有,将试图从其他具有权限的节点处拉取私有数据。他们将验证公共区块中私有数据的哈希值并提交交易。当验证与提交结束后,私有数据将移动到他们的私有数据库和私有读写副本中。最后从`transient data store`中删除私有数据。


fabric应用      fabric

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!