中文网址:https://hyperledger-fabric.readthedocs.io/zh_CN/latest
英文网址:https://hyperledger-fabric.readthedocs.io/en/latest
一般情况英文网址的内容更全面,版本也比中文新。
定义
如果通道上的一组组织需要对该通道上的其他组织保密数据,那么它们可以选择创建一个只包含需要访问数据的组织的新通道。然而,在这些情况下创建单独的通道会产生额外的管理开销(维护链码版本、策略、MSPs等),并且不允许在希望所有通道参与者都看到事务的同时保持部分数据私有的用例。
这就是为什么Fabric提供了创建私有数据集合的能力,它允许通道上定义的组织子集能够认可、提交或查询私有数据,而不需要创建单独的通道。
私有数据集合可以在chaincode定义中显式定义。此外,每个chaincode都有一个隐式的私有数据名称空间,保留给特定于组织的私有数据。这些隐式的特定于组织的私有数据集合可以用于存储单个组织的私有数据,如果您想存储与单个组织相关的私有数据,例如关于组织拥有的资产的详细信息,或组织对链代码中实现的多方业务流程中的某个步骤的批准,这将非常有用。
私有数据集
私有数据集的两个方面:
下图说明了授权拥有私有数据的授权Peer端和未授权Peer端的账本内容。

在通道中使用私有数据集 vs 使用一个独立通道
用例

其中Distributor记录的账本如下:

私有数据交易流
transaction flow
transient字段中发送。transient data store,以确定他们是否已经在链码背书时收到了私有数据。如果没有,他们将试图从另一个授权的Peer提取私人数据。然后,他们将根据公共块中的哈希值验证私有数据,并提交事务和块。在验证/提交之后,私有数据被移动到私有状态数据库和私有写集存储的副本中。然后从transient data store中删除私有数据。共享私有数据
在许多场景中,一个集合中的私有数据键/值可能需要与其他通道成员或其他私有数据集合共享,例如,当您需要与原始私有数据集合中不包括的通道成员或通道成员组处理私有数据时。作为事务的一部分,接收方通常希望根据链上散列来验证私有数据。
私有数据收集可以从以下几个方面实现私有数据的共享和验证:
首先,您不必是集合的成员才能写入集合中的密钥,只要满足背书策略即可。背书策略可以在链码级、密钥级(使用基于状态的背书)或集合级(从Fabric v2.0开始)定义。
第二,从v1.4.2开始,有一个链码API GetPrivateDataHash(),它允许非成员对等体上的链码读取私钥的哈希值。这是一个重要的特性,稍后你会看到,因为它允许链代码根据链上哈希值来验证私有数据,这些哈希值是由之前的交易中的私有数据创建的。
在设计应用程序和相关的私有数据集合时,应该考虑这种共享和验证私有数据的能力。虽然您当然可以创建一组多边私有数据集合来在各种通道成员组合之间共享数据,但这种方法可能会导致需要定义大量集合。或者,考虑使用少量的私有数据集合(例如,每个组织一个集合,或每个组织对一个集合),然后根据需要与其他通道成员或其他集合共享私有数据。从Fabric v2.0开始,任何链代码都可以使用隐式组织特定集合,因此在部署链代码时甚至不需要定义这些每个组织的集合。
私有数据共享模式
结合上面的模式,值得注意的是,带有私有数据的事务可以绑定到与常规通道状态数据相同的条件,具体来说: