Ubuntu上部署以太坊全节点:从零开始的完整命令指南


在区块链的世界里,运行一个以太坊全节点意味着您成为去中心化网络中的一个完整组成部分,能够独立验证所有交易和区块,无需信任任何第三方,这不仅是参与网络、支持去中心化的最佳方式,也是开发者进行DApp测试和部署的理想环境,本文将详细介绍如何在Ubuntu操作系统上,通过一系列命令行指令,从零开始部署一个以太坊全节点。

准备工作:环境与要求

在开始之前,请确保您的Ubuntu系统满足以下基本要求:

  • 操作系统:推荐使用Ubuntu 20.04 LTS或22.04 LTS版本,这些版本稳定且软件库支持良好。
  • 硬件要求
    • CPU:至少2核心。
    • 内存:建议8GB以上,16GB更佳。
    • 存储这是最关键的部分,以太坊主网的全节点数据(状态、历史区块等)会持续增长,截至2023年底,数据量已超过2TB,并且仍在增长,请务必准备一个至少2TB的独立硬盘,并确保系统正确识别它。
  • 网络:稳定的互联网连接,建议带宽在10Mbps以上,因为节点需要与网络中的其他节点同步大量数据。
  • 权限:您将需要sudo权限来安装软件和修改系统配置。

第一步:系统更新与基础配置

打开终端(Terminal),我们首先更新系统软件包列表并升级已安装的软件,确保所有组件都是最新的。

# 升级已安装的软件包
sudo apt upgrade -y

为了方便后续操作,我们安装一些常用的基础工具,如curl(用于下载文件)、wgetgit

sudo apt install -y curl wget git build-essential

第二步:安装Go语言环境

以太坊客户端(如Geth)是用Go语言编写的,因此我们需要先安装Go,我们将安装一个较新的稳定版本(例如1.21)。

# 下载Go语言的二进制压缩包
# 请访问 https://go.dev/dl/ 查找并替换为最新的版本号
wget https://go.dev/dl/go1
随机配图
.21.5.linux-amd64.tar.gz # 解压下载的文件到 /usr/local 目录 sudo tar -C /usr/local -xzf go1.21.5.linux-amd64.tar.gz # 将Go的可执行文件路径添加到系统的环境变量中 echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile # 使环境变量立即生效 source ~/.profile # 验证Go是否安装成功 go version

如果看到类似 go version go1.21.5 linux/amd64 的输出,说明Go安装成功。


第三步:安装与配置以太坊客户端(Geth)

Geth(Go-Ethereum)是以太坊最主流的官方客户端之一,我们将通过源码编译的方式安装它,这能确保我们使用最新的功能。

# 创建一个目录用于存放以太坊项目
mkdir -p ~/ethereum && cd ~/ethereum
# 从GitHub克隆Geth的官方仓库
git clone https://github.com/ethereum/go-ethereum.git
# 进入克隆下来的目录
cd go-ethereum
# 切换到一个较新的稳定分支(例如release/1.13.x)
# 您可以访问GitHub查看最新的稳定分支
git checkout release/1.13.x
# 编译Geth
make geth

编译过程可能需要几分钟时间,具体取决于您的CPU性能,编译成功后,geth可执行文件会生成在~/ethereum/go-ethereum/build/bin/目录下。

为了方便在任何地方调用geth,我们可以将它添加到系统路径中:

# 将Geth的路径添加到环境变量
echo 'export PATH=$PATH:~/ethereum/go-ethereum/build/bin' >> ~/.profile
# 使环境变量立即生效
source ~/.profile
# 验证Geth是否安装成功
geth version

第四步:准备数据存储目录

在第一步中我们强调了硬盘空间的重要性,我们需要将这个大容量硬盘挂载并设置为Geth的数据存储目录。

  1. 识别新硬盘:使用lsblkfdisk -l命令来查找您的新硬盘,它可能被识别为/dev/sdb/dev/nvme1n1等。

  2. 格式化与挂载

    # 创建一个用于挂载的目录(/mnt/ethereum)
    sudo mkdir -p /mnt/ethereum
    # 格式化硬盘为ext4文件系统(请将 /dev/sdb 替换为您的实际硬盘名)
    sudo mkfs.ext4 /dev/sdb
    # 挂载硬盘到指定目录
    sudo mount /dev/sdb /mnt/ethereum
    # 为了让重启后自动挂载,需要写入 /etc/fstab
    # 先获取硬盘的UUID
    sudo blkid /dev/sdb | awk '{print $2}' | tr -d '"'
    # 将输出的UUID和以下信息添加到 /etc/fstab 文件末尾
    # 格式为:UUID=<您的UUID>  /mnt/ethereum  ext4  defaults  0  2
    # 示例:
    # sudo echo "UUID=a1b2c3d4-e5f6-7890-1234-567890abcdef /mnt/ethereum ext4 defaults 0 2" | sudo tee -a /etc/fstab
  3. 修改目录所有者:为了让当前用户能在这个目录写入数据,需要修改所有者。

    sudo chown -R $USER:$USER /mnt/ethereum

第五步:首次启动与同步数据

万事俱备,我们可以启动Geth并开始同步以太坊网络了。首次同步可能需要数天甚至数周的时间,具体取决于您的网络带宽和硬盘性能。

基本同步命令:

geth --datadir /mnt/ethereum --syncmode full --http --http.addr 0.0.0.0 --http.port 8545 --http.vhosts '*'

命令参数解释:

  • --datadir /mnt/ethereum:指定数据存储目录为我们准备好的大硬盘。
  • --syncmode full这是运行全节点的关键,它表示下载并验证完整的区块历史,以确保数据的完整性,如果只做轻节点,会使用--syncmode snap,但这不符合“全节点”的定义。
  • --http:启用HTTP-RPC接口,允许其他应用程序(如MetaMask、Remix)连接到您的节点。
  • --http.addr 0.0.0.0:允许局域网内的其他设备访问此接口,如果只允许本机访问,可以改为0.0.1
  • --http.port 8545:设置HTTP-RPC服务的端口号。
  • --http.vhosts '*':允许任何主机通过HTTP访问,方便开发,在生产环境中应谨慎配置。

启动后,您会看到Geth开始下载区块,并显示同步进度。


第六步:管理节点(后台运行与控制)

直接在终端运行Geth,一旦关闭终端,节点就会停止,为了使其在后台持续运行,我们使用nohup&

nohup geth --datadir /mnt/ethereum --syncmode full --http --http.addr 0.0.0.0 --http.port 8545 --http.vhosts '*' > geth.log 2>&1 &
  • nohup:让命令在用户退出登录后仍然继续运行。
  • > geth.log:将标准输出重定向到geth.log文件。
  • 2>&1:将标准错误也重定向到同一个文件。
  • &:让命令在后台执行。

如何管理和控制节点?

  1. 查看节点状态

    # 进入Geth的JavaScript控制台
    geth attach /mnt/ethereum/geth.ipc
    # 在控制台中,您可以输入以下命令查看信息
    eth.syncing  # 查看同步状态,如果返回false,表示已同步完成
    eth.blockNumber  # 查看当前最新区块号
    exit  # 退出控制台
  2. 停止节点

    # 首先找到Geth的进程ID (PID)
    ps aux | grep geth
    # 然后使用kill命令停止该进程
    sudo kill <PID>

**第七步:安全加固