Fabric: 使用InvokeChaincode实现跨通道数据访问

因为工作中遇到一些问题考虑使用Fabric的跨通道链码调用方法InvokeChaincode()来解决,这篇文章主要是记录以下在Fabric测试网络中InvokeChaincode()的使用过程及遇到的问题。

1 前期准备

1.1 认识InvokeChaincode

  InvokeChaincode的作用是调用指定的链码。而被调用的链码与执行 InvokeChaincode的链码在或不在同一个通道上时,其能发挥的作用不同。具体规则如下:

  • 如果与被调用的链码在同一个通道上,它只是将调用的链码读取集和写入集添加到调用事务中。
  • 如果与被调用的链码在不同的通道上,则只有响应返回给调用的链码;来自被调用链码的任何putState()调用都不会对账本产生任何影响(我的理解是,这种情况下只可以读数据不能写数据)。

另外,InvokeChaincode的参数及其返回值如下:

  • 参数chaincodeName: string类型,目标链码名称。
  • 参数args: [][]byte型,参数列表。
  • 参数channel: string类型,目标链码所在的通道名称。如果channel值为"",则表示当前通道。
  • 返回值peer.Response: peer.Pesponse类型的数据是对peer节点操作的响应结果,通过处理peer.Response类型的数据,可以获取操作执行的状态、事件以及返回的值。也就是说,可以从peer.Response中抽取出目标链码的返回值。peer.Response数据通常包含以下字段:
字段名含义
Status操作的状态码 ,操作成功为200
Payload操作的返回结果,其类型为:[]byte
Message操作的错误信息,仅在出错时有效
TxId操作所在的交易ID
Proposal操作所在的提案
1.2 准备工作

   为了能减少创建节点、通道等这些繁琐的工作,这里将充分利用Fabric中的测试网络test-network。在实现跨通道的数据访问之前,需要先将基本的环境搭建完成。具体包括以下:

  • 使用./network.sh up命令创建peer节点、Orderer节点和cli客户端。
  • 使用./network.sh createChannel -c命令创建两个通道channel1channel2,这两个通道将共用所有的peer和Orderer节点。
  • 配置peer CLI, 将peer CLI绑定到Org1上的peer0节点上。
  • fabric-samples中提供的go语言链码示例部署到channel1中,并使用peer chaincode invoke调用链码的InitLedger方法往链码的world state中写入数据。具体代码如下:
#将asset-transfer-basic/chaincode-go中的链码部署到channel1中
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go -c channel1
#执行InitLedger()
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C channel1 -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"TransferAsset","Args":["asset6","Christopher"]}'
#查询world state中的所有数据
peer chaincode query -C channel1 -n basic -c '{"Args":["GetAllAssets"]}'

Tips:以上这些工作不是本篇的重点,具体过程可以参考其他资料,这里不赘述。

以上准备工作完成后,需要编写新的链码文件的来具体引用InvokeChaincode方法,并将新的链码部署到通道channel2上。

2 实现

2.1 具体实现

  • 先编写链码文件test_invoke.go,具体代码如下:
package chaincode

import (
	"github.com/hyperledger/fabric-contract-api-go/contractapi"
)

type TestSmartContract struct {
	contractapi.Contract
}

func (s *TestSmartContract) QueryData(ctx contractapi.TransactionContextInterface) (string, error) {
	//这里为了简单,把要传递给InvokeChaincode()的参数在函数体固定了,实际应用中需要改为从peer chaincode中接收参数
	chaincodeName := "basic"
	channelName := "channel1"
	chaincodeArgs := make([][]byte,1)
	chaincodeArgs[0]=[]byte("GetAllAssets")

	response := ctx.GetStub().InvokeChaincode(chaincodeName, chaincodeArgs, channelName)
	data := response.Payload
	return string(data), nil
}
  • test_invoke.go文件放到fabric-samples/asset-transfer-basic/chaincode-go/chaincode目录下
  • test_invoke.go文件执行权限。
sudo chmod -R 777 test_invoke.go
  • 修改fabric-samples/asset-transfer-basic/assetTransfer.go文件。将文件中NewChaincode中的参数改为&chaincode.TestSmartContract{}即可。Tips:test_invoke.go文件的主要作用就是定义结构体类型:TestSmartContract。
    在这里插入图片描述
  • 将链码部署到channel2中,这里将这个链码命名为basic_test。
./network.sh deployCC -ccn basic_test -ccp ../asset-transfer-basic/chaincode-go -ccl go -c channel2
  • 接下来在渠道channel2上调用链码basic_test上的QueryData来实现跨通道数据访问。
peer chaincode query -C channel2 -n basic_test -c '{"Args":["QueryData"]}'

结果如下(成功返回了channel1中的world state数据了)。至此,就完成了跨通道的数据访问。
在这里插入图片描述

2.2 补充说明

  在编写test_invoke.go文件时,中途遇到一些错误信息。整理如下:

  • 使用deployCC命令部署链码时若出现错误,一般都是go语言的语法错误,这里直接根据提示信息修改代码即可。
  • 即使 deployCC命令成功了也不代表链码能运行成功。后续链码的编译和执行错误信息可以通道命令docker查看。先运行docker ps -a命令,如果出现如下情况,则说明链码依然有错。
    在这里插入图片描述
    这种情况下,可以通过docker日志来查看具体的错误信息。命令如下:
docker logs --details <CONTAINER-ID>

代码修改之后需要重新使用 deployCC部署。

  • 开始test_invoke.go文件中只有一个名为queryData的方法时遇到这样一种错误: Contracts are required to have at least 1 (none-ignored) public method.
    错误原因:go语言中的方法名如果第一个字母为小写,则说明其他包无法使用这个方法,即为私有。所以这个错误只需要将方法名的首字母大写即可,即QueryData。这里建议,链码中的方法名都尽可能首字母大写。
  • InvokeChaincode方法的返回值类型为peer.Response,如果QueryData直接返回peer.Response,比如采用如下写法:
func (s *TestSmartContract) QueryData(ctx contractapi.TransactionContextInterface) peer.Response {
	chaincodeName := "basic"
	channelName := "channel1"
	chaincodeArgs := make([][]byte,1)
	chaincodeArgs[0]=[]byte("GetAllAssets")

	response := ctx.GetStub().InvokeChaincode(chaincodeName, chaincodeArgs, channelName)
	return response
}

这种写法会提示错误:Cannot use metadata. Metadata did not match schema。为了解决这个错误,在最终的代码中将QueryData的返回值类型改为了(string,error)

参考资料

  1. https://blog.csdn.net/weixin_41946008/article/details/123044664
  2. https://hyperledger-fabric.readthedocs.io/en/latest/test_network.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/123763.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pytoch安装指定版本教程pytorch1.3安装笔记

一、先生成一个环境 如果电脑里安装了其他的torch版本&#xff0c;另外生成一个环境可以防止原先torch版本被替换掉。 打开conda的终端窗口输入以下命令就可以生成一个名为torch_1.3的环境&#xff1a; conda create -n torch_1.3 python3.6 输入以下命令进入到torch_1.3的…

基于springboot实现致远汽车租赁平台管理系统项目【项目源码+论文说明】

基于springboot实现致远汽车租赁平台系统演示 摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要…

linux下实现电脑开机后软件自启动

实现linux的软件自启动&#xff0c;需要四个文件 第一个【displayScreen.desktop】文件&#xff0c;.desktop文件就是一个用来运行程序的快捷方式,也叫启动器&#xff0c;常用来自启动用的文件&#xff0c;内容如下 [Desktop Entry] #要执行的脚本位置 Exec/home/yicaobao/te…

后入能先出,一文搞懂栈

目录 什么是栈数组实现链表实现栈能这么玩总结 什么是栈 栈在我们日常编码中遇到的非常多&#xff0c;很多人对栈的接触可能仅仅局限在 递归使用的栈 和 StackOverflowException&#xff0c;栈是一种后进先出的数据结构(可以想象生化金字塔的牢房和生化角斗场的狗洞)。 栈&…

欧科云链:成本与规模之辨——合规科技如何赋能香港Web3生态?

作为国际金融中心&#xff0c;香港近两年来在虚拟资产及Web3领域频频发力。秉持着“稳步创新”的基本逻辑&#xff0c;香港在虚拟资产与Web3领域已建立一定优势&#xff0c;但近期各类风险事件的发生则让业界的关注焦点再次转向“安全”与“合规”。 在香港FinTech Week前夕&a…

强力解决使用node版本管理工具 NVM 出现的问题(找不到 node,或者找不到 npm)

强力解决使用node版本管理工具 NVM 出现的问题&#xff08;找不到 node&#xff0c;或者找不到 npm&#xff09; node与npm版本对应关系 nvm是好用的Nodejs版本管理工具&#xff0c; 通过它可以方便地在本地调换Node版本。 2020-05-28 Node当前长期稳定版12.17.0&#xff0c;…

基于SSM+Vue的随心淘网管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

git and svn 行尾风格配置强制为lf

git CLI配置&#xff1a; // 提交时转换为LF&#xff0c;检出时转换为CRLF git config --global core.autocrlf true // 提交时转换为LF&#xff0c;检出时不转换 git config --global core.autocrlf input // 提交检出均不转换 git config --global core.autocrlf f…

线性代数(四)| 解方程 齐次性 非齐次性 扩充问题

文章目录 1 方程解的个数2 解方程步骤2.1 齐次性方程组2.2 非齐次方程组 3 一些扩充问题 系数矩阵 增广矩阵 A m n X B A_{mn}XB Amn​XB 1 方程解的个数 m 代表有m个方程 n代表有n个未知数 系数矩阵的秩与增广矩阵的秩不同 无解 若相同 &#xff0c;如系数矩阵的秩和未知…

HDFS系统权限详解

一&#xff0c;HDFS超级用户 启动namenode的用户就是HDFS中的超级用户 如图所示 HDFS中&#xff0c;也是有权限控制的&#xff0c;其控制逻辑和Linux文件系统的完全一致 但是不同的是&#xff0c;两个系统的Supergroup不同(超级用户不同) Linux的操作用户是root HDFS文件系统的…

压缩软件 7-Zip VS WinZips?

7-zip在联想应用商店给强烈推荐&#xff1f; 要说它好用还行&#xff0c;但每次压缩都显示网络连接失败等异常广告信息。 相反好用的7-ZIP必须鼠标点击右键点击更多才能够看到&#xff0c;这次更新体验也太差了吧&#xff1f; 用户放在第一位&#xff1f; 要不是更新后一直推…

【方法】如何取消PDF文件的“打开密码”?

我们知道&#xff0c;PDF文件可以设置“打开密码”&#xff0c;保护文件不被随意打开&#xff0c;那如果后续不需要了&#xff0c;要怎么取消“打开密码”呢&#xff1f;不清楚的小伙伴可以试试小编分享的3种方法&#xff01; 方法1&#xff1a;使用PDF编辑器 PDF编辑器不仅可…

Matlab使用cftool进行曲线拟合

第一步&#xff0c;导入要拟合的输入和输出数据 导入excel时&#xff0c;如果作为列矢量导入&#xff0c;则会将excel的数据按列导入&#xff0c;并且&#xff0c;默认将第一行的变量名作为每一列的矢量名。 第二步&#xff0c;打开插件curve fitting 在应用程序里打开&#…

【Kurbernetes资源管理】陈述式资源管理方式

陈述式 一、 理论部分1.1 管理K8s资源的基本方法1.1.1 陈述式资源管理方式1.1.2声明式资源管理方式1.1.3 GUI式资源管理方法 1.2 陈述式资源管理方式1.2.1 Kubelet工具简介1.2.2 kubectl 的基本语法1.2.3 Kubectl工具的自动补全功能 1.3 Kubernetes Service1.4 Service 的类型(…

最新Cocos Creator 3.x 如何动态修改3D物体的透明度

Cocos Creator 3.x 的2D UI有个组件UIOpacity组件可以动态修改UI的透明度,非常方便。很多同学想3D物体上也有一个这样的组件来动态的控制与修改3D物体的透明度。今天基于Cocos Creator 3.8 来实现一个可以动态修改3D物体透明度的组件Opacity3D。 对啦&#xff01;这里有个游戏…

机器学习股票大数据量化分析与预测系统 - python 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果UI界面设计web预测界面RSRS选股界面 3 软件架构4 工具介绍Flask框架MySQL数据库LSTM 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 机器学习股票大数据量化分析与预测系统 该项目较为新颖&am…

MSSQL 配置ORACLE ​链接服务器

在有些场景&#xff0c;我们需要整合其他异构数据库的数据。我们可以使用代码去读取&#xff0c;经过处理后&#xff0c;再将数据保存到MSSQL数据库中。如果数据量比较大&#xff0c;但处理的逻辑并不复杂的情况下&#xff0c;这种方式就不是最好的办法。这时可以使用使用链接服…

CSDN每日一题学习训练——Java版(逆序输出、Z 字形变换、输出每天是应该学习还是休息还是锻炼)

版本说明 当前版本号[20231108]。 版本修改说明20231108初版 目录 文章目录 版本说明目录逆序输出题目解题思路代码思路参考代码 Z 字形变换题目解题思路代码思路参考代码 输出每天是应该学习还是休息还是锻炼题目代码思路参考代码 逆序输出 题目 如&#xff1a;abcd1234&…

【714. 买卖股票的最佳时机含手续费】

目录 一、题目解析二、算法原理三、代码实现 一、题目解析 二、算法原理 三、代码实现 class Solution { public:int maxProfit(vector<int>& prices, int fee) {int nprices.size();vector<vector<int>> dp(n,vector<int>(2));dp[0][0]-prices[0…

网络安全深入学习第八课——正向代理(工具:ReGeorg)

文章目录 一、环境配置二、开始模拟1、拿下跳板机的Webshell权限&#xff0c;并上传shell文件1.1、查看跳板机网络环境1.2、查看arp表 2、使用ReGeorg来建立连接2.1、生产ReGeorg隧道文件2.2、上传ReGeorg隧道的PHP脚本到跳板机2.3、连接隧道2.4、尝试浏览器连接 3、使用Proxif…