“写下第一个能和以太坊说话的程序,
就像拨通一台星球级计算机的电话。”
在上一讲,我们认识了以太坊的世界观:
它是一台由全世界共同维护的计算机,每个节点都是它的一部分。
这一次,我们不再只做旁观者。
我们将真正与它建立通信。
一、目标:拨通以太坊的电话线
本章的目标非常具体:
使用 Go 语言,通过 JSON-RPC 接口连接以太坊测试网(Sepolia),
并打印当前最新区块号。
听起来很简单,但这一步的意义重大。
它代表着你第一次通过代码,
跨越成千上万台节点,与区块链直接通信。
这就像在浩瀚的星海中,
你发出了属于自己的第一个信号。
二、准备环境:一切从「干净的终端」开始
在开始前,请确保你具备以下条件:
- ✅ 安装 Go 1.21 或以上版本
- ✅ 拥有一个可用的节点服务(推荐使用 Infura 或 Alchemy)
- ✅ 了解如何运行一个最基本的 Go 程序
如果你还没有节点服务,可以这样准备:
- 访问 https://infura.io
- 注册账号 → 创建新项目
- 选择网络:Ethereum → Sepolia Testnet
- 获取 RPC URL,例如:
https://sepolia.infura.io/v3/<YOUR_PROJECT_ID>
💡 提示:
Sepolia 是以太坊官方测试网,你可以在上面做任何实验,而无需使用真实代币。
这使它成为区块链开发的“沙盒宇宙”。
三、Go-Ethereum:连接 EVM 世界的“钥匙”
以太坊官方提供了一个功能完整的 Go 实现,叫 go-ethereum(简称 geth)。
而它的子包 ethclient,正是我们与链交互的核心库。
在终端中执行:
go mod init hello-ethereum
go get github.com/ethereum/go-ethereum
这两步完成后,你的项目便具备了连接 EVM 的全部能力。
四、代码:最小可行的以太坊客户端
创建一个新文件 main.go,输入以下代码:
package main
import (
"context"
"fmt"
"log"
"github.com/ethereum/go-ethereum/ethclient"
)
func main() {
// 1. 连接节点
client, err := ethclient.Dial("https://sepolia.infura.io/v3/<YOUR_PROJECT_ID>")
if err != nil {
log.Fatalf("连接节点失败: %v", err)
}
defer client.Close()
// 2. 获取当前区块号
blockNumber, err := client.BlockNumber(context.Background())
if err != nil {
log.Fatalf("获取区块号失败: %v", err)
}
fmt.Printf("✅ 成功连接到以太坊测试网\n当前最新区块号: %d\n", blockNumber)
}
运行它:
go run main.go
如果一切顺利,你将看到类似输出:
✅ 成功连接到以太坊测试网
当前最新区块号: 5689012
那一刻,你的代码已经在和全球的以太坊节点实时对话。
你从零,完成了与区块链的第一次握手。
五、代码拆解:每一行都在拨动“世界计算机”的齿轮
让我们仔细拆解刚才的几行代码。
1. ethclient.Dial()
这是你连接区块链节点的“拨号”操作。
它底层通过 JSON-RPC over HTTP/WebSocket 协议建立通信通道。
在传统 Web 开发中,我们习惯使用 http.Client 请求 API。
而这里的 ethclient 是对区块链节点 API 的专用封装。
它知道该如何向节点发送 "eth_blockNumber" 方法请求,并解析响应。
2. client.BlockNumber()
这是一次标准的 RPC 调用,
对应底层的 JSON 请求:
{
"jsonrpc": "2.0",
"method": "eth_blockNumber",
"params": [],
"id": 1
}
节点收到请求后,会返回当前链的最新区块号(以十六进制表示)。
go-ethereum 帮我们完成了解码与转换。
3. context.Background()
以太坊交互往往需要网络 I/O。
Go 的 context 是控制超时、取消请求的重要机制。
在更复杂的程序中,我们会用它来防止长时间阻塞,
比如监听区块、轮询事件等。
