菜鸟系列Fabric——Fabric 私密数据(6)
Fabric 私密数据
1.私密数据的定义
如果某个渠道上的一组组织需要将数据与该渠道上的其他组织保密,他们可以选择创建一个仅包含需要访问数据的组织的新渠道。但是,在每种情况下创建单独的通道会产生额外的管理开销(维护链代码版本,策略,MSP等)。
超级账本 Fabric 引入了 sideDB 机制,通过 Hash 处理和私有数据结构,在通道内部实现了更细粒度的隐私保护。Hash 后的交易内容仍然会发送到排序节点,并提交到公共的数据库和账本结构中。而授权组的 Peer 节点则在本地维护私有的状态数据库和区块链结构,保存交易的明文内容。这就保证了通道内其他节点无法看到授权组的交易内容。
私密数据分为两部分:
- 一个是真正的key,value,它被存在 peer的私密数据库(private state)中。
- 另一部分为公共数据,它是真实的私密数据key,value 哈希后的值 hash(key),hash(value),它被存在普通的peer数据库中(state),orderer端可以拿到该值。没有被分配私密数据权限的peer,也仅仅可以存储hash后的key和value。
2.私有数据在fabric中的交易流程
- SDK将交易发送给背书节点,该背书节点需要通过policy(此处的policy为instantiation设定的)验证。
- 背书节点模拟执行交易,并将真实的私密数据 key和value存储于瞬时数据库(private transient DB)中。基于collection policy,验证通过的peer节点,通过gossip同步真实的私密数据,并将其存储于瞬时数据库中。背书节点将模拟执行后的结果返回给SDK,返回的数据中仅有公共数据(hash过的私密数据)。
- SDK将peer返回的结果打包后发送给orderer,和普通的区块一样,orderer切块后,将其分发给peer,此时所有的peer都拿到了公共数据,所有的peer都可以去验证私有数据,没有通过collection policy的peer,也可以验证,而且还不拥有真实的私密数据,保证了数据的私密性。
- 在commit之前,peer首先去判断自己是否通过collection policy的检查,若通过,将去检查自己的瞬时数据库中是否有真实的私密数据,如果没有,将尝试从别的peer处拉取数据。
- 取到私密数据后,首先去和公共数据的hash去做比对,若一致,此时进行commit操作,将私密数据的HASH写入到公共数据库中。提交该交易和这个区块到账本中,成功提交后,私密数据将会从瞬时数据库拷贝到私密数据库中,并从瞬时数据库中删除。此时整个交易流程结束,数据成功写入到账本内。
3.私密数据使用案例
- 构建集合定义JSON文件
将通道上的数据私有化的第一步是构建一个集合定义,用于定义对私有数据的访问。
name:集合的名称。
policy:定义允许持久保存集合数据的组织peer节点。
requiredPeerCount:传播私有数据所需的对等数量,作为认可链代码的条件
maxPeerCount:出于数据冗余目的,当前认可peer节点将尝试将数据分发到的其他peer的数量。
blockToLive:此值表示数据应以块为单位存储在私有数据库中的时间。数据将在专用数据库上为指定数量的块生效,之后将被清除,从而使这些数据从网络中过时。要无限期地保留私有数据,即永远不要清除私有数据,请将blockToLive属性设置为0。
memberOnlyRead:值true表示peer自动强制只允许属于其中一个集合成员组织的客户端对私有数据进行读取访问。
样例
[
{
"name": "collectionMarbles",
"policy": "OR('Org1MSP.member', 'Org2MSP.member')",
"requiredPeerCount": 0,
"maxPeerCount": 3,
"blockToLive":1000000,
"memberOnlyRead": true
},
{
"name": "collectionMarblePrivateDetails",
"policy": "OR('Org1MSP.member')",
"requiredPeerCount": 0,
"maxPeerCount": 3,
"blockToLive":3,
"memberOnlyRead": true
}
]
- 使用链代码API读取和写入私有数据
// Peers in Org1 and Org2 will have this private data in a side database
type marble struct {
ObjectType string `json:"docType"`
Name string `json:"name"`
Color string `json:"color"`
Size int `json:"size"`
Owner string `json:"owner"`
}
// Only peers in Org1 will have this private data in a side database
type marblePrivateDetails struct {
ObjectType string `json:"docType"`
Name string `json:"name"`
Price int `json:"price"`
}
具体访问私人数据将受到如下限制:
name, color, size, and owner 将对渠道的所有成员(Org1和Org2)可见
price 仅对Org1的成员可见
stub.PutPrivateData("collectionMarbles", colorNameIndexKey, value)
valAsbytes, err := stub.GetPrivateData("collectionMarbles", name) //get the marble from chaincode state
- 启动网络
./byfn.sh up -c mychannel -s couchdb
- 安装链码
peer chaincode install -n marblesp -v 1.0 -p github.com/chaincode/marbles02_private/go/
- 实例化里面
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
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 $GOPATH/src/github.com/chaincode/marbles02_private/collections_config.json
- 调用链码
保存私密数据:不同组织节点能查看的数据不同,根据集合策略
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 /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n marblesp -c '{"Args":["initMarble"]}' --transient "{\"marble\":\"$MARBLE\"}"
peer chaincode query -C mychannel -n marblesp -c '{"Args":["readMarble","marble1"]}'
菜鸟系列Fabric——Fabric 私密数据(6)的更多相关文章
- fabric私密数据学习笔记
fabric私密数据学习笔记 私密数据分为两部分 一个是真正的key,value,它被存在 peer的私密数据库(private state)中. 另一部分为公共数据,它是真实的私密数据key,val ...
- JavaScript-cookie是客户端本地,持久存储用户私密数据的文件
navigator:封装浏览器配置信息的对象 cookieEnabled:判断浏览器是否启用cookie cookie是什么:cookie是客户端本地,持久存储用户私密数据的文件 plugins:包含 ...
- 菜鸟系列Fabric源码学习 — peer节点启动
Fabric 1.4 源码分析peer节点启动 peer模块采用cobra库来实现cli命令. Cobra提供简单的接口来创建强大的现代化CLI接口,比如git与go工具.Cobra同时也是一个程序, ...
- 菜鸟系列Fabric源码学习 — committer记账节点
Fabric 1.4 源码分析 committer记账节点 本文档主要介绍committer记账节点如何初始化的以及committer记账节点的功能及其实现. 1. 简介 记账节点负责验证交易和提交账 ...
- 菜鸟系列Fabric源码学习 — MVCC验证
Fabric 1.4 源码分析 MVCC验证 读本节文档之前建议先查看[Fabric 1.4 源码分析 committer记账节点]章节. 1. MVCC简介 Multi-Version Concur ...
- 在 Fabric 中使用私有数据
本教程将演示收集器(collection)的使用,收集器为区块链网络上已授权的组织节点 提供私有数据的存储和检索. 本教程假设您已了解私有数据的存储和他们的用例.更多的信息请参阅 私有数据 . 本教程 ...
- 升级iOS8系统后,保险箱Pro、私人保险箱、私密相冊打开就闪退的官方解决方式
升级iOS8系统后,保险箱Pro.私人保险箱.私密相冊打开就闪退的官方解决方式 写在前面的话: 1. 本文适用条件 适用于:您的保险箱Pro.私人保险箱.私密相冊在iPhone或iPad ...
- [转]自建Syncthing中继服务器(私密传输或造福大众)
自建Syncthing中继服务器(私密传输或造福大众) 一.介绍 我之前介绍了Syncthing,作为一款开源的文件同步程序,它的功能还是非常强大的,我也很高兴能看到它被越来越多的人知道和使用,前几天 ...
- 升级iOS8和iOS9系统后,保险箱Pro、私人保险箱、私密相冊打开就闪退的官方解决方式
升级iOS8和iOS9.iOS10系统后,保险箱Pro.私人保险箱.私密相冊打开就闪退的官方解决方式 查看设备iOS操作系统版本号号办法:iPhone/iPad->设置->通用->关 ...
随机推荐
- 【Android】查看内存
[文章来源]http://blog.csdn.net/hudashi/article/details/7050897 查看内存使用的方式有很多种,但是各个方式查看到的结果可能会有微略不同. 方式一 ...
- elasticsearch集群部署以及head插件安装
环境准备 elasticsearch是Java程序写的因此必须装jdk,否则使用不了. [root@openstack ~]# java -versionopenjdk version "1 ...
- 利用Apache shiro SimpleHash 加密字符串
1.导入包 import org.apache.shiro.crypto.hash.SimpleHash; 1 2.代码 import org.apache.shiro.crypto.hash.Sim ...
- iptables 有关计算机名解析问题
遇到一奇怪现象: 1.开启防火墙(iptables)所有的用计算机名解析的连接全部是失效,但是用IP的一切正常.ping计算机名不通.但是ping IP地址一切OK: 2.关闭防火墙(iptables ...
- 去除ZERO WIDTH SPACE 零宽字符: 看不见却占位置的字符
ZERO WIDTH SPACE 由于历史原因,编码方案中保留着该类编码 解决方案 1. 替换 ```js str.replace(/[\u200B-\u200D\uFEFF]/g, ''); ``` ...
- django 快速搭建blog(三)
http://www.cnblogs.com/fnng/p/3737964.html 引用自此博客 创建blog的公共部分 从Django的角度看, 一个页面 具有三个典型的组件: 一个模板(temp ...
- 在Linux下使用rm -rf /*后会怎样?
每个工作过的码农,也许不知道分布式,也许不知道高并发,但想必都知道这句鼎鼎大名的代码.本人对此也是比较好奇的,不妨用虚拟机试试看 首先是普通角色: 普通角色把拥有权限的文件全都删掉了后,其他文件的提示 ...
- 我现在A函数开启事务,然后调用B函数,B函数中也开启了事务
有一点要知道,就是MYSQL不支持事务嵌套.所以PHP再包装,也是一个事务 laravel的事务嵌套,就是一个栈.事务A开启事务(真实开启)事务B开启事务(只是标记,并非真实开启了事务)事务B提交事务 ...
- ThinkPHP空操作与命名空间
命名空间:相当于一个虚拟的目录 正常管理文件使用文件夹--物理区分 TP框架的初始命名空间是:ThinkPHP\Library 在TP框架下命名空间里面使用\代表的是初始命名空间(ThinkPHP\L ...
- ios 报错记录
1. 运行xcode 报错:unterminated conditional directive #ifdef 缺少对应的#endif 在结尾加上就好了 2.iOS添加非(c,c++)文件引发的&qu ...