一、geth 是什么:一台会同步账本的以太坊服务器

入门

以太坊可以理解成一份在全球无数电脑之间共享的账本,每笔交易、每个智能合约的状态都记录在上面。geth(Go Ethereum)就是用来保存这份账本的软件,它是以太坊协议的执行层客户端,负责处理交易、维护账本数据,并对外提供查询接口。

go-ethereum 仓库主页

如果你只是想通过第三方服务商查询以太坊数据,其实不需要自己跑节点。但假如你希望自己验证数据、搭建测试环境、开发智能合约,或者给团队提供一个稳定的本地以太坊入口,那 geth 就很合适。它像一个全天候运转的“管家”,持续从其他节点下载新区块、核对内容,并更新本地账本。

二、安装前的准备:这台机器需要什么

入门

运行 geth 节点不只是安装软件,它还需要下载和保存整个以太坊账本,因此对硬件和网络有一定要求。建议准备一台能联网的 Linux 服务器,推荐 Ubuntu 22.04 或更高版本。

基本配置建议如下:

  • CPU:4 核以上
  • 内存:8 GB 以上
  • 硬盘:2 TB 以上的高性能 SSD
  • 网络:下行带宽至少 8 Mbit/s

硬盘空间是最容易忽略的问题。以太坊全量账本会持续增长,建议保留余量,避免同步到一半失败。

如果你打算用源码编译 geth,还需要满足两个额外条件:Go 语言环境 1.25 以上,以及 C 编译器(如 gcc)。这些是编译过程所需的基础工具,普通用户如果只使用官方编译好的二进制文件,可以忽略。

三、安装 geth:三种常见方式

进阶 · 推荐细读

官方提供了预编译二进制包,也支持用包管理器和源码安装。下面按推荐顺序介绍。

方式一:用 Ubuntu PPA 安装

这是最省事的方式,适合 Ubuntu/Debian 用户。

sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt update
sudo apt install -y ethereum

方式二:下载官方二进制文件

如果你不想添加额外软件源,可以直接从官网下载压缩包。访问 geth 下载页,选择 Linux amd64 版本。

wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.14.12-stable.tar.gz
tar -xzf geth-linux-amd64-1.14.12-stable.tar.gz
sudo cp geth-linux-amd64-1.14.12-stable/geth /usr/local/bin/geth

注意把文件名中的版本号替换成你实际下载的版本。安装完成后可以检查版本:

geth version

输出类似:

Geth
Version: 1.14.12-stable
Git Commit: abcdef...
Go Version: go1.22.5

方式三:源码编译

适合需要定制或想验证二进制文件来源的进阶用户。先安装 Go 1.25 以上和 gcc,然后执行:

git clone https://github.com/ethereum/go-ethereum.git
cd go-ethereum
make geth

编译成功后,build/bin/geth 就是可执行文件。你可以把它复制到 /usr/local/bin 方便使用。

go-ethereum 持续集成状态

四、核心用法:启动节点、创建账户、查看同步状态

进阶 · 推荐细读

geth 是一个 CLI(命令行界面)工具,所有操作都通过命令完成。--datadir 参数用来指定数据保存目录,建议单独挂载一块大容量硬盘。

一个常见的启动命令如下:

geth --datadir /data/geth --http --http.addr 0.0.0.0 --http.port 8545 --syncmode snap

各参数含义:

  • --http:开启 HTTP RPC 服务,让程序可以通过网络调用节点功能
  • --http.addr 0.0.0.0:允许外部访问,如果只想本机访问可以改成 127.0.0.1
  • --http.port 8545:指定 RPC 端口,8545 是以太坊社区常用端口
  • --syncmode snap:使用快照同步,是目前推荐的快速同步模式

启动后,geth 会开始连接其他节点下载数据。你可以另开一个终端,通过 IPC 连接查询同步进度:

geth attach /data/geth/geth.ipc

进入控制台后输入:

eth.syncing

如果返回 false,说明节点已经同步到最新区块。如果还在同步,会返回一个对象,其中 currentBlockhighestBlock 的差值就是剩余高度。

创建以太坊账户也可以交给 geth:

geth account new --datadir /data/geth

命令会提示输入密码,并输出账户地址。记得备份 keystore 文件和密码,丢失后无法找回账户控制权。

五、合并后的新现实:geth 需要搭配共识层客户端

深入 · 老手可选

以太坊在 2022 年完成合并后,网络被分成执行层和共识层两部分。geth 只负责执行层,也就是跑交易和维护账本状态;而区块的最终确认和同步驱动,需要另一个叫共识层客户端的软件来完成,比如 Prysm、Lighthouse 或 Teku。

简单说,只启动 geth 可能无法完成区块链同步。不要把“执行层客户端”理解成完整的以太坊节点。

对于生产环境,推荐同时运行一套共识层客户端,并让它们通过 JWT(一种身份验证令牌)互相对接。具体过程是:先启动共识层客户端,提供 --execution-endpoint 指向 geth 的 RPC 端口,并在两边配置同一个 JWT 密钥文件。不同共识客户端的命令不同,操作前建议查阅对应文档。

如果只是想在本地测试智能合约,可以使用 geth 的开发模式或模拟后端,这样不需要同步真实区块链,也更轻量。开发模式只需加一个 --dev 参数:

geth --dev --http --http.addr 127.0.0.1

开发模式会生成一个新的测试环境,几分钟内即可开始使用。

六、用 systemd 或 Docker 托管节点

进阶 · 推荐细读

手动在前台运行 geth,终端关闭节点也会停掉。生产环境建议使用 systemd(Linux 系统启动和服务管理器)或 Docker(一种把软件打包成“集装箱”、随处可运行的工具)让它持续运行。

systemd 托管

先创建一个专门用来运行节点的系统用户:

sudo useradd -m -s /bin/bash geth
sudo mkdir -p /data/geth
sudo chown -R geth:geth /data/geth

然后写一个服务配置文件 /etc/systemd/system/geth.service

[Unit]
Description=Ethereum geth node
After=network.target

[Service]
User=geth
Group=geth
Type=simple
ExecStart=/usr/local/bin/geth --datadir /data/geth --http --http.addr 0.0.0.0 --http.port 8545 --syncmode snap
Restart=on-failure
RestartSec=10s

[Install]
WantedBy=multi-user.target

保存后启用并启动:

sudo systemctl daemon-reload
sudo systemctl enable --now geth

查看日志和状态:

sudo journalctl -u geth -f
sudo systemctl status geth

Docker 托管

Docker 方式适合快速部署,也方便隔离环境。可以使用官方镜像 ethereum/client-go

docker run -d --name geth \
  -v /data/geth:/root/.ethereum \
  -p 30303:30303 \
  -p 30303:30303/udp \
  -p 8545:8545 \
  ethereum/client-go \
  --http --http.addr 0.0.0.0 --http.port 8545 --syncmode snap

这里同时映射了 TCP 和 UDP 端口,因为节点发现机制需要两种协议配合。

七、常见踩坑与排查

深入 · 老手可选

节点运维中,多数问题集中在磁盘、网络和权限三个方面。

磁盘空间不足

同步过程中,geth 会占用大量磁盘空间。如果空间不足,进程会报错退出。建议定期用 df -h 检查挂载点剩余空间。快照同步完成后,数据仍会持续增长,不要按着刚刚同步完成时的大小预留空间。

端口不通导致找不到节点

geth 默认使用 30303 端口通过 P2P(点对点网络)与其他节点通信。如果服务器有防火墙,需要同时放行 TCP 和 UDP 30303:

sudo ufw allow 30303/tcp
sudo ufw allow 30303/udp

如果节点在路由器后方,还需要手动设置端口转发或启用 UPnP。

权限问题

如果使用 systemd 运行,/data/geth 目录必须属于服务配置中的用户。否则 geth 无法写入数据,启动时会立即报权限错误。用 ls -ld /data/geth 检查所有者,必要时执行 chown -R geth:geth /data/geth

内存不足

geth 在同步高峰期可能消耗大量内存,尤其是快照同步阶段。如果服务器配置较低,建议开启 swap 作为缓冲。长期运行建议升级到 16 GB 以上内存。

升级注意事项

geth 升级只需要替换二进制文件,数据目录不需要删除。但要注意,版本升级通常是单向的:新版本写入数据库格式后,旧版本可能无法读取。因此升级后不要再用旧二进制启动同一数据目录。还要确认新版本与共识层客户端的兼容性,避免两边版本严重不匹配。

把 geth 节点纳入监控体系时,建议关注日志中的 Import chain segmentSyncing 关键字,以及 RPC 端口 8545 的响应延迟。这些信息能提前暴露磁盘或网络瓶颈。

项目信息

项目
仓库 ethereum/go-ethereum
语言 Go
Star 51,352
Fork 22,150
主页 https://geth.ethereum.org

参考链接

延伸阅读

想继续探索?这些同领域的教程可能也适合你: