fabric私密数据学习笔记

私密数据分为两部分

一个是真正的key,value,它被存在 peer的私密数据库(private state)中。
另一部分为公共数据,它是真实的私密数据key,value 哈希后的值 hash(key),hash(value),它被存在普通的peer数据库中(state),orderer端可以拿到该值。没有被分配私密数据权限的peer,也仅仅可以存储hash后的key和value。

何时使用channel进行数据隔离,何时使用私密数据进行隔离

  1. 需要组织间进 数据隔离时,使用channel进行数据隔离。
  2. 当需要组织内进 数据隔离时,使用私密数据进行数据隔离。
  3. 处于同一channel的多个组织之间进行数据隔离时,也要使用私密数据进行数据隔离。

私有数据在fabric中的交易流程

  1. sdk将交易发送给背书节点,该背书节点需要通过policy(此
    处的policy为instantiation设定的)验证。

  2. 背书节点模拟执行交易 ,并将真实的私密数据 key和value存
    储于瞬时数据库(private transient DB)中。基于collection policy,验证通过的peer节点,通过gossip同步真实的私密数据,并将其存储于瞬时数据库中。

  3. 背书节点将模拟执行后的结果返回给SDK,返回的数据中仅有公共数据(hash过的私密数据)。SDK将peer返回的结果打包后发送给orderer,和普通的区块一样,orderer切块后,将其分发给peer,此时所有的peer都拿到了公共数据,所有的peer都可以去验证私有数据,没有通过collection policy的peer,也可以验证,而且还不拥有真实的私密数据,保证了数据的私密性。

  4. 在commit之前,peer首先去判断自己是否通过collection policy的检查,若通过,将去检查自己的瞬时数据库中是否有真实的私密数据,如果没有,将尝试从别的peer处拉取数据。

  5. 取到私密数据后,首先去和公共数据的hash去做比对,若一致,此时进行commit操作,将私密数据的HASH写入到公共数据库中。提交该交易和这个区块到账本中,成功提交后,私密数据将会从瞬时数据库拷贝到私密数据库中,并从瞬时数据库中删除。此时整个交易流程结束,数据成功写入到账本内。

如何定义私密数据 collection

一个collection定义包含一个或多个collection,在合约实例化
的时候安装该collection。cli去部署集合时,使用参数 --
collections-config。

peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C mychannel -n marblesp -v 1.0 -c '{"Args":["init"]}' -P "OR ('Org0MSP.member','Org1MSP.member')" --collections-config collections.json

collection的集合定义

name: 集合名称。

policy: 语法与签名policy一致,允许哪些组织的peer保存私密数据。私有数据的policy成员必须包含在签名policy的成员内。每个policy都类似于一个过滤器 ,第一 层过滤为签名policy,第二层为私密数据policy。若签名policy未通过验证,交易将执行失败,也就不会产生私密数据。第二种情况是当签名policy通过,但私密数据policy未通过,将没有peer保存真正的私密数据,只会将hash过的数据保存下来,私密数据也将会丢失,这样的 policy定义是没有意义的。

requiredPeerCount: 配置最小分发私有数据peer的数 ,在 peer背书交易和返回给SDK的时间段。当配置为0时,表示不需要分发,但是当maxPeerCount大于0时,还是会分发,分不分发是由这两个配置项共同决定的。当都是0的情况下,私密数据是存在丢失的可能性。该值必须小于等于maxPeerCount。

maxPeerCount:基于私密数据冗余的目的,将数据分发到其他peer的数量 。如果背书节点挂掉,在背书和commit阶段,其他处于collection的peer节点将不能接收到该节点的私密数据, 将从其余已经分发的节点去pull数据。如果这个值设置为0,私密数据在交易背书时间段没有分发,将强制向所有peer去尝试pull私密数据。

blockToLive:私密数据生效时长 ,在私密数据库中保存的时长,将为特定的几个块生效,是时间到达后,将会被清除,再也查不到该数据。 设置为0,将一直被保存,永不清除。

一个有权限保存私有数据的peer,丢失了私密数据,在将来的交易中引用私密数据时,将报错,此处体现 requiredPeerCount和maxPeerCount 的重要性。

collection需要配合chaincode使用,chaincode的shim提供了以下接口:

PutPrivateData(collection,key,value) GetPrivateData(collection,key) GetPrivateDataByRange(collection, startKey, endKey string) GetPrivateDataByPartialCompositeKey(collection, objectType string, keys []string)

Couchdb

GetPrivateDataQueryResult(collection, query string)

使用私密数据的chiancode注意事项:

1、使用couchdb时,sdk去执行range或富查询时,可能只返回结果集的子集,有些peer可能不含有私密数据。sdk可以向多个peer去查询并且比较查询结果,可以确定某些peer是否缺少数据。

2、chaincode在执行range或富查询时,不支持在同一个交易中执行update操作,因为无法判断peer是否有权限拥有私密数据权限,或是否丢失私密数据。如果chaincode在一条交易中包含查询私密数据和更新私密数据两步操作,这个proposal将返回 Error。如果你的有这个需求,请分为两条交易去执行。但是一个chaincode方法中既包含GetPrivateData() 和PutPrivateData()却是可以的,因为所有peer都包含有哈希key的版本号。

3、私密数据collection仅仅定义了组织下的peer能否接收和保存私密数据,意味着仅有某些peer可以查询私密数据,collection不能限制谁调用chaincode。没有限制权限的sdk都可以执行chiancode内部逻辑,最好是在chaincode 内部使用GetCreator() 来控制调用chaincode的权限。

私密数据清除

想要在peer上永久保存私密数据,将blockToLive设置为0即可。我们都知道,当一条包含私密数据的交易在fabric中commit之后,私密数据将会在peer的瞬时数据库中清除,但是若这条交易从不提交,私密数据将会永久保存在瞬时数据库中。 这时就用到一个配置peer.gossip.pvtData.transientstoreMaxBlockRetention,当符合配置
时,将清除私密数据从瞬时数据库中。

私密数据在core.yaml中的gossip配置

pullRetryThreshold: pull私密数据的超时时间,超时后将提交一个没有私
密数据的block。
transientstoreMaxBlockRetention: 当私密数据在瞬时数据库中存储时,它与当时账本中的区块高度有关,该配置定义了当前区块的高度与保证不会清除私密数据之间的最大差异。即每当commit的区块高度达到该配置的倍数时,将触大发清除瞬时数据库中的私密数据。
pushAckTimeout:在背书交易的时候,将私密数据push到其他区块的握手超时时间。
btlPullMargin: 作缓冲区的区块数 量,新增peer时,当peer解析到私密数据的公共信息时,会得到私密数据所在区块的编号,这时会去判断 (账本高度+ btlPullMargin) > (私密数据所在区块高度+btl),如果成立,将不会去获取这个私
密数据,将提交一个没有私密数据的block到自己账本。btlPullMargin默认值是10,若btl小于10,新增peer将不会同步任何私密数据。

转载请注明出处:https://www.cnblogs.com/zooqkl

fabric私密数据学习笔记的更多相关文章

  1. 菜鸟系列Fabric——Fabric 私密数据(6)

    Fabric 私密数据 1.私密数据的定义 如果某个渠道上的一组组织需要将数据与该渠道上的其他组织保密,他们可以选择创建一个仅包含需要访问数据的组织的新渠道.但是,在每种情况下创建单独的通道会产生额外 ...

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

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

  3. 大数据学习笔记——Java篇之网络编程基础

    Java网络编程学习笔记 1. 网络编程基础知识 1.1 网络分层图 网络分层分为两种模型:OSI模型以及TCP/IP网络模型,前者模型分为7层,是一个理论的,参考的模型:后者为实际应用的模型,具体对 ...

  4. 大数据学习笔记——Linux基本知识及指令(理论部分)

    Linux学习笔记整理 上一篇博客中,我们详细地整理了如何从0部署一套Linux操作系统,那么这一篇就承接上篇文章,我们仔细地把Linux的一些基础知识以及常用指令(包括一小部分高级命令)做一个梳理, ...

  5. 大数据学习笔记——Linux完整部署篇(实操部分)

    Linux环境搭建完整操作流程(包含mysql的安装步骤) 从现在开始,就正式进入到大数据学习的前置工作了,即Linux的学习以及安装,作为运行大数据框架的基础环境,Linux操作系统的重要性自然不言 ...

  6. 大数据学习笔记——Java篇之IO

    IO学习笔记整理 1. File类 1.1 File对象的三种创建方式: File对象是一个抽象的概念,只有被创建出来之后,文件或文件夹才会真正存在 注意:File对象想要创建成功,它的目录必须存在! ...

  7. 大数据学习笔记——Java篇之集合框架(ArrayList)

    Java集合框架学习笔记 1. Java集合框架中各接口或子类的继承以及实现关系图: 2. 数组和集合类的区别整理: 数组: 1. 长度是固定的 2. 既可以存放基本数据类型又可以存放引用数据类型 3 ...

  8. 大数据学习笔记——Hadoop编程实战之HDFS

    HDFS基本API的应用(包含IDEA的基本设置) 在上一篇博客中,本人详细地整理了如何从0搭建一个HA模式下的分布式Hadoop平台,那么,在上一篇的基础上,我们终于可以进行编程实操了,同样,在编程 ...

  9. 大数据学习笔记之Hadoop(二):HDFS文件系统

    文章目录 一 HDFS概念 1.1 概念 1.2 组成 1.3 HDFS 文件块大小 二 HFDS命令行操作 三 HDFS客户端操作 3.1 eclipse环境准备 3.1.1 jar包准备 3.2 ...

随机推荐

  1. input type = file 在部分安卓手机上无法调起摄像头和相册

    移动端H5web 用input type = file 在部分安卓手机上无法调起摄像头拍照,有的也无法访问相册而是直接访问了文档,解决办法是: 加上 accept = "image/*&qu ...

  2. 2019春第六周作业Compile Summarize

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 在这里 我在这个课程的目标是 能够熟练掌握指针的用法 这个作业在那个具体方面帮助我实现目标 对指针的使用更加得心应手 参考文献与网址 C语 ...

  3. Python从入坑到放弃!

    Python基础  python基础 python基础之 while 逻辑运算符 格式化输出等 python基础之 基本数据类型,str方法和for循环 python基础之 列表,元组,字典 pyth ...

  4. [LeetCode] 132. Palindrome Partitioning II_ Hard tag: Dynamic Programming

    Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...

  5. log4cplus在VS项目中的使用

    log4cplus是C++编写的开源的日志系统,宣称具有线程安全.灵活.以及多粒度控制的特点,通过将日志划分优先级使其可以面向程序调试.运行.测试.和维护等全生命周期.你可以选择将日志输出到屏幕.文件 ...

  6. Oracle 10053

    [10053]alter session set events '10053 trace name context forever,level 1'; <Run your SQL here;&g ...

  7. httpappplication 和 httpmodule 的理解(转载,写的很好)

    第一部分:转载自Artech  IIS与ASP.NET管道 ASP.NET管道 以IIS 6.0为例,在工作进程w3wp.exe中,利用Aspnet_ispai.dll加载.NET运行时(如果.NET ...

  8. 如何解决loss NAN的问题

    问题 如上图所示,第二次迭代时出现NAN值,nan表示无穷大或者非数值,一般是在一个数除以0或者log(0)时会出现无穷大.可能的原因有:1)学习率过大:2)batch过大:3)不当的损失函数等. 试 ...

  9. feifeicms后台任意文件读取

    前台大略看了下,本身内容比较简单,经过“洗礼”后以及没什么问题了,基本上输入都过滤了. 这次审计找到了一个后台的任意文件读取,可以读取数据库配置文件. 在DataAction.class.php文件中 ...

  10. 跟我一起学python(1)

    1.变量 定义一个变量  会有三个特征  id,type,value print(id(age),type(age),age) 命名推荐用下划线方式 (尽量用英文  不要过长  意思要明白) numb ...