更新系统软件包

CentOS 系统下搭建以太坊私链详细指南**


以太坊作为全球领先的智能合约平台,其公链虽然功能强大,但对于开发测试、学习研究或特定业务场景而言,搭建一条本地或私有的以太坊链(私链)更为便捷、高效且低成本,本文将详细介绍如何在 CentOS 操作系统上,从零开始搭建一条以太坊私链。

准备工作

在开始之前,请确保您的 CentOS 系统满足以下基本条件:

  1. 操作系统:CentOS 7 或更高版本(本文以 CentOS 7 为例)。
  2. 硬件要求:至少 2GB 内存,10GB 以上可用磁盘空间(根据需求调整)。
  3. 网络连接:确保系统可以连接到互联网,以便下载必要的软件包。
  4. 用户权限:推荐使用具有 sudo 权限的非 root 用户进行操作,以确保安全性。

安装必要依赖

我们需要更新系统软件包并安装一些构建和管理以太坊节点所需的依赖工具。

# 安装必要的依赖包
sudo yum install -y git wget curl gcc-c   make openssl-devel libffi-devel python3-devel python3-pip

安装 Go 语言环境

以太坊客户端(如 Geth)通常使用 Go 语言开发,因此需要先安装 Go 环境,我们将安装较新的 Go 版本(以 1.19 为例,您可以根据需要选择其他稳定版本)。

  1. 下载 Go 安装包

    wget https://go.dev/dl/go1.19.linux-amd64.tar.gz
  2. 解压并安装 Go

    # 解压到 /usr/local 目录
    sudo tar -C /usr/local -xzf go1.19.linux-amd64.tar.gz
  3. 配置 Go 环境变量: 编辑 ~/.bash_profile 文件:

    vim ~/.bash_profile

    在文件末尾添加以下内容:

    export PATH=$PATH:/usr/local/go/bin
    export GOPATH=$HOME/go
    export PATH=$PATH:$GOPATH/bin

    保存并退出(wq),然后使配置生效:

    source ~/.bash_profile
  4. 验证 Go 安装

    go version

    如果显示类似 go version go1.19 linux/amd64 的信息,则表示安装成功。

安装与编译 Geth

Geth(Go-Ethereum)是以太坊官方的 Go 语言客户端,是最常用的以太坊节点实现之一,我们将从源码编译安装最新版本的 Geth。

  1. 安装 Git(如果未安装):

    sudo yum install -y git
  2. 克隆 Geth 仓库

    git clone https://github.com/ethereum/go-ethereum.git
  3. 编译 Geth: 进入 go-ethereum 目录并执行编译:

    cd go-ethereum
    make geth

    编译过程可能需要一些时间,具体取决于您的系统性能,编译成功后,geth 可执行文件会位于 build/bin/ 目录下。

  4. 将 Geth 添加到系统 PATH(可选,但推荐):

    # 创建 go-ethereum 的 bin 目录(如果不存在)
    mkdir -p ~/go/bin
    # 复制 geth 到 ~/go/bin
    cp build/bin/geth ~/go/bin/
    # 确保 ~/go/bin 在 PATH 中(前面配置 Go 时已设置)
    # 如果之前没设置,可以执行:
    # echo 'export PATH=$PATH:$HOME/go/bin' >> ~/.bash_profile && source ~/.bash_profile
    # 验证 Geth 安装
    geth version

    如果能看到 Geth 的版本信息,则安装成功。

初始化创世区块

私链需要自己的创世区块(Genesis Block),它定义了链的初始规则和状态,我们需要创建一个自定义的创世配置文件。

  1. 创建创世配置文件: 在您的用户目录下创建一个 eth_private 目录用于存放私链相关文件,并创建 genesis.json 文件:

    mkdir ~/eth_private
    cd ~/eth_private
    vim genesis.json
  2. 编写创世配置内容: 在 genesis.json 文件中输入以下内容(这是一个基本的创世配置示例,您可以根据需要修改):

    {
      "config": {
        "chainId": 15,         // 私链的 Chain ID,必须唯一,用于区分不同网络
        "homesteadBlock": 0,
        "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0
      },
      "alloc": {},             // 预分配的账户,留空表示初始无预分配
      "coinbase": "0x0000000000000000000000000000000000000000",
      "difficulty": "0x4000",  // 初始难度,私链可以设置低一些便于挖矿
      "extraData": "",
      "gasLimit": "0xffffffff",
      "nonce": "0x0000000000000042",
      "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
      "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
      "timestamp": "0x00"
    }

    保存并退出。

  3. 初始化创世区块: 使用 Geth 的 init 命令,并指定刚才创建的 genesis.json 文件:

    geth --datadir ~/eth_private/data init ~/eth_private/genesis.json

    如果看到 Successfully initialised new genesis block 等提示,表示创世区块初始化成功,在 ~/eth_private/data 目录下会生成 gethkeystore 等文件夹。

启动私链节点

现在我们可以启动私链节点了,为了方便后续操作,我们建议使用 screentmux 工具在后台运行节点。

  1. 安装 screen(如果未安装):

    sudo yum install -y screen
  2. 创建新的 screen 会话

    screen -S eth_private
  3. 启动 Geth 私链节点: 在 screen 会话中执行以下命令:

    geth --datadir ~/eth_private/data --networkid 15 --nodiscover --http --http.addr "0.0.0.0" --http.port "8545" --http.api "personal,eth,net,web3,miner"

    命令参数说明:

    • --datadir ~/eth_private/data:指定数据存储目录。
    • --networkid 15:指定网络 ID,必须与 genesis.json 中的 chainId 一致。
    • --nodiscover:禁止节点自动发现其他节点,适用于私链。
    • --http:启用 HTTP-RPC 服务。
    • --http.addr "0.0.0.0":允许任何 IP 地址访问 HTTP-RPC 接口。
    • --http.port "8545":指定 HTTP-RPC 端口。
    • --http.api "personal,eth,net,web3,miner":暴露给 HTTP-RPC 的 API 接口。

    启动后,节点会开始同步创世区块,并显示一些日志信息,由于是私链,同步会很快完成。

  4. detach screen 会话: 按 Ctrl A,然后按 D,可以 detach screen 会话,让节点在后台运行,如果需要重新连接,可以使用 screen -r eth_private

创建与解锁账户

私链启动后,我们需要创建一个或多个账户来进行交易和挖矿。

  1. attach 到 Geth 控制台: 在新的终端窗口中,执行以下命令 attach 到正在运行的 Geth 节点的控制台:

    geth attach http://localhost:8545
  2. 创建新账户: 在控制台中,使用 personal.newAccount() 命令创建新账户,并设置密码:

    personal.newAccount("your_password

相关文章