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

news2024/10/7 6:39:39

因为工作中遇到一些问题考虑使用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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字滤波器分析---相位响应

数字滤波器分析---相位响应 MATLAB 函数可用于提取滤波器的相位响应。在给定频率响应的情况下&#xff0c;函数 abs 返回幅值&#xff0c;angle 返回以弧度为单位的相位角。要使用 fvtool 查看巴特沃斯滤波器的幅值和相位&#xff0c;请使用&#xff1a; d designfilt(lowpa…

Linux应用开发基础知识——Framebuffer 应用编程(四)

前言&#xff1a; 在 Linux 系统中通过 Framebuffer 驱动程序来控制 LCD。Frame 是帧的意 思&#xff0c;buffer 是缓冲的意思&#xff0c;这意味着 Framebuffer 就是一块内存&#xff0c;里面保存着 一帧图像。Framebuffer 中保存着一帧图像的每一个像素颜色值&#xff0c;假设…

2023年9月少儿编程 中国电子学会图形化编程等级考试Scratch编程二级真题解析(选择题)

2023年9月scratch编程等级考试二级真题 选择题(共25题,每题2分,共50分) 1、点击绿旗,运行程序后,舞台上的图形是 A、画笔粗细为4的三角形 B、画笔粗细为5的六边形 C、画笔粗细为4的六角形 D、画笔粗细为5的三角形 答案:D 考点分析:考查积木综合使用,重点考查画笔…

100 寻找重复数

寻找重复数 题解1 二分法题解2 快慢指针(同环形链表2(ab)(ab)kL) 给定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 &#xff0c;返…

LDR6023AQ-PDHUB最简外围成本低搂到底就是干

USB-C PD协议里&#xff0c;SRC和SNK双方之间通过CC通信来协商请求确定充电功率及数据传输速率。当个设备需要充电时&#xff0c;它会发送消息去给适配器请求充电&#xff0c;此时充电器会回应设备的请求&#xff0c;并告知其可提供的档位功率&#xff0c;设备端会根据适配器端…

@JSONField或@JsonProperty注解使用

一、需求 使用JSONField或JsonProperty注解&#xff0c;来解决bean与json字段不一致问题&#xff0c;或者字段定义不符合前端所需要的标准&#xff0c;最近在项目中发现实体类属性中&#xff0c;同时使用了JSONField和JsonProperty注解&#xff0c;用于重新声明属性key。有时候…

数字滤波器分析---频率响应

数字滤波器分析---频率响应 幅值、相位、冲激和阶跃响应、相位和群延迟、零极点分析。 分析滤波器的频域和时域响应。可视化复平面中的滤波器极点和零点。 频率响应 数字域 freqz 使用基于 FFT 的算法来计算数字滤波器的 Z 变换频率响应。具体来说&#xff0c;语句 [h,w]…

Android jetpack compose 组件学习

官网地址&#xff1a;https://developer.android.com/jetpack/compose/tutorial?hlzh-cn 一、写一个 hello world 在New Project的时候选择Photo and Tablet里的Empty Compose Activity&#xff0c;如下所示&#xff1a; 打开这个project之后&#xff0c;可以看到MainActivit…

重新定义客户服务 UniPro Mailhandler 彻底改变团队处理请求模式

现代企业管理越精细越专业&#xff0c;涉及到的跨团队、跨组织之间的高效协作程度越高。如果没有趁手的协作工具加持&#xff0c;协作过程中必然会出现一些问题&#xff1a; 信息查找低效&#xff0c;例如找人、找部门&#xff0c;不清楚任务分配该找谁&#xff1b; 信息传达…

leetcode刷题 - SQL - 中等

1. 176. 第二高的薪水 筛选出第二大 查询并返回 Employee 表中第二高的薪水 。如果不存在第二高的薪水&#xff0c;查询应该返回 null(Pandas 则返回 None) 。查询结果如下例所示。 666中等的第一题就上强度 强行解法 select max(salary) as SecondHighestSalary from Emp…

模型剪枝算法——L1正则化BN层的γ因子

ICCV在2017年刊登了一篇经典论文《 Learning Efficient Convolutional Networks through Network Slimming》。在神经网络的卷积操作之后会得到多个特征图&#xff0c;通过策略突出重要的特征达到对网络瘦身的目的。在该论文中使用的剪枝策略就是稀疏化BN层中的缩放因子 。 Bat…

NSS [鹏城杯 2022]压缩包

NSS [鹏城杯 2022]压缩包 考点&#xff1a;条件竞争/逻辑漏洞&#xff08;解压失败不删除已经解压文件&#xff09; 参考&#xff1a;回忆phpcms头像上传漏洞以及后续影响 | 离别歌 (leavesongs.com) 源码有点小多 <?php highlight_file(__FILE__);function removedir($…

【Python】 Python 使用 Pillow 处理图像:几何变换

Python 使用 Pillow 处理图像&#xff1a;几何变换 pillow库操作切片、旋转、滤镜、输出文字、调色板等功能一应俱全。 1. 几何变换 Image 包含调整图像大小 resize() 和旋转 rotate() 的方法。前者采用元组给出新的大小&#xff0c;后者采用逆时针方向的角度。 调整大小并…

视频批量剪辑:AI智剪入门,轻松掌握智能剪辑技巧

在数字媒体时代&#xff0c;视频剪辑已经成为一项必备的技能。无论是为了工作需要&#xff0c;还是为了在社交媒体上分享生活&#xff0c;掌握视频剪辑技巧都能为我们的生活和工作带来很多便利。然而&#xff0c;对于初学者来说&#xff0c;视频剪辑可能是一项艰巨的任务。现在…

1210. 连号区间数(枚举)

题目&#xff1a; 1210. 连号区间数 - AcWing题库 思路&#xff1a;枚举 枚举一般是先暴力再优化。 注意&#xff1a;对于区间的枚举&#xff0c;一般是定一移一。固定任何一端移动另外一端均可以。但是此题为便于在枚举移动端的过程中确定最大最小&#xff0c;选择定左移右…

银行测试丨信贷长链路业务测试数据快速构造方法,了解一下

一、引言 随着银行数字化转型的不断深入&#xff0c;对信贷领域的测试工作提出了更高的标准和要求&#xff0c;如何在高效完成测试任务的同时确保测试质量就成了一个亟待解决的难题。有实践研究表明&#xff0c;在具体测试过程中往往大量的时间精力都是耗费在测试数据准备工作…

原神私服搭建服务器配置该如何选择

原神是一款开放世界的冒险游戏&#xff0c;自从这款游戏上线以来&#xff0c;就受到越来越多的玩家喜欢&#xff0c;因为这款游戏的设定比较少见&#xff0c;剧情也非常精彩&#xff0c;有一些玩家为了更好的游戏体验想要搭建原神的私服&#xff0c;满足玩家的需求&#xff0c;…

【云栖2023】王峰:开源大数据平台3.0技术解读

本文根据2023云栖大会演讲实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a;王峰 | 阿里云研究员&#xff0c;阿里云计算平台事业部开源大数据平台负责人 演讲主题&#xff1a;开源大数据平台3.0技术解读 实时化与Serverless是开源大数据3.0时代的必然选…

提升采购订单管理效率的五个最佳实践

企业每年都要订购成千上万的商品和服务。公司运营和发展所需的一切都来自庞大的供应商网络&#xff0c;而沟通这些需求的主要方式是通过采购订单。 由于所有订单都会流经系统&#xff0c;而且每个月都会发生数千元不等的供应支出&#xff0c;因此掌握采购订单流程成为重中之重…

2023年云计算发展趋势浅析

​​​​​​​ 云计算的概念 云计算是一种通过互联网提供计算资源和服务的模式。它允许用户通过网络访问和使用共享的计算资源&#xff0c;而无需拥有或管理这些资源的物理设备。云计算的核心理念是将计算能力、存储资源和应用程序提供给用户&#xff0c;以便随时随地根据需要…