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

📅 2026/7/12 12:14:45
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