fabric示例合约 Private data

1.什么是私有数据?

一个通道网络中会有很多机构,有一些数据是只能属于其中的某一个或者某几个机构可见,或者可以操作的 这些数据就被称为私有数据,私有数据是被存在peer节点上的 peer上会有一个私有数据库来存储私有数据

在这里插入图片描述

上图为一个简化的通道网络,通道中有OGR1和ORG2两个机构 ORG1有peer0节点 ORG2有peer1节点,其中peer0节点是授权了可以使用私有数据的 peer1节点是未被授权的
注:私有数据同时也会保存在Channel State中,但是是以存储,key和value的hash来进行存储,是为了保证区块链数据的不可篡改性,而Private State中存储的是明文的私有数据。

2.什么情况下使用私有数据?

  • 当整个交易(或账本)必须对通道内成员的一组组织中保密时。
  • 当交易(或账本)必须在一组组织之间共享时,但当只有这些组织的子集应有权访问交易中的部分(或全部)数据时,请使用。此外,由于私有数据是点对点传播的,而不是通过块传播的,因此,当交易数据必须对CA节点保密时,请使用私有数据收集。

3.解释使用情景

考虑一个渠道上的五个组织,他们交易产品:
在这里插入图片描述

  • 一个农民在国外出售他的货物
  • 将货物运往国外的分销商
  • 托运人在双方之间移动货物
  • 从分销商处购买商品的批发商
  • 从托运人和批发商处购买货物的零售商
  • 分销商可能希望与农民和托运人进行私人交易,以便对批发商和零售商对交易条款保密(以免暴露他们收取的加价)
  • 分销商可能还希望与批发商建立单独的私人数据关系,因为它向他们收取的价格低于零售商
  • 批发商可能还希望与零售商和发件人建立私人数据关系

无需为每个关系定义许多小通道,而是可以定义多个私有数据收集 (PDC) 以在以下各项之间共享私有数据:

PDC1:分销商、农民和托运人
PDC2: 分销商和批发商
PDC3:批发商、零售商和发货人

使用此示例,分销商拥有的对等方将在其分类帐中拥有多个私有数据库,其中包括来自分销商,农民和发件人关系以及分销商和批发商关系的私有数据。

4.私有数据的使用

4.1.首先需要编写一个json格式的配置文件,用来定义一个私有数据集

集合定义由以下属性组成:

  • name:集合的名称。
  • policy:这个私有数据的分发策略,可以指定该私有数据集可以分发给那些机构
  • requiredPeerCount:这个私有数据并不能只在背书节点存在一份,而是这个私有数据需要被分发到多个节点上存储多份,如果只存储一份的话,存储私有数据的节点如果宕掉的话,就会造成这个私有数据集不可用,影响数据的可用性,如果此值设置为0的话,则表示这个分发不是必须的,通常不建议设置为0
  • maxPeerCount:出于数据冗余目的,每个认可对等方将尝试向其分发私有数据的其他对等方(跨授权组织)的最大数量。如果背书对等方在背书时间和提交时间之间变得不可用,则作为集合成员但在背书时尚未收到私有数据的其他对等方将能够从分发私有数据的对等方中提取私有数据。如果将此值设置为 ,则私有数据不会在背书时传播,从而强制在提交时对所有授权对等体上的背书对等方进行私有数据拉取。0
  • blockToLive:表示数据在私有数据库中应存在多长时间(以块为单位)。数据将存在于私有数据库上指定数量的块中,之后它将被清除,使这些数据从网络中过时,因此无法从链码中查询,并且无法提供给请求对等体。若要无限期保留私有数据,即从不清除私有数据,请将该属性设置为 0。
  • memberOnlyRead:值 为 表示对等方自动强制仅允许属于某个集合成员组织的客户端读取私有数据。如果来自非成员组织的客户端尝试执行执行读取私有数据密钥的链码函数,则链码调用将终止并显示错误。如果要在各个链码函数中对更精细的访问控制进行编码,请使用turn值。
  • memberOnlyWrite:值 为 表示对等方自动强制只允许属于某个集合成员组织的客户端从链代码写入私有数据。如果来自非成员组织的客户端尝试执行对私有数据密钥执行写入的链码函数,则链码调用将终止并显示错误。如果要在单个链码函数中对更精细的访问控制进行编码,请使用的值,例如,您可能希望来自非成员组织的某些客户端能够在某个集合中创建私有数据。truefalse
  • endorsementPolicy:用于指定一个背书策略,这个策略是独立于通道的 他只针对于私有数据集的背书策略。
    例:
    [
    {
    “name”: “collectionMarbles”,
    “policy”: “OR(‘Org1MSP.member’, ‘Org2MSP.member’)”,
    “requiredPeerCount”: 0,
    “maxPeerCount”: 3,
    “blockToLive”:1000000,
    “memberOnlyRead”: true,
    “memberOnlyWrite”: true
    },
    {
    “name”: “collectionMarblePrivateDetails”,
    “policy”: “OR(‘Org1MSP.member’)”,
    “requiredPeerCount”: 0,
    “maxPeerCount”: 3,
    “blockToLive”:3,
    “memberOnlyRead”: true,
    “memberOnlyWrite”:true,
    “endorsementPolicy”: {
    “signaturePolicy”: “OR(‘Org1MSP.member’)”
    }
    }
    ]
4.2.升级链码

peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name hyperledger-fabric-contract-java-demo --version 4.0** --collections-config …/chaincode/hyperledger-fabric-contract-java-demo/collections_config.json **–signature-policy “OR(‘Org1MSP.member’,‘Org2MSP.member’)” --package-id $NEW_CC_PACKAGE_ID --sequence 4 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
在升级链码的时候 在命令中加上–collections-config 私有数据集的json配置

5.测试是否可以访问到私有数据集

拉取代码:https://gitee.com/kernelHP/hyperledger-fabric-contract-java-demo/tree/master

5.1.更新链码

使用4.2的方法更新底层链码

5.2.创建私有数据集,编写合约操作方法,启动项目

进入项目中,可以看到他配置私有数据集的json
在这里插入图片描述

在这里插入图片描述

可以看到他们分别给自己的org建立了私有数据集,并只授权给了自己的本机构
在这里插入图片描述

①:此处传的值是自己json中定义的私有数据集的名字
②:可以从私有数据集中读取数据
创建和更新的时候传值也都一样,在此不一一举例
在这里插入图片描述

可以看到他指定了两份配置文件分别是org1和org2,网络配置文件也分为0rg1和0rg2
在这里插入图片描述

启动时可以指定启动哪个机构的客户端

5.3.测试私有数据集是否生效

在这里插入图片描述

使用org1启动后保存一下私有数据
在这里插入图片描述

使用org1查询私有数据,可以看到可以查询到
停掉刚才启动的org1的客户端,修改启动的配置已org2的客户端配置启动
在这里插入图片描述

可以看到当org2去查询私有数据的时候报错,查询不出了!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值