Derick
924 words
5 minutes
连接区块链 —— 你的第一个 Go-EVM 程序

“写下第一个能和以太坊说话的程序,

就像拨通一台星球级计算机的电话。”

在上一讲,我们认识了以太坊的世界观:

它是一台由全世界共同维护的计算机,每个节点都是它的一部分。

这一次,我们不再只做旁观者。

我们将真正与它建立通信


一、目标:拨通以太坊的电话线#

本章的目标非常具体:

使用 Go 语言,通过 JSON-RPC 接口连接以太坊测试网(Sepolia),

并打印当前最新区块号。

听起来很简单,但这一步的意义重大。

它代表着你第一次通过代码,

跨越成千上万台节点,与区块链直接通信。

这就像在浩瀚的星海中,

你发出了属于自己的第一个信号。


二、准备环境:一切从「干净的终端」开始#

在开始前,请确保你具备以下条件:

  • ✅ 安装 Go 1.21 或以上版本
  • ✅ 拥有一个可用的节点服务(推荐使用 Infura 或 Alchemy)
  • ✅ 了解如何运行一个最基本的 Go 程序

如果你还没有节点服务,可以这样准备:

  1. 访问 https://infura.io
  2. 注册账号 → 创建新项目
  3. 选择网络:Ethereum → Sepolia Testnet
  4. 获取 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 是控制超时、取消请求的重要机制。

在更复杂的程序中,我们会用它来防止长时间阻塞,

比如监听区块、轮询事件等。


连接区块链 —— 你的第一个 Go-EVM 程序
https://blog.ithuo.net/posts/blockchain-tutorial-evm-2/
Author
Derick
Published at
2024-12-06