【Hyperledger Fabric 学习】私有数据(Key Concepts: Private data)

HyperLedger Fabric官方文档

中文网址:https://hyperledger-fabric.readthedocs.io/zh_CN/latest
英文网址:https://hyperledger-fabric.readthedocs.io/en/latest
一般情况英文网址的内容更全面,版本也比中文新。

Private data

定义

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

私有数据集

私有数据集的两个方面:

  1. 实际的私有数据,通过嗅探协议点对点发送给有权看到它的组织。这些数据存储在授权组织Peer上的私有状态数据库中,可以从这些授权Peer上的链码访问。这里不涉及订购服务,也不查看私有数据。注意,由于嗅探协议在经过授权的组织之间点对点分发私有数据,因此需要在通道上设置锚点,并在每个Peer上配置CORE_PEER_GOSSIP_EXTERNALENDPOINT,以便引导跨组织通信。
  2. 该数据的散列,经过背书、排序并写入信道上每个Peer的账本。该散列可作为事务的证据,用于状态验证,并可用于审计目的。

下图说明了授权拥有私有数据的授权Peer端和未授权Peer端的账本内容。
私有数据集

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

  • 当整个交易(和账本)必须在属于通道成员的一组组织中保密时,使用通道。
  • 当交易(和账本)必须在一组组织之间共享,但只有这些组织的一个子集应该能够访问事务中的部分(或全部)数据时,使用集合。此外,由于私有数据是通过Peer传播而不是通过块传播的,所以当交易数据必须对排序服务节点保密时,使用私有数据收集。

用例
在这里插入图片描述
其中Distributor记录的账本如下:
在这里插入图片描述
私有数据交易流
transaction flow

  1. 客户端应用程序向目标Peer提交一个提议请求来调用一个chaincode函数(读取或写入私有数据),目标Peer代替客户端管理事务提交。客户端应用程序指定哪些组织要对提议请求进行背书,也可以将背书者选择逻辑委托给目标Peer中的网关服务。在后一种情况下,网关将尝试选择一组背书对等点,这些Peer是受链码影响的集合的授权组织的一部分。私有数据,或者在链码中用于生成私有数据的数据,在提议中的transient字段中发送。
  2. 授权Peer模拟事务并将私有数据存储在临时数据存储(对等点本地的临时存储)中。它们根据收集策略,通过八卦将私人数据分发给授权的对等点。
  3. 背书Peer将提议响应发送回目标Target。提议响应包括已批准的读/写集,其中包括公共数据,以及任何私有数据键和值的散列。没有私有数据被发送回目标对等点或客户端。
  4. 目标Peer在将背书组装为事务之前验证提议响应是否相同,然后将事务发送回客户端进行签名。目标Peer向排序服务“广播”事务(包括带有私有数据散列的提议响应)。使用私有数据散列的交易照常包含在块中。带有私有数据散列的块被分发给所有的Peer。通过这种方式,通道上的所有Peer都可以以一致的方式使用私有数据的散列来验证事务,而不需要知道实际的私有数据。
  5. 在块提交时,已授权的Peer使用集合策略来确定它们是否被授权访问私有数据。如果他们这样做了,他们将首先检查他们的本地transient data store,以确定他们是否已经在链码背书时收到了私有数据。如果没有,他们将试图从另一个授权的Peer提取私人数据。然后,他们将根据公共块中的哈希值验证私有数据,并提交事务和块。在验证/提交之后,私有数据被移动到私有状态数据库和私有写集存储的副本中。然后从transient data store中删除私有数据。

共享私有数据
在许多场景中,一个集合中的私有数据键/值可能需要与其他通道成员或其他私有数据集合共享,例如,当您需要与原始私有数据集合中不包括的通道成员或通道成员组处理私有数据时。作为事务的一部分,接收方通常希望根据链上散列来验证私有数据。
私有数据收集可以从以下几个方面实现私有数据的共享和验证:
首先,您不必是集合的成员才能写入集合中的密钥,只要满足背书策略即可。背书策略可以在链码级、密钥级(使用基于状态的背书)或集合级(从Fabric v2.0开始)定义。
第二,从v1.4.2开始,有一个链码API GetPrivateDataHash(),它允许非成员对等体上的链码读取私钥的哈希值。这是一个重要的特性,稍后你会看到,因为它允许链代码根据链上哈希值来验证私有数据,这些哈希值是由之前的交易中的私有数据创建的。
在设计应用程序和相关的私有数据集合时,应该考虑这种共享和验证私有数据的能力。虽然您当然可以创建一组多边私有数据集合来在各种通道成员组合之间共享数据,但这种方法可能会导致需要定义大量集合。或者,考虑使用少量的私有数据集合(例如,每个组织一个集合,或每个组织对一个集合),然后根据需要与其他通道成员或其他集合共享私有数据。从Fabric v2.0开始,任何链代码都可以使用隐式组织特定集合,因此在部署链代码时甚至不需要定义这些每个组织的集合。

私有数据共享模式

  • 使用对应的公钥跟踪公共状态
  • 链码访问控制
  • 在带外共享私有数据
  • 与其他集合共享私有数据
  • 将私有数据传输给其他集合
  • 使用私人数据进行交易审批
  • 保持交易人私有

结合上面的模式,值得注意的是,带有私有数据的事务可以绑定到与常规通道状态数据相同的条件,具体来说:

扫描二维码关注公众号,回复: 14624460 查看本文章
  • 键级交易访问控制——可以在私有数据值中包含所有权凭证,以便后续交易可以验证提交者是否拥有共享或传输数据的所有权特权。在这种情况下,链码将获得提交者的凭证(例如使用GetCreator()链码API或CID库API GetID()或GetMSPID()),结合它与其他私有数据,传递给链码,哈希它,并使用GetPrivateDataHash()来验证它匹配链上哈希之前继续进行交易。
  • 键级背书策略——同样,与普通通道状态数据一样,您可以使用基于状态的担保来指定哪些组织必须支持共享或传输私有数据的交易,使用SetPrivateDataValidationParameter() chaincode API,例如指定只有所有者的组织对等体、托管人的组织对等体或其他第三方必须支持此类交易。

定义私有数据集实操

猜你喜欢

转载自blog.csdn.net/qq_39681297/article/details/125986515
今日推荐