fabric里的marble私有数据访问案例
fabric里的marble案例,是一个关于弹珠私有数据的存储与访问的案例,弹珠的定义如下:
{“color”:“blue”,“docType”:“marble”,“name”:“marble1”,“owner”:“tom”,“size”:35}
{“docType”:“marblePrivateDetails”,“name”:“marble1”,“price”:99}
// 边侧数据库A,Org1、Org2的普通节点都可以访问
type marble struct {ObjectType string `json:"docType"`Name string `json:"name"`Color string `json:"color"`Size int `json:"size"`Owner string `json:"owner"`
}// 边侧数据库B,只有Org1里的普通节点可以访问
type marblePrivateDetails struct {ObjectType string `json:"docType"`Name string `json:"name"`Price int `json:"price"`
}
私有数据的特定权限,定义如下:
- name, color, size, and owner 通道中所有成员可见(Org1 and Org2)
- price 只有 Org1 的成员可见
- readMarble() 用于查询 name, color, size and owner 属性的值,即查询边侧数据库A的记录
- readMarblePrivateDetails() 用于查询 price 属性的值,即查询边侧数据库B的记录
边侧数据库,权限定义配置文件: collections_config.json
// collections_config.json
[{"name": "collectionMarbles", //边侧数据库A"policy": "OR('Org1MSP.member', 'Org2MSP.member')", //Org1、Org2都可以访问"requiredPeerCount": 0,"maxPeerCount": 3,"blockToLive":1000000, //私有数据自毁时间:100万个区块高度之后,只保留hash值"memberOnlyRead": true},{"name": "collectionMarblePrivateDetails", //边侧数据库B"policy": "OR('Org1MSP.member')", //只有Org1才可以访问"requiredPeerCount": 0,"maxPeerCount": 3,"blockToLive":3, //私有数据自毁时间:3个区块高度之后,只保留hash值"memberOnlyRead": true}
]
使用PutPrivateData()函数,将私有数据写入到边侧数据库A、B;使用GetPrivateData()函数,从边侧数据库A、B里读取私有数据。下面介绍,marble案例的使用方法。
1、清空原有fabric网络
## 关闭网络
cd fabric-samples/first-network
./byfn.sh down## 清空docker缓存数据
docker rm -f $(docker ps -a | awk '($2 ~ /dev-peer.*.marblesp.*/) {print $1}')
docker rmi -f $(docker images | awk '($1 ~ /dev-peer.*.marblesp.*/) {print $3}')
2、启动有couchDB的BYFN网络
./byfn.sh up -c mychannel -s couchdb
3、准备4个.sh脚本
BYFN是1order+4Peer网络架构,这4个Peer在一台主机上,它们共有一个cli容器,但4个Peer的环境是不同的,所以每次切换Peer时,环境变量也需要进行切换。
4个Peer: peer01、peer11、peer02、peer12
节点 | 脚本 | 含义 |
---|---|---|
peer0.org1 | mar_peer01.sh | org1的peer0节点环境变量脚本 |
peer1.org1 | mar_peer11.sh | org1的peer1节点环境变量脚本 |
peer0.org2 | mar_peer02.sh | org2的peer0节点环境变量脚本 |
peer1.org2 | mar_peer12.sh | org2的peer1节点环境变量脚本 |
mar_peer01.sh、mar_peer11.sh、mar_peer02.sh、mar_peer12.sh保存到fabric-samples/first-network/channel-artifacts目录下,如图(1)所示。
![](/assets/blank.gif)
图(1) 4个Peer的环境脚本
3.1 peer0.org1脚本
//mar_peer01.sh
#!/bin/bash
##peer01.shexport CORE_PEER_ADDRESS=peer0.org1.example.com:7051
export CORE_PEER_LOCALMSPID=Org1MSP
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
3.2 peer1.org1脚本
//mar_peer11.sh
#!/bin/bash
##peer11.shexport CORE_PEER_ADDRESS=peer1.org1.example.com:8051
export CORE_PEER_LOCALMSPID=Org1MSP
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
3.3 peer0.org2脚本
//mar_peer0.org2
#!/bin/bash
##peer02.shexport CORE_PEER_ADDRESS=peer0.org2.example.com:9051
export CORE_PEER_LOCALMSPID=Org2MSP
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
3.4 peer1.org2脚本
//mar_peer12.sh
#!/bin/bash
##peer12.shexport CORE_PEER_ADDRESS=peer1.org2.example.com:10051
export CORE_PEER_LOCALMSPID=Org2MSP
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
4、进入cli容器,并安装链码
4.1 进入cli容器
docker exec -it cli bash
4.2 安装链码
## 切换到peer01
source channel-artifacts/mar_peer01.sh
peer chaincode install -n marblesp -v 1.0 -p github.com/chaincode/marbles02_private/go/## 切换到peer11
source channel-artifacts/mar_peer11.sh
peer chaincode install -n marblesp -v 1.0 -p github.com/chaincode/marbles02_private/go/## 切换到peer02
source channel-artifacts/mar_peer02.sh
peer chaincode install -n marblesp -v 1.0 -p github.com/chaincode/marbles02_private/go/## 切换到peer12
source channel-artifacts/mar_peer12.sh
peer chaincode install -n marblesp -v 1.0 -p github.com/chaincode/marbles02_private/go/
5、初始化链码
在一个通道中,链码只需要初始化一次即可,这里选择在peer0.org1上初始化该链码
source channel-artifacts/mar_peer01.sh
export Mar_Conf=$GOPATH/src/github.com/chaincode/marbles02_private/collections_config.json
peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C mychannel -n marblesp -v 1.0 -c '{"Args":["init"]}' -P "OR('Org1MSP.member','Org2MSP.member')" --collections-config $Mar_Conf
6、保存私有化数据,并查看
6.1 保存数据
export MARBLE=$(echo -n "{\"name\":\"marble1\",\"color\":\"blue\",\"size\":35,\"owner\":\"tom\",\"price\":99}" | base64 | tr -d \\n)
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C mychannel -n marblesp -c '{"Args":["initMarble"]}' --transient "{\"marble\":\"$MARBLE\"}"
6.2 在peer0.org1里,查看数据
peer chaincode query -C mychannel -n marblesp -c '{"Args":["readMarble","marble1"]}'peer chaincode query -C mychannel -n marblesp -c '{"Args":["readMarblePrivateDetails","marble1"]}'
![](/assets/blank.gif)
图(2) Org1里的peer0查看数据
可以看到,Org1的节点peer0,可以访问边侧数据库A的name、color、size等数据,也可以访问边侧数据库B的price数据,即它遵循了文章开头的私有数据权限定义。
6.2 在peer0.org2里,查看数据
source channel-artifacts/mar_peer02.sh
peer chaincode query -C mychannel -n marblesp -c '{"Args":["readMarble","marble1"]}'peer chaincode query -C mychannel -n marblesp -c '{"Args":["readMarblePrivateDetails","marble1"]}'
![](/assets/blank.gif)
图(3) Org2里的peer0查看数据
可以看到,Org2的节点peer0,可以访问边侧数据库A的name、color、size等数据,但无法访问边侧数据库B的price数据,即它遵循了文章开头的私有数据权限定义。
7、更换marble的所属人
将marble1的所属人由tom改成Alice,即tom把资产marble1转交给Alice。
## 切换到peer01
source channel-artifacts/mar_peer01.sh
peer chaincode query -C mychannel -n marblesp -c '{"Args":["readMarble","marble1"]}'## 更换marble1资产的所属人
export MARBLE_OWNER=$(echo -n "{\"name\":\"marble1\",\"color\":\"red\",\"size\":35,\"owner\":\"Alice\",\"price\":99}" | base64 | tr -d \\n)
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C mychannel -n marblesp -c '{"Args":["transferMarble"]}' --transient "{\"marble_owner\":\"$MARBLE_OWNER\"}"
![](/assets/blank.gif)
图(4) 更换marble1的所属人
fabric里的marble私有数据访问案例相关推荐
- (Fabric 学习六)Fabric2.0 私有数据 使用marbles官方示例
私有数据 从v1.2开始,Fabric 提供了创建私有数据集合的功能,它允许在通道上定义的组织子集能够背书.提交或查询私有数据,而无需创建单独的通道. 产生的原因:一个通道上的一组组织需要对该通道上的 ...
- 深入挖掘Hyperledger Fabric中的私有数据
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载. 深入挖掘Hyperledger Fabric中的私有数据 私有数据是fabric中讨论最多的特性,在v1.2中发 ...
- Android怎么访问私有数据(5)
一,暴露私有的文件 1.有一个应用程序,带一个私有的文件,需求是暴露这个私有的文件. 2. 写ContentProvider的一个子类 3. 定义匹配规则 * 定义匹配器 UriMatche ...
- Hyperledger Fabric 私有数据(2)操作流程
1. 私有数据资产转移的案例 collections_config.json文件定义了3个私有数据集合定义:assetCollection.Org1MSPPrivateCollection和Org2M ...
- C++中访问类的私有数据成员的第三种方法
我们知道,C++的类是有封装性的,那么对于私有数据成员我们如果想在类外访问,一般而言无外乎这么两种方法: 1.通过公有的成员函数 2.通过友元 这是两种通常的做法,还有一种是比较"反常&qu ...
- Hyperledger Fabric 私有数据(3)交易流程
step1. 当客户端提交一个调用链码的功能(读或写私有数据)提案请求到具有该私有数据集合操作权限的背书节点,通过提案中的transient字段进行发送. step2. 背书节点模拟交易并将私有数据存 ...
- Hyperledger Fabric 私有数据(1)概念
1. 定义 允许通道内的指定的某一个组织中的部分成员可以对私有数据进行操作,而其他没有权限的节点只能知道有这么一笔交易发生而不能了解交易的细节. 1.1 什么时候需要 当所有的数据都需要在通道内的成员 ...
- SYS_数据访问权限Operation Unit和Ledger的访问设定(案例)
2014-06-01 Created By BaoXinjian 一.摘要 R12通过MOAC设定限制职责的Operation Unit的访问权限 在总账中,需要通过设定数据访问权限设定限定职责的Le ...
- Fabric中的私有数据
参考:官方文档 & 私有数据视频 代码参考:智能合约 为什么要使用私有数据? 使用私有数据为的是使数据分享给我们想要共享的组织.比如在我们在网上购物,同一个商品在不同活动时期的成交价格大部分是 ...
最新文章
- 数据库的垂直划分和水平划分
- android 时间戳转换成日期_Matlab将Unix时间戳转为可读日期
- 学习 Message(4): 通过 Application.OnMessage 或 TApplicationEvents 响应消息
- JS获取整个页面的文档
- 北京君正集成电路的Newton平台--穿戴式
- Monte Carlo仿真方法的基本思想及其特点
- 病症:arm启动后应用程序界面显示…
- Java黑皮书课后题第10章:*10.14(MyDate类)设计一个名为MyDate的类
- 开发pc页面_uniapp支持PC版真正的一统天下来了全端支持不是梦
- 论文浅尝 - ISWC2021 | 当知识图谱遇上零样本视觉问答
- Laravel-数据库队列
- dos2unix命令找不到_Linux系统中的dos2unix命令
- iostat命令简单使用
- winform程序的皮肤问题
- 浅谈御剑web指纹识别-CMS指纹识别
- 前端开发者的必备好书:CSS世界三部曲,你都知道吗?
- ps4手柄android ppsspp,求助,ppsspp模拟器能用ps4手柄吗
- C#翻译mobile-detect.js源码实现手机平台检测
- Unity中录制VR全景视频(可录制UGUI)
- php中的单引号和双引号
热门文章
- 跟着斯坦福白胡子老头学自定义UIView动画(附iOS10 Swift代码)
- 使用cmd打开Office Word、Excel、Powerpoint
- python语言编写一个生成九宫格图片的代码_python基础教程python简单实现9宫格图片实例...
- 2021原创计算机考研全程班辅导
- 浅析“一稿多投”的学术不端行为
- 已完美解决:小米手机报告Google屡次停止运行
- Linux下无法输入quot;\quot;和quot;|quot;的问题
- IT风云15年的那些人、那些事
- JS实现数字字母混合验证码(数字+大写字母+小写字母)
- oracle binary6,Oracle Binary Options 说明