一个通道网络中会有很多机构,有一些数据是只能属于其中的某一个或者某几个机构可见,或者可以 *** 作的 这些数据就被称为私有数据,私有数据是被存在peer节点上的 peer上会有一个私有数据库来存储私有数据
上图为一个简化的通道网络,通道中有OGR1和ORG2两个机构 ORG1有peer0节点 ORG2有peer1节点,其中peer0节点是授权了可以使用私有数据的 peer1节点是未被授权的
注:私有数据同时也会保存在Channel State中,但是是以存储,key和value的hash来进行存储,是为了保证区块链数据的不可篡改性,而Private State中存储的是明文的私有数据。
考虑一个渠道上的五个组织,他们交易产品:
无需为每个关系定义许多小通道,而是可以定义多个私有数据收集 (PDC) 以在以下各项之间共享私有数据:
PDC1:分销商、农民和托运人
PDC2: 分销商和批发商
PDC3:批发商、零售商和发货人
使用此示例,分销商拥有的对等方将在其分类帐中拥有多个私有数据库,其中包括来自分销商,农民和发件人关系以及分销商和批发商关系的私有数据。
4.私有数据的使用 4.1.首先需要编写一个json格式的配置文件,用来定义一个私有数据集集合定义由以下属性组成:
name:集合的名称。policy:这个私有数据的分发策略,可以指定该私有数据集可以分发给那些机构requiredPeerCount:这个私有数据并不能只在背书节点存在一份,而是这个私有数据需要被分发到多个节点上存储多份,如果只存储一份的话,存储私有数据的节点如果宕掉的话,就会造成这个私有数据集不可用,影响数据的可用性,如果此值设置为0的话,则表示这个分发不是必须的,通常不建议设置为0maxPeerCount:出于数据冗余目的,每个认可对等方将尝试向其分发私有数据的其他对等方(跨授权组织)的最大数量。如果背书对等方在背书时间和提交时间之间变得不可用,则作为集合成员但在背书时尚未收到私有数据的其他对等方将能够从分发私有数据的对等方中提取私有数据。如果将此值设置为 ,则私有数据不会在背书时传播,从而强制在提交时对所有授权对等体上的背书对等方进行私有数据拉取。0blockToLive:表示数据在私有数据库中应存在多长时间(以块为单位)。数据将存在于私有数据库上指定数量的块中,之后它将被清除,使这些数据从网络中过时,因此无法从链码中查询,并且无法提供给请求对等体。若要无限期保留私有数据,即从不清除私有数据,请将该属性设置为 0。memberOnlyRead:值 为 表示对等方自动强制仅允许属于某个集合成员组织的客户端读取私有数据。如果来自非成员组织的客户端尝试执行执行读取私有数据密钥的链码函数,则链码调用将终止并显示错误。如果要在各个链码函数中对更精细的访问控制进行编码,请使用turn值。memberOnlyWrite:值 为 表示对等方自动强制只允许属于某个集合成员组织的客户端从链代码写入私有数据。如果来自非成员组织的客户端尝试执行对私有数据密钥执行写入的链码函数,则链码调用将终止并显示错误。如果要在单个链码函数中对更精细的访问控制进行编码,请使用的值,例如,您可能希望来自非成员组织的某些客户端能够在某个集合中创建私有数据。truefalseendorsementPolicy:用于指定一个背书策略,这个策略是独立于通道的 他只针对于私有数据集的背书策略。例:
[
{
“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配置
拉取代码: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条)