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中的交易流程

  1. SDK将交易发送给背书节点,该背书节点需要通过policy(此处的policy为instantiation设定的)验证。
  2. 背书节点模拟执行交易,并将真实的私密数据 key和value存储于瞬时数据库(private transient DB)中。基于collection policy,验证通过的peer节点,通过gossip同步真实的私密数据,并将其存储于瞬时数据库中。背书节点将模拟执行后的结果返回给SDK,返回的数据中仅有公共数据(hash过的私密数据)。
  3. SDK将peer返回的结果打包后发送给orderer,和普通的区块一样,orderer切块后,将其分发给peer,此时所有的peer都拿到了公共数据,所有的peer都可以去验证私有数据,没有通过collection policy的peer,也可以验证,而且还不拥有真实的私密数据,保证了数据的私密性。
  4. 在commit之前,peer首先去判断自己是否通过collection policy的检查,若通过,将去检查自己的瞬时数据库中是否有真实的私密数据,如果没有,将尝试从别的peer处拉取数据。
  5. 取到私密数据后,首先去和公共数据的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)的更多相关文章

  1. fabric私密数据学习笔记

    fabric私密数据学习笔记 私密数据分为两部分 一个是真正的key,value,它被存在 peer的私密数据库(private state)中. 另一部分为公共数据,它是真实的私密数据key,val ...

  2. JavaScript-cookie是客户端本地,持久存储用户私密数据的文件

    navigator:封装浏览器配置信息的对象 cookieEnabled:判断浏览器是否启用cookie cookie是什么:cookie是客户端本地,持久存储用户私密数据的文件 plugins:包含 ...

  3. 菜鸟系列Fabric源码学习 — peer节点启动

    Fabric 1.4 源码分析peer节点启动 peer模块采用cobra库来实现cli命令. Cobra提供简单的接口来创建强大的现代化CLI接口,比如git与go工具.Cobra同时也是一个程序, ...

  4. 菜鸟系列Fabric源码学习 — committer记账节点

    Fabric 1.4 源码分析 committer记账节点 本文档主要介绍committer记账节点如何初始化的以及committer记账节点的功能及其实现. 1. 简介 记账节点负责验证交易和提交账 ...

  5. 菜鸟系列Fabric源码学习 — MVCC验证

    Fabric 1.4 源码分析 MVCC验证 读本节文档之前建议先查看[Fabric 1.4 源码分析 committer记账节点]章节. 1. MVCC简介 Multi-Version Concur ...

  6. 在 Fabric 中使用私有数据

    本教程将演示收集器(collection)的使用,收集器为区块链网络上已授权的组织节点 提供私有数据的存储和检索. 本教程假设您已了解私有数据的存储和他们的用例.更多的信息请参阅 私有数据 . 本教程 ...

  7. 升级iOS8系统后,保险箱Pro、私人保险箱、私密相冊打开就闪退的官方解决方式

    升级iOS8系统后,保险箱Pro.私人保险箱.私密相冊打开就闪退的官方解决方式   写在前面的话: 1.   本文适用条件    适用于:您的保险箱Pro.私人保险箱.私密相冊在iPhone或iPad ...

  8. [转]自建Syncthing中继服务器(私密传输或造福大众)

    自建Syncthing中继服务器(私密传输或造福大众) 一.介绍 我之前介绍了Syncthing,作为一款开源的文件同步程序,它的功能还是非常强大的,我也很高兴能看到它被越来越多的人知道和使用,前几天 ...

  9. 升级iOS8和iOS9系统后,保险箱Pro、私人保险箱、私密相冊打开就闪退的官方解决方式

    升级iOS8和iOS9.iOS10系统后,保险箱Pro.私人保险箱.私密相冊打开就闪退的官方解决方式 查看设备iOS操作系统版本号号办法:iPhone/iPad->设置->通用->关 ...

随机推荐

  1. Burpsuite 2.0.11 Beta 破解版下载

    1.解包 jar xvf burpsuite_pro_v2.0.11beta.jar 自行定制,删除自带chrome和7zip软件包之后,软件精简至39M. 2.打包 jar cvfm META-IN ...

  2. 如何打开Mac OSX 终端的颜色

    如何打开Mac OSX 终端的颜色 听语音 | 浏览:8453 | 更新:2015-12-15 16:48 1 2 3 4 5 6 7 分步阅读 Mac 终端默认颜色很单一,文件夹和文件无法区分,可以 ...

  3. http range request

    range request: 要求实现该功能需要指定下载的实体范围

  4. 【luoguP2675】《瞿葩的数字游戏》T3-三角圣地

    题目背景 国王1带大家到了数字王国的中心:三角圣地. 题目描述 不是说三角形是最稳定的图形嘛,数字王国的中心便是由一个倒三角构成.这个倒三角的顶端有一排数字,分别是1~N.1~N可以交换位置.之后的每 ...

  5. jQuery系列(三):jQuery动画效果

    jQuery提供的一组网页中常见的动画效果,这些动画是标准的.有规律的效果:同时还提供给我们了自定义动画的功能. 1.显示动画 方式一: $("div").show(); 解释:无 ...

  6. 转载像元素周期表一样的html5的标签图集

    转载请注明出处. HTML5标签集合

  7. 安装mongodb-window10版

    第一.下载mongodb 官方地址:https://www.mongodb.com/ 第二步mongodb安装 运行mongodb-win32-x86_64-2008plus-ssl-v3.4-lat ...

  8. [JZOJ6346]:ZYB和售货机(拓扑+基环内向森林)

    题目描述 可爱的$ZYB$来到一个售货机前. 售货机里有一共有$N(\leqslant 10^5)$个物品,每个物品有$A_i$个.自然,还有$N$个购买按钮.正常情况下,按下第$i$个按钮,需要支付 ...

  9. 2 ArrayList 详解

    List 是有序.可重复的容器.List中每个元素都有索引标记,可以根据元素的索引标记访问元素,从而精确控制这些元素. List 接口常用的实现类:ArrayList.LinkedList.Vecto ...

  10. Django知识

    复习下django的知识. 1,安装: #pip install django 2.安装完毕后,在当前目录创建工程: #django-admin startproject mysite 执行上方的命令 ...