Foundry 架构实战:Go 后端读取本地部署区块链信息全流程

发布时间:2026/9/28 1:58:15

Foundry 架构实战:Go 后端读取本地部署区块链信息全流程
1. 引言在区块链开发中,本地测试环境是快速迭代和调试智能合约的关键。Foundry 作为新一代的以太坊开发工具链,以其极快的编译速度和原生 Solidity 测试支持而备受青睐。然而,在实际项目中,我们通常需要让后端服务(如 Go 应用)能够与本地部署的区块链进行交互,读取合约状态、监听事件或发送交易。本文将详细介绍从启动本地 Anvil 节点、部署智能合约,到使用 Go 后端连接并读取区块链信息的完整实战流程。通过一步步的演示,你将掌握如何搭建一个完整的本地开发环境,并让 Go 应用与区块链无缝对接。2. 环境准备与工具安装2.1 安装 Foundry首先,确保你的系统已安装 Foundry。可以通过以下命令安装:curl-Lhttps://foundry.paradigm.xyz|bashfoundryup安装完成后,验证安装:forge--versionanvil--versioncast--version2.2 创建 Foundry 项目创建一个新的 Foundry 项目:forge init foundry-democdfoundry-demo项目结构如下:foundry-demo/ ├── script/ # 部署脚本 ├── src/ # Solidity 合约 ├── test/ # 测试文件 ├── foundry.toml # 配置文件 └── lib/ # 依赖库2.3 准备 Go 开发环境确保已安装 Go(1.18+)并设置好 GOPATH:go version3. 启动本地区块链节点使用 Anvil 启动一个本地开发节点:anvil启动后,你将看到类似以下输出:_ _ (_) | | __ _ _ __ __ __ _ | | / _` | | '_ \ \ \ / / | | | | | (_| | | | | | \ V / | | | | \__,_| |_| |_| \_/ |_| |_| 1.5.1-stable (b0a9dd9ced 2025-12-22T11:39:01.425730780Z) https://github.com/foundry-rs/foundry Available Accounts ================== (0) 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 (10000.000000000000000000 ETH) (1) 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 (10000.000000000000000000 ETH) (2) 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC (10000.000000000000000000 ETH) (3) 0x90F79bf6EB2c4f870365E785982E1f101E93b906 (10000.000000000000000000 ETH) (4) 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 (10000.000000000000000000 ETH) (5) 0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc (10000.000000000000000000 ETH) (6) 0x976EA74026E726554dB657fA54763abd0C3a0aa9 (10000.000000000000000000 ETH) (7) 0x14dC79964da2C08b23698B3D3cc7Ca32193d9955 (10000.000000000000000000 ETH) (8) 0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f (10000.000000000000000000 ETH) (9) 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 (10000.000000000000000000 ETH) Private Keys ================== (0) 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 (1) 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d (2) 0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a (3) 0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6 (4) 0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a关键信息说明:RPC URL:http://localhost:8545(默认端口)链 ID: 31337(Anvil 默认)预充值账户: 10 个测试账户,每个有 10000 ETH私钥: 与账户一一对应,用于签名交易保持 Anvil 终端运行,这是我们的本地区块链节点。4. 编写并部署智能合约4.1 创建简单 ERC20 合约在src/SimpleERC20.sol中创建合约:// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; contract SimpleERC20 is ERC20, Ownable { constructor( string memory name, string memory symbol, uint256 initialSupply ) ERC20(name, symbol) Ownable(msg.sender) { _mint(msg.sender, initialSupply * 10 ** decimals()); } }4.2 创建部署脚本在script/DeploySimpleERC20.s.sol中创建部署脚本:// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "forge-std/Script.sol"; import "../src/SimpleERC20.sol"; contract DeploySimpleERC20 is Script { function run() external returns (SimpleERC20 token) { vm.startBroadcast(); token = new SimpleERC20( "MyToken", "MTK", 1_000_000 // 初始供应量 ); vm.stopBroadcast(); } }4.3 部署合约到本地节点使用 Forge 脚本部署合约:forge script script/DeploySimpleERC20.s.sol\--rpc-url http://localhost:8545\--broadcast\--private-key 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d\--tcDeploySimpleERC20部署成功后,你将看到:[⠊] Compiling... No files changed, compilation skipped Script ran successfully. == Return == token: contract SimpleERC20 0x8464135c8F25Da09e49BC8782676a84730C318bC == Logs == Contract deployed at: 0x8464135c8F25Da09e49BC8782676a84730C318bC Token Name: MyToken Token Symbol: MTK Initial Supply: 1000000 Owner: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8关键信息记录:合约地址:0x8464135c8F25Da09e49BC8782676a84730C318bC合约所有者:0x70997970C51812dc3A010C7d01b50e0d17dc79C8(账户1)5. 生成 Go 绑定文件5.1 提取 ABI 和字节码首先,从编译输出中提取 ABI 和字节码:# 提取 ABIjq .abi out/SimpleERC20.sol/SimpleERC20.jsonSimpleERC20.abi# 提取字节码jq-r.bytecode.object out/SimpleERC20.sol/SimpleERC20.jsonSimpleERC20.bin5.2 使用 abigen 生成 Go 绑定确保已安装abigen(通常随geth安装):# 安装 geth(如果未安装)# 或者直接下载 abigen# 生成 Go 绑定文件abigen--abiSimpleERC20.abi--binSimpleERC20.bin--pkgsrc--out./src/simpleerc20.go生成的simpleerc20.go文件包含:合约结构体定义合约方法绑定事件监听器交易发送方法6. 编写 Go 后端应用6.1 初始化 Go 模块go mod init foundry-demo6.2 安装依赖go get github.com/ethereum/go-ethereum go mod tidy6.3 创建主程序创建main.go:packagemainimport("context""fmt""log""math/big""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""foundry-demo/src"// 导入生成的绑定包)funcmain(){// 1. 连接本地 Anvil 节点client,err:=ethclient.Dial("http://localhost:8545")iferr!=nil{log.Fatalf("Failed to connect to the Ethereum client: %v",err)}deferclient.Close()// 2. 设置合约地址contractAddress:=common.HexToAddress("0x8464135c8F25Da09e49BC8782676a84730C318bC")// 3. 创建合约实例instance,err:=src.NewSimpleERC20(contractAddress,client)iferr!=nil{log.Fatalf("Failed to instantiate contract: %v",err)}// 4. 读取合约信息(只读调用)ctx:=context.Background()// 获取代币名称name,err:=instance.Name(bind.CallOpts{Context:ctx})iferr!=nil{log.Fatalf("Failed to get token name: %v",err)}log.Printf("Token name: %s",name

相关新闻

Unity微信小游戏发布实战:IIS本地测试、跨域问题与完整上线指南

Unity微信小游戏发布实战:IIS本地测试、跨域问题与完整上线指南

2026/9/3 14:01:05

1. 项目概述:从引擎到小游戏的“最后一公里”如果你正在用团结引擎(Unity)开发微信小游戏,并且已经完成了核心玩法和美术资源的制作,那么恭喜你,你已经走完了90%的路。但剩下的10%,尤其是从本地…

压电蜂鸣器与PIC微控制器的环境警报系统设计

压电蜂鸣器与PIC微控制器的环境警报系统设计

2026/9/26 23:41:28

1. 项目概述:基于压电蜂鸣器与微控制器的环境警报系统 在工业控制、安防设备和智能家居场景中,可靠的声音警报始终是不可替代的人机交互方式。最近我在一个冷链监控项目中,需要为不同环境(-20℃冷库到50℃户外)设计通用…

PIC单片机实现锂电池组电压主动均衡系统设计

PIC单片机实现锂电池组电压主动均衡系统设计

2026/8/24 12:37:44

1. 项目背景与需求分析在锂离子电池组应用中,电压平衡是确保电池安全性和延长使用寿命的关键技术。当多节电池串联使用时,由于制造工艺差异、温度分布不均等因素,各单体电池的充电状态会出现不一致,导致某些电池过充或过欠压&…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/26 19:14:12

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/27 1:30:29

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/27 1:30:37

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/27 1:30:35

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/27 1:30:34

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/26 16:36:51

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/26 14:29:04

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/26 13:57:22

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/26 23:35:16

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…