菜鸟系列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->设置->通用->关 ...
随机推荐
- 【Python之路】特别篇--组合搜索功能实现
组合搜索: 根据特定标签内容,返回符合的数据. 效果图: 设计规划: 一.数据库表划分: 1.方向表,(运维自动化,Python开发,..) 2.分类表,(Python,Java,C#,.) 3.多对 ...
- Java进阶知识16 Spring创建IOC容器的两种方式
1.直接得到 IOC 容器对象 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("app ...
- [Luogu] 魔法树
https://www.luogu.org/problemnew/show/P3833 树链剖分 + 线段树 为啥会RE?? 不解 #include <iostream> #include ...
- codeforces163D
Large Refrigerator CodeForces - 163D 给定一个长方体的体积V,求出这个长方体的最小表面积. 输入 第一行有一个整数t (1 ≤ t ≤ 500) — 测试数据的组数 ...
- Java 显示锁 之 队列同步器AQS(六)
1.简述 锁时用来控制多个线程访问共享资源的方式,一般情况下,一个锁能够防止多个线程同时访问共享资源.但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁. 在Java 5.0之前,在协调对共享对 ...
- LVS集群之DR模式
今天来讲LVS-DR模式集群实现负载均衡的搭建方法 环境 主机名 IP 系统 角色 dir DIP:192.168.199.9 VIP:192.168.199.8 rhel7.4 集群服务器 no ...
- @ConfigurationProperties实现配置注入到实体类
spring boot 使用@ConfigurationProperties 有时候有这样子的情景,我们想把配置文件的信息,读取并自动封装成实体类,这样子,我们在代码里面使用就轻松方便多了,这时候,我 ...
- Leetcode题目215.数组中的第K个最大元素(中等)
题目描述: 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...
- Leetcode题目155.最小栈(简单)
题目描述: 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中.pop() -- 删除栈顶的元素.top() -- 获取栈顶 ...
- 关于Date
1.java DateUtil工具包可将"Wed, 21 Dec 2022 14:20:00 GMT"格式的字符串专程Date类型: Date expiration = DateU ...