使用go与智能合约交互之使用abigen生成合约go文件进行调用

chatgpt/2023/9/26 15:09:11

前两篇文章,我们讲解了go如何通过函数选择器、abi调用的方式与智能合约交互,那么有没有一种更加便捷的方式(就好像调用预先定义好的方法一样)与智能合约交互呢?答案是有的,本章我们就来学习一下如何使用abigen生成合约go文件并进行调用

本系列课程:

第一节:使用go与智能合约交互之函数选择器调用

第二节:使用go与智能合约交互之abi调用

第三节:使用go与智能合约交互之使用abigen生成合约go文件进行调用

一、配置环境

1、安装 go-ethereum

 首先我们要安装 go-ethereum,本篇文章是在windows系统下操作,其他系统操作步骤基本类似,可自行参考安装

 下载完成之后 直接默认/自定义目录安装即可,安装完成后我们打开安装目录,可以看到里面有很多.exe后缀的可执行文件

 2、配置环境变量

右键我的电脑-》高级系统设置-》环境变量-》系统变量,找到Path这个变量,然后点编辑按钮,在里面添加我们刚刚的安装目录,如下:

然后我们打开 命令行终端,快捷键:windows+R,输入cmd,然后回车

能正确输出安装版本号证明我们环境变量已经配置成功

二、通过abigen生成go文件

1、准备智能合约编译后生成的abi.json

(不知道怎么生成的可关注公众号私信我)

[{"inputs": [],"stateMutability": "nonpayable","type": "constructor"},{"anonymous": false,"inputs": [{"indexed": true,"internalType": "address","name": "owner","type": "address"},{"indexed": true,"internalType": "address","name": "spender","type": "address"},{"indexed": false,"internalType": "uint256","name": "value","type": "uint256"}],"name": "Approval","type": "event"},……
]

 2、通过abigen生成go文件

2.1、我们先打开一个命令行终端,然后路径先跳转到我们的abi.json存放目录下

2.2、在命令行终端输入以下命令:

abigen --abi abi.json --pkg main --type Token --out Token.go

--abi abi.json 为我们要通过abigen生成go文件的 源文件路径

--pkg main 为我们要生成go文件里面的包名(生成的go文件第一行代码 如:package main)

 --type Token 为我们生成go文件里可操作对象/方法/变量的组成部分,比如我这里写的是Token,那么生成的go文件里面的代码格式大概如下:

可以看到,里面无论是结构体、方法、变量,均会以该名字进行命名

--out Token.go 为生成go文件的名称 (ps:如果省略此命令,生成的go文件内容会打印在命令行终端上)

我们执行此命令后,可以看到当前目录下多了一个Token.go的文件,我们打开看一下:

// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.package mainimport ("errors""math/big""strings"ethereum "github.com/ethereum/go-ethereum""github.com/ethereum/go-ethereum/accounts/abi""github.com/ethereum/go-ethereum/accounts/abi/bind""github.com/ethereum/go-ethereum/common""github.com/ethereum/go-ethereum/core/types""github.com/ethereum/go-ethereum/event"
)// Reference imports to suppress errors if they are not otherwise used.
var (_ = errors.New_ = big.NewInt_ = strings.NewReader_ = ethereum.NotFound_ = bind.Bind_ = common.Big1_ = types.BloomLookup_ = event.NewSubscription_ = abi.ConvertType
)// TokenMetaData contains all meta data concerning the Token contract.
var TokenMetaData = &bind.MetaData{ABI: "……"
}
var TokenABI = TokenMetaData.ABI// Token is an auto generated Go binding around an Ethereum contract.
type Token struct {TokenCaller     // Read-only binding to the contractTokenTransactor // Write-only binding to the contractTokenFilterer   // Log filterer for contract events
}
func (_Token *TokenSession) BalanceOf(account common.Address) (*big.Int, error) {return _Token.Contract.BalanceOf(&_Token.CallOpts, account)
}
func (_Token *TokenTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {return _Token.Contract.contract.Transfer(opts)
}
…………

可以看到,里面定义了很多结构体以及我们在合约里定义的方法在go文件里都有具体的实现,其实就是abigen帮我们把我们合约里定义的方法转成了go可以直接调用的方法,从而简化了我们的操作

三、使用go调用生成的智能合约go文件

1、安装go-ethereum

go get -u github.com/ethereum/go-ethereum

2、新建main.go文件,添加依赖

	"context""fmt""github.com/ethereum/go-ethereum/accounts/abi/bind""github.com/ethereum/go-ethereum/common""github.com/ethereum/go-ethereum/crypto""github.com/ethereum/go-ethereum/ethclient""math/big""os"

3、定义常量

const (privateKey      = "你的钱包私钥"contractAddress = "调用合约地址"toAddress       = "接收转账地址" //这里我使用transfer方法作为案例,所以需要一个接收转账地址
)

4、调用演示

4.1、新建main方法

func main() {}

 4.2、创建ethclient对象

client, err := ethclient.Dial("https://goerli.infura.io/v3/3214cac49d354e48ad196cdfcefae1f8")
if err  != nil {fmt.Println("ethclient.Dial error : ", err)os.Exit(0)
}

4.3、创建智能合约对象

token, err := NewToken(common.HexToAddress(contractAddress), client)
if err != nil {fmt.Println("NewToken error : ", err)
}

 

4.4、方法调用

4.4.1、call方法演示

call方法主要用来调用智能合约的查询方法(即不修改链上数据,不花费gas

这里,我们调用的是智能合约的TotalSupply方法,它会返回该智能合约(本案例以ERC20 为例)的总供应量

totalSupply, err := token.TotalSupply(nil)
if err != nil {fmt.Println("token.TotalSupply error : ", err)
}
fmt.Println("totalSupply is : ", totalSupply)

可以看到,控制台成功打印出返回信息

4.4.2、send方法演示

send方法,主要用来调用智能合约里会修改链上数据的方法(花费gas) 

我们以Transfer方法为例,进行一笔账号之间的转账操作:

	// 获取当前区块链的ChainIDchainID, err := client.ChainID(context.Background())if err != nil {fmt.Println("获取ChainID失败:", err)return}privateKeyECDSA, err := crypto.HexToECDSA(privateKey)if err != nil {fmt.Println("crypto.HexToECDSA error ,", err)return}gasTipCap, _ := client.SuggestGasTipCap(context.Background())//构建参数对象opts, err := bind.NewKeyedTransactorWithChainID(privateKeyECDSA, chainID)if err != nil {fmt.Println("bind.NewKeyedTransactorWithChainID error ,", err)return}//设置参数opts.GasFeeCap = big.NewInt(108694000460)opts.GasLimit = uint64(100000)opts.GasTipCap = gasTipCapamount, _ := new(big.Int).SetString("100000000000000000000", 10)//调用合约transfer方法tx, err := token.Transfer(opts, common.HexToAddress(toAddress), amount)if err != nil {fmt.Println("token.Transfer error ,", err)return}fmt.Println("使用go调用智能合约第三讲:transfer tx : ", tx.Hash().Hex())

成功返回哈希值,让我们去区块链浏览器里看一下 

 

可以看到链上交易已经完成

到此,使用go与智能合约的教程全部完成,你学会了吗?没有学会不要紧,多做两遍,熟能生巧,你一定也可以的!如果在学习过程中有任何问题,欢迎给我留言,另外公众号也会不定期分享关于区块链、web3的前沿信息,感兴趣的朋友可以保持关注

 请关注公众号:外柏叁布道者(web3_preacher,回复 “go合约调用” 领取完整代码

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

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

DataSphere Studio - 1.1.0安装部署 (单机版)

不要采用这种安装方式!!全部服务启动成功,不报错。页面还是各种报错,效率非常低下。 感谢微信群各位大佬帮助,分享了社区优秀文章中一键自动化部署脚本。 喝咖啡,自动部署,课本上故事成真。 自…

【玩转pandas系列】数据清洗(文末送书福利)

文章目录 一、重复值检测二、元素替换1️⃣ 元素替换replace2️⃣ 数据映射map 三、修改索引1️⃣ 修改索引名rename2️⃣ 设置索引和重置索引 四、数据处理1️⃣ apply与applymap2️⃣ transform 五、异常值处理六、抽样聚合函数1️⃣ 抽样2️⃣ 数学函数 七、分组聚合&#x…

价值 1k 嵌入式面试题-计算机网络 OSI

开门见山 请讲下 OSI 各层协议的主要功能? 常见问题 回答不系统回答不确切无法和实际网络协议做关联对应 答题思路 OSI 代表了开放互联系统中信息从一台计算机的一个软件应用流到另一个计算机的另一个软件应用的参考模型 OSI 包含 7 层,每一层负责特…

多线程(JavaEE初阶系列6)

目录 前言: 1.什么是线程池 2.标准库中的线程池 3.实现线程池 结束语: 前言: 在上一节中小编带着大家了解了一下Java标准库中的定时器的使用方式并给大家实现了一下,那么这节中小编将分享一下多线程中的线程池。给大家讲解一…

如何少走弯路?蚓链助力零售企业实现数字化转型

基于大环境下的数据驱动,创新业务模式成为了后疫情时代下零售企业冲破困局、拓展业务的必然趋势,新零售概念应运而生。新零售结合数字化应用技术为传统零售企业打造线上营销生态链,帮助企业积累数据,盘活数据实现更大营收价值。 …

快速响应,上门维修小程序让您享受无忧生活

随着科技的不断发展和智能手机的普及,上门维修小程序成为了现代人生活中越来越重要的一部分。上门维修小程序通过将维修服务与互联网相结合,为用户提供了更加便捷、高效的维修服务体验。下面将介绍上门维修小程序开发的优势。   提供便捷的预约方式&am…

idea如何加快创建Maven项目的速度

一、下载archetype-catalog.xml 下载archetype-catalog.xml的地址 二、配置 以下所说的配置都指全局配置 配置Maven -DarchetypeCataloglocal -Dfile.encodinggbk

opencv04-掩膜

opencv04-掩膜 抠图 #include <iostream> #include <opencv2/highgui/highgui.hpp> #include <opencv2/opencv.hpp> #include <vector> #include <array> #include <algorithm>using namespace std; using namespace cv;int main() {str…
推荐文章