fabric1.2私有数据使用

fabric数据持久化 背景 fabric多机kafka部署完毕,但是每次容器销毁后,网络和数据就都不存在了。对于生产环境来说,这是无法接受的,所以就要考虑数据持久化的问题了。 方案 综合fabric官方教程(https://hyperledger-fabric.readthedocs.io/en/latest/build_network.html#a-note-on-data-persistence),思路如下:... 阅读详情

下载fabric1.2,使用bootstrap.sh下载所需镜像。

注意:fabric12.需要go的版本 为1.10.X。

1.定义私有数据集合的配置文件

// collections_config.json

[
  {
       "name": "collectionMarbles",
       "policy": "OR('Org1MSP.member', 'Org2MSP.member')",
       "requiredPeerCount": 0,
       "maxPeerCount": 3,
       "blockToLive":1000000
  },

  {
       "name": "collectionMarblePrivateDetails",
       "policy": "OR('Org1MSP.member')",
       "requiredPeerCount": 0,
       "maxPeerCount": 3,
       "blockToLive":3
  }
]

集合定义配置文件由5个属性组成:
* name:集合名称
* policy:定义组织peer节点,允许使用签名策略语法来持久化收集数据,每个成员被包含在签名策略列表中。
* requiredPeerCount:在peer节点签名背书并返回提案响应给客户端,成功传送私有数据的最小认可节点。
* maxPeerCount:为了数据冗余保存的目的,需要同步保存私有数据的被认可的最大peer节点数量。如果一个可信节点宕机后,其他的持有私有冗余数据的节点依然可以提供数据请求访问服务。
* blockToLive:私有数据在sideDB保存时长。如果要一致保存,则配置为0。

2. 使用链码API对私有数据进行读写操作

代码如下:

//marbles_private.go文件:
package main

import (
	"encoding/json"
	"fmt"
	"strconv"

	"github.com/hyperledger/fabric/core/chaincode/shim"
	pb "github.com/hyperledger/fabric/protos/peer"
)

// SimpleChaincode example simple Chaincode implementation
type SimpleChaincode struct {
}

// Org1 与 Org2 组织中的peer节点可以从sidedb中访问私有数据
type marble struct {
  ObjectType string `json:"docType"`
  Name       string `json:"name"`
  Color      string `json:"color"`
  Size       int    `json:"size"`
  Owner      string `json:"owner"`
}

// Org1组织中的Peer节点可以从sidedb中访问私有数据
type marblePrivateDetails struct {
  ObjectType string `json:"docType"`
  Name       string `json:"name"`
  Price      int    `json:"price"`
}

// ===================================================================================
// Main
// ===================================================================================
func main() {
	err := shim.Start(new(SimpleChaincode))
	if err != nil {
		fmt.Printf("Error starting Simple chaincode: %s", err)
	}
}

// Init initializes chaincode
// ===========================
func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response {
       return shim.Success(nil)	
}

// Invoke - Our entry point for Invocations
// ========================================
func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
	function, args := stub.GetFunctionAndParameters()
	fmt.Println("invoke is running " + function)

	// Handle different functions
	if function == "invokeMarble" {
        	return t.invokeMarble(stub, args)
        } else if function == "readMarble" { //read a marble
		return t.readMarble(stub, args)
	} else if function == "readMarblePrivateDetails" { //find marbles for owner X using rich query
		return t.readMarblePrivateDetails(stub, args)
	}

	fmt.Println("invoke did not find func: " + function) //error
	return shim.Error("Received unknown function invocation")
}

func (t *SimpleChaincode) invokeMarble(stub shim.ChaincodeStubInterface, args []string) pb.Response {
// === Save marble to state ===
	marbles := []marble{
		   marble{ObjectType: "marble", Name: "marble2", Color: "blue", Size: 15, Owner : "tom"},
		   marble{ObjectType: "marble", Name: "marble3", Color: "blue", Size: 50, Owner : "tom"},
		   marble{ObjectType: "marble", Name: "marble4", Color: "red", Size: 35, Owner : "bob"},
		   marble{ObjectType: "marble", Name: "marble5", Color: "red", Size: 15, Owner : "bob"},
		   marble{ObjectType: "marble", Name: "marble6", Color: "red", Size: 8, Owner : "pp"},
	}
	i := 0
	for i < len(marbles){
		marbleJSONasBytes,_ := json.Marshal(marbles[i])
		err :=  stub.PutPrivateData("collectionMarbles", "marble"+strconv.Itoa(i+2), marbleJSONasBytes)
		if err != nil {
			return shim.Error(err.Error())
		}
		i = i + 1
	}

// ==== Save marble private details ====
       objectType := "marblePrivateDetails"
       marblePrivateDetails := &marblePrivateDetails{objectType, "marble1", 100}
       marblePrivateDetailsBytes, err := json.Marshal(marblePrivateDetails)
       if err != nil {
               return shim.Error(err.Error())
       }
       err = stub.PutPrivateData("collectionMarblePrivateDetails", "marble1", marblePrivateDetailsBytes)
       if err != nil {
               return shim.Error(err.Error())
       }

       return shim.Success(nil)
}
// ===============================================
// readMarble - read a marble from chaincode state
// ===============================================

func (t *SimpleChaincode) readMarble(stub shim.ChaincodeStubInterface, args []string) pb.Response {
        var name, jsonResp string
    	var err error
   	if len(args) != 1 {
                return shim.Error("Incorrect number of arguments. Expecting name of the marble to query")
        }

	name = args[0]
	valAsbytes, err := stub.GetPrivateData("collectionMarbles", name) //get the marble from chaincode state

        if err != nil {
    		jsonResp = "{\"Error\":\"Failed to get state for " + name + "\"}"
    		return shim.Error(jsonResp)
	} else if valAsbytes == nil {
   		jsonResp = "{\"Error\":\"Marble does not exist: " + name + "\"}"
    		return shim.Error(jsonResp)
	}
       
	return shim.Success(valAsbytes)
}

// ===============================================
// readMarblereadMarblePrivateDetails - read a marble private details from chaincode state
// ===============================================

func (t *SimpleChaincode) readMarblePrivateDetails(stub shim.ChaincodeStubInterface, args []string) pb.Response {
	var name, jsonResp string
	var err error

	if len(args) != 1 {
		return shim.Error("Incorrect number of arguments. Expecting name of the marble to query")
	}

	name = args[0]
	valAsbytes, err := stub.GetPrivateData("collectionMarblePrivateDetails", name) //get the marble private details from chaincode state

	if err != nil {
		jsonResp = "{\"Error\":\"Failed to get private details for " + name + ": " + err.Error() + "\"}"
		return shim.Error(jsonResp)
	} else if valAsbytes == nil {
		jsonResp = "{\"Error\":\"Marble private details does not exist: " + name + "\"}"
		return shim.Error(jsonResp)
	}
	return shim.Success(valAsbytes)
}

定义的规则如下:
- "name,color,size,and owner" 可以被Org1和Org2组织下的所有成员访问
- "price" 仅仅被Org1组织下的成员访问

其中,链码的shim APIs接口提供常用私有数据操作方法:

  • PutPrivateData(collection,key,value)
  • GetPrivateData(collection,key)
  • GetPrivateDataByRange(collection, startKey, endKey string)
  • GetPrivateDataByPartialCompositeKey(collection, objectType string, keys []string)
  • GetPrivateDataQueryResult(collection, query string) (*只有使用couchdb才能使用富查询语句

注意:fabric1.2的e2e默认背书策略为AND,invoke等操作都需要在两个组织的背书节点上进行背书。

3.安装链码 (script.sh)

peer chaincode install -n mycc5 -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/marbles_private

4.初始化链码 (script.sh)

peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc5 -v 1.0 -c '{"Args":["init"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')" --collections-config /opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go/marbles_private/collections_config.json

注意在链码初始化的时候使用命令加载该配置文件

peer chaincode instantiate ... --collections-config

5.插入弹珠(script.sh)

peer chaincode invoke -o orderer.example.com:7050  --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc4 $PEER_CONN_PARMS -c '{"Args":["invokeMarble"]}'

6.查询私有数据

peer chaincode query -C mychannel -n mycc -c '{"Args":["readMarble","marble1"]}'
peer chaincode query -C mychannel -n mycc -c '{"Args":["readMarblePrivateDetails","marble1"]}'

 注意:若查询未被授权的私有数据,则会返回Error:nil

7. 清理私有数据

在私有数据集合中配置的属性blockToLive,可以设置在多少个区块后清理私有数据,只留下数据的哈希值,作为交易的不可改变的证据。

比如我们在创建上面的样例链码的时候,设置私有数据集合属性blockToLive=4。

在上面的样例中,我们已经初始化了一个marble1,其中price=99,使用如下命令查询:

详见https://blog.youkuaiyun.com/songbin830/article/details/81224203

参考https://hyperledger-fabric.readthedocs.io/en/release-1.2/private_data_tutorial.html#

SAP MM自动化进阶:STO交货单自动创建的配置与优化 本文深入解析了SAP MM模块中实现公司间库存调拨订单(STO)交货单自动创建的完整配置流程与优化策略。通过激活自动交货与绑定发货点两大核心配置,打通自动化链路。重点探讨了如何集成ATP可用性检查以智能处理库存不足等异常场景,确保自动化流程的可靠性与业务贴合度,并提供了进阶监控与问题排查方法,助力企业显著提升供应链效率。 阅读详情

相关推荐

Python+whisper/vosk实现语音识别

Whisper 是一个由 OpenAI 开发的人工智能语音识别模型,它能够将语音转换为文本。Whisper 模型特别之处在于它的设计目标是能够理解和转录多种语言的语音,包括但不限于英语。Whisper 模型在训练时使用了大量不同语言的语音数据,这使得它具有很好的跨语言能力。Vosk 是一个开源的语音识别库,它可以在离线环境下工作,不依赖于任何外部服务。Vosk 基于Kaldi语音识别框架,支持多种语言,包括中文。Vosk提供了多种预训练模型,可以根据需求选择适合的模型进行语音识别。

weixin_44458771的博客 5941

fabric示例合约 Private data

1.什么是私有数据? 一个通道网络中会有很多机构,有一些数据是只能属于其中的某一个或者某几个机构可见,或者可以操作的 这些数据就被称为私有数据,私有数据是被存在peer节点上的 peer上会有一个私有数据库来存储私有数据 上图为一个简化的通道网络,通道中有OGR1和ORG2两个机构 ORG1有peer0节点 ORG2有peer1节点,其中peer0节点是授权了可以使用私有数据的 peer1节点是未被授权的 注:私有数据同时也会保存在Channel State中,但是是以存储,key和value的hash来

aitutou的博客 4423

webview腾讯x5内核离线安装

离线集成腾讯TBS浏览器服务,彻底解决官方下载限流问题,永久免费

观千剑而后识器,操千曲而后晓声。 7910

Fabric中的私有数据

这是官网提供的一个集合定义,一般配置在connection_config.json中[{"name""policy"0,3,1000000,true},{"name""policy"0,3,3,true}]name集合的名称。policy定义了哪些组织中的Peer节点能够存储集合数据。私有数据要分发到的节点数,这是链码背书成功的条件之一。为了数据冗余,当前背书节点将尝试向其他节点分发数据的数量。个区块,之后就会被清除。如果要永久保留,将此值设置为0即可。...

仙女的博客 3165

UG NX二次开发(C++)-库缺少需要的入口点的原因与解决方案

在UG NX二次开发过程中,有时会遇到形形色色的bug,比如有个读者其采用UG NX二次开发(C++)时,遇到“库缺少需要的入口点”这个问题,看了一下他发给我的源代码,感觉有必要讲一下UG NX二次开发(C++)遇到此类问题的可能情况与解决方法。自然,这是博主的经验之谈,有不足之处还请在评论区讨论。

GimiGimmy 2201

十四种逻辑器件综合对比——《器件手册--逻辑器件》

逻辑器件是数字电路中最基本的逻辑单元,用于实现基本的逻辑运算,如与、或、非、异或等。逻辑门根据输入信号的组合产生相应的输出信号。与门:只有当所有输入信号都为高电平时,输出才为高电平。或门:只要有一个输入信号为高电平,输出就为高电平。非门:输出信号与输入信号相反。异或门:当两个输入信号不同时,输出为高电平;相同则输出为低电平。用于对输入信号进行反相操作,即将高电平转换为低电平,低电平转换为高电平。常用于信号的反相处理和逻辑电平的转换。

XU157303764的博客 2030

Fabric Hyperledger之隐私数据(Private data)

何为隐私数据?   如果某个通道上的某些组织想要保持数据的隐私,对通道上的其它组织保密,那么一个直接的做法是创建一个新的通道,只让具有隐私数据访问权的组织加入,然而建立单独的通道会产生额外的管理开销(维护链码版本,背书策略,MSP等。   从Fabric v1.2开始,Fabric可以创建私有数据集合,从而使通道上已定义的组织子集能够背书、提交或查询私有数据,而无需创建单独的通道。 隐私数据集合(...

weixin_43839871的博客 3703

Unity中的Timeline

Timeline与动画系统类似,但是它可以针对多个物体做出一系列多个动画,它可以创建多个轨道,对象激活与隐藏轨道,动画轨道,声音轨道等。每个轨道都可以单独编辑,轨道内的不同资源可以排列并且融合

L的博客 1万+

fabric2.0 概念,链码和私有数据

1.智能合约和链码 管理员将相关智能合约组织起来用于部署–链码。 智能合约中存储各方交易的业务模型,定义了术语、处理流程等。利用区块链可以将智能合约转换为可执行程序。应用通过调用智能合约来产生交易与在账本进行记录。使用智能合约可以实现自动化,比如定时交易等,而且也会比人工的手动操作效率更高。 如上图中ORG1和ORG2定义了一个可以查询、转移、更新汽车的智能合约,这些组织的应用可以通过调用这个智能合约来实现将一辆汽车从一个组织转移到另一个组织上。 链码包含多个智能合约,之后再部署到区块链上。当一个链码部署

zekdot的博客 1707

A133在Android13上适配百兆以太网

NOTE] 【技术支持问题】问题背景/平台。

mangofu的博客 412

Python 爬虫进阶:爬取 APP 数据(Charles 抓包 + Requests)

本文详细介绍了APP数据爬取的完整技术方案。首先通过Charles抓包工具配置HTTPS代理和证书,解析APP通信协议;然后分析请求参数、反爬机制和动态签名生成规则;接着使用Python的Requests库实现模拟请求、分页爬取和数据存储;最后针对证书问题、Token失效等常见问题提供解决方案。文章强调抓包分析、参数逆向和请求模拟三大核心技术,同时提醒开发者需遵守法律法规,合理控制爬取频率。该方案适用于移动端数据采集场景,为无法直接获取网页数据的情况提供了有效解决方案。

2503_91057718的博客 2120

Fabric v1.2私有数据使用大致步骤

1. 创建collections_config.json文件 内容: [ {        "name": "collectionMarbles",//        "policy": "OR('Org1MSP.member', 'Org2MSP.member')",        "requiredPeerCount": 0,        "maxPeerCoun.

wh15055768834的博客 1450

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法示例

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法示例

Robot_PLC_HMI_Automation 1万+

(翻译)fabric1.2.1新特效-私有数据

私有数据 私有数据的应用 在同一通道内某一组织持有私有数据,只要被认证的组织才可以访问。如果为了保持数据的隐私性而建立不同的通道,可能会增加通道以及相关链码的维护成本。 私有数据集 一个私有数据集由两个元素组成: 1. 真实的私有数据 只有在被认证的组织中的peer节点才能查看通过gossip协议通讯的私有数据。这些数据被保存在peer节点的私有数据库(SideDB...

songbin830的专栏 3928

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Fabric 测试网络 - 弹珠私有数据

目录 清除网络 安装go依赖 删除弹珠私有数据链码的Docker容器 启动使用 CouchDB 的 Fabric 测试网络 安装并定义一个带有集合的链码 以Org1管理员身份与测试网络进行交互 设置Org1身份环境变量 打包弹珠私有数据链码 安装链码 以Org2管理员身份与测试网络进行交互 设置Org2身份环境变量 安装链码 查看链码包ID(Package ID) 为链码包设置一个环境变量 Org1批准链码定义 设置Org1身份环境变量 Org1批准链码定义 Org2批准

ling1998的博客 1186

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

《区块链原理、设计与应用》 – 基于超级账本 Fabric 2.x(学习分享2.2-Fabric V1.x 与V2.0)

废话不多说,直接进入学习分享内容。Fabric 从IBM第一个内部通用版本V0.6 到 V1.x 再到V2.0的发布,经历很多场景、框架的完善,逐步将联盟链的概念完善起来。其实从外文的原文,公有链(Permissionless Blockchain)、联盟链(Permissioned Blockchain),就可以看出对于联盟链的定义。 对比公有链来说,自激励、参与方式无限制、网络规模普遍偏大、吞吐量较低;而联盟链,主要通过外部激励、参与方式是通过授权、网络规模偏小、吞...

qilinwcs的博客 5319

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

(Fabric 学习六)Fabric2.0 私有数据 使用marbles官方示例

私有数据 从v1.2开始,Fabric 提供了创建私有数据集合的功能,它允许在通道上定义的组织子集能够背书、提交或查询私有数据,而无需创建单独的通道。 产生的原因:一个通道上的一组组织需要对该通道上的其他组织保持数据私有 原来的办法:可以选择创建一个新通道,其中只包含需要访问数据的组织 原来办法的缺点: 在每种情况下创建单独的通道会产生额外的管理开销(维护链码版本、策略、MSP等) 不能在保留一部分数据私有的同时,可以让所有通道参与者看到该事务。 故产生了私有数据这一个概念。 私有数据集合

Wannabe_hacker的博客 2258

深入挖掘Hyperledger Fabric中的私有数据

想知道更多关于区块链技术知识,请百度【链客区块链技术问答社区】 链客,有问必答! 私有数据是fabric中讨论最多的特性,在v1.2中发布。它在多个参与者之间引入了数据隐私的概念,而不需要为彼此创建单独的通道。根据fabric文档,私有数据是: 如果某个通道上的一组组织需要对该通道上的其他组织保持数据私有,则可以选择创建一个新通道,其中只包含需要访问数据的组织。但是,在每种情况下创建单独的通道...

weixin_44172023的博客 747

Hyperledger Fabric(私有数据)

私有数据 什么是私有数据? 如果某个通道上的一组组织需要将该数据与该通道上的其他组织保密,他们可以选择创建一个新通道,只包含需要访问数据的组织。但是,在每种情况下创建单独的通道会产生额外的管理开销(维护链码版本,策略,MSP等),并且不允许你希望所有通道参与者在保持部分数据私有的情况下查看交易的用例。 这就是为什么从v1.2开始,Fabr...

weixin_34275734的博客 228

Hyperledger Fabric 1.3 官方文档翻译(三)关键概念 (Key Concepts) - 3.8 私有数据 (Private data)

私有数据(Private data) 什么是私有数据(What is private data)? In cases where a group of organizations on a channel need to keep data private from other organizations on that channel, they have the option to creat...

hugowang的博客 1878

Fabric private data入门实战

Hyperledger Fabric private data是1.2版本引入的新特性,fabric private data是利用旁支数据库(SideDB)来保存若干个通道成员之间的私有数据,从而在通道之上又提供了一层更灵活的数据保护机制。本文将介绍如何在链码开发中使用fabric private data。 fabric private da...

rejames的博客 212

fabric社区发展概况

前言 官网:https://github.com/hyperledger/fabric fabric作为联盟链底层的基础设施已经发展几年,也陆续在一些场景中落地。在发展过程中,也在不断完善。从最早fabric0.6版本到现在1.4,1.X版本后面会停止更新,会切换到2.0版本。本文就从fabric发展历程,把几个版本主要的特性做一下总结,也可从中发现商业落地对社区的发展的一些推动。 fabric主...

卢舍那 1万+

fabric private data实战

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34008784的博客 217

hyperledger fabric private data

关于 简要记录hyperledger fabric私有数据的实验,参照官方文档https://hyperledger-fabric.readthedocs.io完成。 实现 “#”后面是注释 tonasy@tonasy-Inspiron-3542:~/hyperledger-fabric/fabric-samples/first-network$ docker exec -it cli bash ...

路在脚下,更在心中 1532

fabric里的marble私有数据访问案例

在fabric中,可以通过收集器collection来保存和访问私有数据,也可以定义Peer节点私有数据的访问权限,下面介绍marble私有数据访问案例。fabric的版本为v1.4.x。 使用PutPrivateData()函数,将私有数据写入到边侧数据库A、B;使用GetPrivateData()函数,从边侧数据库A、B里读取私有数据。

sanqima的专栏 737

【问链财经-区块链基础知识系列】 第三十一课 Fabric版本变迁之路从1.1-1.4

Fabric个版本更新内容 V1.1 ・Node.js链代码支持 - 开发人员现在可以使用世界上最流行的编程语言最流行的框架编写链代码 ・基于通道的事件服务 - 使客户端能够在每个通道的基础上订阅阻止和阻止事务事件。 ・能够使用链代码打包CouchDB索引,以提高性能 ・能够生成证书吊销列表(CRL) ・能够动态更新客户端身份和从属关系 ・Node.js SDK连接配置文件,用于简化与Fabric...

tiandiwuya的专栏 1012
上一篇: docker加速器
下一篇: 网络相关
mx1222
博客等级 码龄11年 11粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值