golang调用智能合约,获取合约函数的返回值
如果不是只读取数据的合约函数,需要异步的执行,因此并不能直接获取到合约函数的返回值,需要等到交易执行完毕,得到确认后才能获取到合约函数的返回值。而且合约函数返回值一般是通过事件日志获取到的。
这里给出一个例子来展示我是如何获取合约函数返回值的。
我使用的以太坊版本为:github.com/ethereum/go-ethereum v1.13.0
solidity合约:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract StoreString {event ItemSetStr(bytes32 indexed hash,string key,string value);mapping (string => string) public itemstr;function setItemstr(string memory _key, string memory _value) external returns(bytes32){itemstr[_key] = _value;bytes32 hash=sha256(abi.encodePacked(_key,_value));emit ItemSetStr(hash,_key,_value);return hash;}
}
这是一个存储键值对的合约,利用函数setItemstr向map中存储键值对,并通过key,value计算哈希值,要求返回哈希值。通过事件ItemSetStr将哈希值(返回值)、key、value记录下来。
将合约的abi编码通过abigen工具生成go代码后。
以下是测试获取合约函数返回值的代码:
func TestSetStoreString(t *testing.T) {url="" //节点链接client, err := ethclient.Dial(url)if err != nil {log.Fatal(err)}//合约地址contractAddress := common.HexToAddress("0xd9Ed5E352F84E182eB499ae1b5F9935C06d78Ddb")privateKeyStr := "" //私钥字符串auth := InitAuth(privateKeyStr, client, nil)//得到合约实例storeString, err := NewStoreString(contractAddress, client)if err != nil {log.Fatal("NewStoreString: ", err)}tx, err := storeString.SetItemstr(auth, "key10", "9900")if err != nil {log.Fatal("SetItemstr: ", err)}//等待交易确认,获取到交易的收据receipt, err := bind.WaitMined(context.Background(), client, tx)if err != nil {log.Fatal("WaitMined: ", err)}//如果交易成功if receipt.Status == 1 {//解析该交易收据里包含的日志eventItemSetStr, err := storeString.ParseItemSetStr(*receipt.Logs[0])if err != nil {log.Fatal("ParseItemSetStr: ", err)}fmt.Println("交易成功!")fmt.Println("txHash:", tx.Hash().Hex())fmt.Println("返回值:", eventItemSetStr.Hash)fmt.Println("日志Key:", eventItemSetStr.Key)fmt.Println("日志Value:", eventItemSetStr.Value)} else {t.Error("交易失败")}}func InitAuth(privateKeyStr string, client *ethclient.Client, value *big.Int) *bind.TransactOpts {privateKeyECDSA, err := crypto.HexToECDSA(privateKeyStr)if err != nil {log.Fatal("crypto.HexToECDSA: ", err)}chainID, err := client.ChainID(context.Background())if err != nil {log.Fatal("ChainID: ", err)}auth, err := bind.NewKeyedTransactorWithChainID(privateKeyECDSA, chainID)if err != nil {log.Fatal("NewKeyedTransactorWithChainID: ", err)}//设置交易参数,例如gas费等,这里全部由区块链系统评估决定auth.GasFeeCap = big.NewInt(1).Mul(big.NewInt(10), big.NewInt(1000000000)) // maxFee Per Gas:100gwei//获取平均小费gasTipCap, err := client.SuggestGasTipCap(context.Background())if err != nil {log.Fatal("SuggestGasTipCap: ", err)}auth.GasTipCap = gasTipCap //priorityfee Per Gas:auth.GasLimit = uint64(3000000)//还需要设置锁定金额auth.Value = valuereturn auth
}
返回值并不能立马获得,需要等待交易成功上链。再从事件日志中解析出返回值。因此这个过程中用到了两个重要代码:
bind包下的WaitMined:等待tx交易的确认,并获取其收据,该收据中必然包含我们想要的日志
func WaitMined(ctx context.Context, b DeployBackend, tx *types.Transaction) (*types.Receipt, error)
合约代码自动生成的go文件中的ParseItemSetStr,传入日志即可解析出信息。
func (_StoreString *StoreStringFilterer) ParseItemSetStr(log types.Log) (*StoreStringItemSetStr, error)
相关文章:
golang调用智能合约,获取合约函数的返回值
如果不是只读取数据的合约函数,需要异步的执行,因此并不能直接获取到合约函数的返回值,需要等到交易执行完毕,得到确认后才能获取到合约函数的返回值。而且合约函数返回值一般是通过事件日志获取到的。 这里给出一个例子来展示我…...
Django3框架-(3)-[使用websocket]:使用channels实现websocket功能;简化的配置和实际使用方式
概述: 对于Django使用channels实现websocket的功能,之前就写了几篇博文了。随着在项目的使用和实际维护来说,重新设置了相关处理方法。 一般来说,前后端都只维护一个全局的连接,通过携带数据来判断具体的操作&#x…...
java-工具类抛异常
不满足条件就会报错,这里的accessors ! null,就是等于空的时候(不满足)就会报错 accessors null; Assert.isTrue(ObjectUtil.isNotEmpty(accessors ! null), "数据为空");...
Navicat连接postgresql数据库 -->华为云服务器
Navicat连接postgresql数据库 -->华为云服务器 2.开放服务器端口:54323.Navicat连接postgresql数据库 2.开放服务器端口:5432 1-1.选择安全组 1-2. 添加规则 1-3.开放5432端口规则 1-4.查看规则 3.Navicat连接postgresql数据库...
Leetcode2086. 从房屋收集雨水需要的最少水桶数
Every day a Leetcode 题目来源:2086. 从房屋收集雨水需要的最少水桶数 解法1:贪心 我们可以对字符串 hamsters 从左到右进行一次遍历。 每当我们遍历到一个房屋时,我们可以有如下的选择: 如果房屋的两侧已经有水桶ÿ…...
Pandas教程(非常详细)(第一部分)
Pandas 库是一个免费、开源的第三方 Python 库,是 Python 数据分析必不可少的工具之一,它为 Python 数据分析提供了高性能,且易于使用的数据结构,即 Series 和 DataFrame。Pandas 自诞生后被应用于众多的领域,比如金融…...
typing.Union` 标注一多种变量类型
typing.Union 标注一多种变量类型 typing.Union 是Python typing 模块中用于标注一个变量可以是多种类型之一的类型提示。在Python 3.10版本及以后,推荐使用 | 运算符代替 Union。不过,在详细介绍 Union 的用法前,值得注意的是在大多数情况下…...
OSPF高级特性
OSPF高级特性(1) 一、OSPF不规则区域类型 产生原因:区域划分不合理,导致的问题 1、非骨干区域无法和骨干区域保持连通 2、骨干区域被分割 造成后果:非骨干区域没和骨干区域相连,导致ABR将不会帮忙转发区域间的路由信息。非骨干区…...
mysql中日期的加减 date_add()、date_sub() 函数
一、说明 DATE_ADD() :从日期增加指定的时间间隔,返回的是一个字符串 DATE_ADD(date,INTERVAL expr type) date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。 type 参数可以是下列值 二、使用 now() //now函数为获取当前时间 sele…...
实在智能携手品牌商家,在活动会面中共谋发展
金秋十月,丰收的季节,也是商家们在双11大展拳脚的时刻。为迎战一年一度的双11大促,品牌商家在10月份卯足劲,制定一系列营销方案,争取为店铺带来更多流量和订单。 其中,舍得、同科医药、梅子熟了、宝洁、维…...
EXSi系统安装与使用
文章目录 EXSi系统安装与使用EXSi系统安装1.打开VMware Workstation软件2.安装系统3.配置虚拟机 使用EXSi登录web页面扩充存储创建虚拟机使用虚拟机 EXSi系统安装与使用 EXSi系统安装 1.打开VMware Workstation软件 创建虚拟机 2.安装系统 等待 回车 F11 回车 回车 设置密码…...
Spring MVC (Next-1)
1.Restful请求 restFul是符合rest架构风格的网络API接口,完全承认Http是用于标识资源。restFul URL是面向资源的,可以唯一标识和定位资源。 对于该URL标识的资源做何种操作是由Http方法决定的。 rest请求方法有4种,包括get,post,put,delete.分别对应获取…...
双目视觉检测 KX02-SY1000型测宽仪 有效修正和消除距离变化对测量的影响
双目视觉检测的基本原理 利用相机测量宽度时,由于单个相机在成像时存在“近大远小”的现象,并且单靠摄入的图像无法知道被测物的距离,所以由被测物的跳动导致的被测物到工业相机之间距离变化,使测量精度难以提高。 因此测宽仪需…...
C++ 面向对象 学习 优秀教程
油管看视频 沉浸式翻译插件,实现中文字幕! 文章目录 Object Oriented Programming (OOP) in C Course Object Oriented Programming (OOP) in C Course https://www.youtube.com/watch?vwN0x9eZLix4 博主:https://www.youtube.com/CodeBeau…...
Python笔记——pyChram连接linux子系统,使用linux下的Python进行编译
Python笔记——pyChram连接linux子系统,使用linux下的Python进行编译 Linux子系统安装与配置安装前准备安装Linux子系统安装Python3.8配置pyCharm 最近要跑的实验里,python有个机器学习的库windows环境下是没有的,在linux环境下有。虚拟机又不…...
【数据结构】数组和字符串(七):特殊矩阵的压缩存储:三元组表的转置、加法、乘法操作
文章目录 4.2.1 矩阵的数组表示4.2.2 特殊矩阵的压缩存储a. 对角矩阵的压缩存储b~c. 三角、对称矩阵的压缩存储d. 稀疏矩阵的压缩存储——三元组表4.2.3三元组表的转置、加法、乘法、操作转置加法乘法算法测试实验结果代码整合 4.2.1 矩阵的数组表示 【数据结构】数组和字符串…...
Spring底层原理(四)
Spring底层原理(四) 本章内容 模拟实现Spring中的几个常见BeanFactory后置处理器 常见的BeanFactory后置处理器 GenericApplicationContext context new GenericApplicationContext(); context.registerBean("config",Config.class); context.registerBean(Conf…...
Android 14 rook替代Postern进行中间人抓包
以下是关于使用Brook替代Postern进行中间人抓包的说明: 先来解释下,为什么用Postern而不用fd,fd属于代理抓包。Postern属于是模拟出来一张虚拟网卡抓包。性质不一样,所以害怕大哥问我。我就先放在这里 在Android 14及之前的版本中…...
[rancher] rancher部署和使用的一些思考
最近因为工作需要,学习调研rancher的使用 k8s作为主流微服务部署的基础,已经逐渐在工作中普及。但是k8s dashboard用于生产管理,还是有所欠缺:我们需要一个k8s之上的管理平台。经过调研,目前rancher已经迭代开发至v2.8…...
迅镭激光董事长颜章健荣膺“2023年如皋市科技强企人物”!
10月28日,2023如皋科技人才洽谈会开幕式在如皋隆重举行。江苏省科学技术厅副厅长、党组成员蒋洪,江苏省商务厅副厅长、党组成员孙津,中共南通市委副书记、政法委书记沈雷,中共如皋市市委书记何益军,中共如皋市委副书记…...
Calico IPIP 使用指南章
本课概览 Microsoft Agent Framework (MAF) 提供了一套强大的 Workflow(工作流) 框架,用于编排和协调多个智能体(Agent)或处理组件的执行流程。 本课将以通俗易懂的方式,帮助你理解 MAF Workflow 的核心概念…...
7个实用技巧掌握MySQL连接查询:INNER JOIN、LEFT JOIN、RIGHT JOIN实战解析
7个实用技巧掌握MySQL连接查询:INNER JOIN、LEFT JOIN、RIGHT JOIN实战解析 【免费下载链接】mysql-tutorial MySQL入门教程(MySQL tutorial book) 项目地址: https://gitcode.com/gh_mirrors/mys/mysql-tutorial MySQL连接查询是数据…...
nli-distilroberta-base部署教程:Kubernetes集群中水平扩展NLI推理服务
nli-distilroberta-base部署教程:Kubernetes集群中水平扩展NLI推理服务 1. 项目概述 nli-distilroberta-base是一个基于DistilRoBERTa模型的自然语言推理(NLI)Web服务,专门用于判断两个句子之间的逻辑关系。这个轻量级模型继承了RoBERTa的强大性能&…...
基于STM32与对射式红外传感器的实时计数系统开发(Keil平台实战)
1. 项目背景与硬件选型 在工业自动化、智能仓储等场景中,物体计数是个高频需求。传统人工计数效率低且易出错,而基于STM32和对射式红外传感器的方案成本不到50元,却能实现99%以上的识别准确率。我去年为某物流分拣中心开发的这套系统&#x…...
打字不如说话,说话不如截图——AI 代码助手的多模态输入实践伺
整体排查思路 我们的目标是验证以下三个环节是否正常: 登录成功时:服务器是否正确生成了Session并返回了包含正确 JSESSIONID的Cookie给浏览器。 浏览器端:浏览器是否成功接收并存储了该Cookie。 后续请求:浏览器在执行查询等操作…...
OpenClaw备份恢复方案:千问3.5-35B-A3B-FP8任务配置的迁移技巧
OpenClaw备份恢复方案:千问3.5-35B-A3B-FP8任务配置的迁移技巧 1. 为什么需要备份OpenClaw配置 上周我的主力开发机突然硬盘故障,导致所有数据丢失。最让我痛心的不是代码,而是精心调校了三个月的OpenClaw自动化工作流——包括对接千问3.5模…...
AI 对 IT 行业的真实冲击:不是狼来了,是狼已经在门口了
JeecgBoot AI专题观察 | 一个深度使用 AI 编程半年的开发者,聊聊这个行业正在发生什么、程序员该怎么办从手写汇编到高级语言,从高级语言到框架,从框架到低代码——每一次技术跃迁,都有人说程序员要失业了。结果呢?需求…...
打卡信奥刷题(3085)用C++实现信奥题 P7095 [yLOI2020] 不离
P7095 [yLOI2020] 不离 题目背景乱玄黄时序,探风林实虚。 我要你共我奇谈怪趣。 任日月斑斓,待春秋兴残。 我要我们有聚无散。——银临《不离》 题目描述 这道题目来自 zxy 哔哔,咕咕让哔哔选一首歌作为题目名,但是哔哔说没有想好…...
设计方案:核心框架搭建与落地实操全指南
当前很多团队在输出设计方案时容易陷入两个极端:要么过度追求创意忽略落地可行性,导致方案最终停留在概念阶段无法产生实际价值;要么完全照搬模板缺乏针对性,无法匹配业务的个性化需求。尤其是电商、新媒体、企业服务等领域的设计…...
5步解决开发者的Mac性能波动难题
5步解决开发者的Mac性能波动难题 【免费下载链接】Turbo-Boost-Switcher Turbo Boost disabler / enable app for Mac OS X 项目地址: https://gitcode.com/gh_mirrors/tu/Turbo-Boost-Switcher 问题溯源:为何你的Mac总是"时快时慢" 当你在进行视…...
