abigen使用教程 - go版本

作者:Warson_L日期:2026/2/1

在 Web3 后端开发中,abigen 是一个至关重要的工具。它能根据 Solidity 合约生成的 ABI(应用二进制接口)自动生成 Go 语言代码,让你像调用普通 Go 函数一样调用智能合约。

以下是详细的 abigen 使用教程。


第一步:安装 abigen 工具

abigengo-ethereum 项目的一部分。你可以通过以下命令安装:

1# 安装最新版 abigen
2go install github.com/ethereum/go-ethereum/cmd/abigen@latest
3

**验证安装:**在终端输入 abigen --version。如果看到版本号,说明安装成功。注意:如果提示找不到命令,请确保你的 $GOPATH/bin 已添加到系统的 PATH 环境变量中。


第二步:准备 Solidity 合约

创建一个简单的合约文件 SimpleStorage.sol

1// SPDX-License-Identifier: MIT
2pragma uint256;
3pragma solidity ^0.8.0;
4
5contract SimpleStorage {
6    uint256 private data;
7
8    event DataStored(uint256 newValue);
9
10    function set(uint256 x) public {
11        data = x;
12        emit DataStored(x);
13    }
14
15    function get() public view returns (uint256) {
16        return data;
17    }
18}
19

第三步:获取 ABI 和 Bytecode

要生成 Go 代码,你需要两个东西:

  1. ABI: 描述合约有哪些函数。
  2. Bin (Bytecode): 合约的编译代码(如果你需要通过 Go 部署合约的话)。

方法 A:使用 solc 编译器(本地)

1solc --abi --bin SimpleStorage.sol -o build
2

方法 B:使用 Remix IDE(最简单)

  1. 将代码粘贴到 Remix
  2. 编译合约。
  3. 在 "Compilation Details" 中点击 ABIBytecode 的复制按钮,分别存为 SimpleStorage.abiSimpleStorage.bin

第四步:使用 abigen 生成 Go 绑定

假设你现在有了 SimpleStorage.abiSimpleStorage.bin,运行以下命令:

1abigen --abi SimpleStorage.abi --bin SimpleStorage.bin --pkg store --type SimpleStorage --out storage.go
2

参数解释:

  • --abi: 指定 ABI 文件路径。
  • --bin: 指定 Bin 文件路径(可选,仅调用合约不部署时可不加)。
  • --pkg: 指定生成的 Go 代码的包名(这里设为 store)。
  • --type: 指定生成的 Go 结构体的名称。
  • --out: 指定输出的文件名。

生成成功后,你会看到一个几百行的 storage.go 文件,里面包含了 DeploySimpleStorageSetGet 等函数。


第五步:在 Go 代码中调用(实战例子)

现在我们要写一个 main.go 来调用这个生成的 storage.go。为了确保能跑通,我们连接到你之前的 Sepolia 测试网

目录结构:

1.
2├── SimpleStorage.abi
3├── SimpleStorage.bin
4├── store/
5   └── storage.go      // abigen 生成的文件
6├── main.go
7└── .env
8

main.go 实现代码:

1package main
2
3import (
4	"context"
5	"fmt"
6	"log"
7	"math/big"
8	"os"
9
10	"go-wallet-lite/store" // 替换为你的项目路径/store
11	"github.com/ethereum/go-ethereum/accounts/abi/bind"
12	"github.com/ethereum/go-ethereum/common"
13	"github.com/ethereum/go-ethereum/ethclient"
14	"github.com/joho/godotenv"
15)
16
17func main() {
18	godotenv.Load()
19	
20	// 1. 连接 Sepolia 节点
21	client, err := ethclient.Dial(os.Getenv("RPC_URL"))
22	if err != nil {
23		log.Fatal(err)
24	}
25
26	// 2. 准备合约地址
27	// 这是一个已经在 Sepolia 上部署好的测试合约地址(如果没有,可以换成你自己的)
28	contractAddr := common.HexToAddress("0x7de680214a1f335165c63e903b1e77983636f72a") 
29
30	// 3. 实例化合约
31	instance, err := store.NewSimpleStorage(contractAddr, client)
32	if err != nil {
33		log.Fatal(err)
34	}
35
36	// 4. 调用 Read 方法 (Get)
37	// 查询合约里存的数字
38	value, err := instance.Get(&bind.CallOpts{})
39	if err != nil {
40		log.Fatal(err)
41	}
42	fmt.Printf("当前合约存储的值: %s\n", value.String())
43
44	// 5. 调用 Write 方法 (Set) 
45	// 注意:写操作需要私钥签名,会消耗 Gas
46    /*
47	privateKey, err := crypto.HexToECDSA(os.Getenv("PRIVATE_KEY"))
48	auth, _ := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(11155111)) // Sepolia ChainID
49
50	tx, err := instance.Set(auth, big.NewInt(666)) // 将值设为 666
51	if err != nil {
52		log.Fatal(err)
53	}
54	fmt.Printf("交易已发送,Hash: %s\n", tx.Hash().Hex())
55    */
56}
57

常见坑点总结

  1. 包名不一致abigen 生成时指定的 --pkg store 必须和文件夹名称 store 一致,否则 Go 找不到。
  2. ABI 更新不及时:如果你修改了 Solidity 代码,必须重新生成 ABI 并重新运行 abigen,否则调用时会报错(方法哈希不匹配)。
  3. 大数处理:Solidity 的 uint256 在 Go 中对应的是 *big.Int,不能直接用 int,必须使用 math/big 库。
  4. ChainID:在做“写操作”时,NewKeyedTransactorWithChainID 里的 ChainID 必须传对(Sepolia 是 11155111,主网是 1)。

总结

abigen 的工作流就是:写合约 -> 拿 ABI -> 跑 abigen -> 在 Go 中像调包一样调合约。

建议尝试: 你可以先把 Get 方法跑通(不需要私钥),然后再尝试用私钥跑通 Set 方法。需要我教你如何在 Go 里安全地加载私钥吗?


abigen使用教程 - go版本》 是转载文章,点击查看原文


相关推荐


Verifier-state pruning in BPF
mounter6252026/1/22

The BPF verifier works, on a theoretical level, by considering every possible path that a BPF program could take. As a practical matter, however, it needs to do that in a reasonable amount of time. At the 2025 Linux Plumbers Conference, Mahé Tardy an


Spring设计模式与依赖注入详解
callNull2026/1/14

📚 前言 这是我之前写 项目时的一些理解和感悟, 我喊了AI帮我润色了一下语言文字,发出来了,希望对大家有用 在学习Spring框架时,经常会遇到@Configuration、@Bean、@Service、@Resource等注解,以及各种设计模式的应用。本文通过具体的代码示例(MailConfig和MailService),深入浅出地解释这些概念,帮助理解Spring的核心机制。 🎯 核心问题 问题1:为什么需要@Configuration和@Bean? 问题2:为什么没有注解的类也能被@


多模态大模型有哪些模态?
智泊AI2026/1/6

“多模态”中的“模态”(modality),即指各类数据形式或信息来源。在多模态大模型中,典型模态涵盖以下类别: 更多AI大模型学习视频及资源,都在智泊AI。 文本模态‌: 涵盖自然语言文本、经语音识别转换的文本内容等。 图像模态‌: 指视觉图像数据,例如照片、插画、艺术作品等。 视频模态‌: 包含动态影像序列,如短视频、影视片段、监控录像等。 音频模态‌: 指声学信号数据,如人声、音乐、环境音效等。 其他模态‌: 还包括如环境传感器读数、生理信号、指纹、虹膜等非传统信息形式。 多模态模型的


旮旯c语言三个任务
宇宙超级无敌暴龙战士2025/12/29

#include <stdio.h> // 任务1:计算数组元素和 int getArrSum(int arr[], int len) { int sum = 0; for (int i = 0; i < len; i++) { sum += arr[i]; } return sum; } // 任务2:获取数组最大值 int getArrMax(int arr[], int len) { int max = arr[0]; f


python+django/flask+vue基于spark的西南天气数据的分析与应用系统
Q_Q5110082852025/12/19

目录 项目介绍本项目具体实现截图开发技术大数据类设计开发的基本流程是:论文大纲结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 项目介绍 系统功能 数据采集与清洗:系统通过爬虫技术从多个天气预报网站抓取西南地区的实时天气数据,并通过Spark SQL对数据进行并行计算,提取关键气象指标,并进行多维度分析,如空气质量、降水量、风速等。 数据处理与分析:系统利用Spark对天气数据进行分布式存储与处理,通过数据分析,实时展示西南地区的空气质量、温度变化、降水量、风


Flutter的核心优势
小a彤2025/12/11

欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。#### Flutter:开发效率神器详解 Flutter作为Google推出的跨平台开发框架,凭借其高效的开发体验和出色的性能表现,成为众多开发者的首选。其核心优势在于"一次编写,多端运行"的核心理念,同时提供超过2000个现成的Widget组件库和强大的工具链,显著提升开发效率达30%-50%。 Flutter的核心优势 跨平台一致性 Flutter使用自绘引擎(Skia)直接渲染UI,完全避免了平台原生控件的依赖,确


LLM 扫盲:什么是 Tokens?
mCell2025/12/2

同步至个人网站:LLM扫盲: 什么是tokens LLM 基础:什么是 Tokens? GPT 5.1 发布已经有一段时间了,LLM(大语言模型)的能力边界再一次被拓宽。对于应用开发者而言,虽然模型越来越智能,但 API 的计费逻辑和底层限制依然没有变:Token 始终是那个核心计量单位。 很多人对 Token 有误解,认为它等同于字符(Character)或单词(Word)。这种误解往往导致两个问题:一是预估 API 成本时出现较大偏差,二是无法精确控制 Prompt 的上下文长度,导致模型


Claude Code Agent Teams:3个AI同时写代码,底层原理和主流框架对比
易安说AI2026/2/10

大家好,我是易安,AI超级个体,大厂程序员二孩奶爸。 Claude Opus 4.6 带来了 Agent Teams 功能,可以让多个 Claude Code 实例并行工作。我用它做了个小项目,踩了一些坑,也顺便把底层原理和市面上几个主流多 Agent 框架做了个对比。这篇文章干货比较多,建议收藏。 Agent Teams 到底是什么 简单说就是一个 Lead Agent 可以 spawn 出多个 Teammate Agent,每个 Teammate 是一个完全独立的 Claude Code 会


【Python练习五】Python 正则与网络爬虫实战:专项练习(2道经典练习带你巩固基础——看完包会)
纯.Pure_Jin(g)2026/2/18

第一题 题目: 使用正则完成下列内容的匹配 匹配陕西省区号 029-12345匹配邮政编码 745100匹配邮箱 lijian@xianoupeng.com匹配身份证号 62282519960504337X 代码: import re # 1. 匹配陕西省区号 029-12345 pattern_area = r'^029-\d{5}$' # 精确匹配 029- 开头,后接5位数字 test_area = '029-12345' print("区号匹配:", re.match(pattern_


一文搞懂激活函数!
aicoting2026/2/27

推荐直接网站在线阅读:aicoting.cn 在深度学习中,激活函数(Activation Function)是神经网络的灵魂。它不仅赋予网络非线性能力,还决定了训练的稳定性和模型性能。那么,激活函数到底是什么?为什么我们非用不可?有哪些经典函数?又该如何选择? 所有相关源码示例、流程图、模型配置与知识库构建技巧,我也将持续更新在Github:AIHub,欢迎关注收藏! 1. 什么是激活函数,为什么需要激活函数 激活函数的核心作用就是为神经网络引入非线性。 为什么需要非线性? 想象一下,如果

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客