使用Geth搭建以太坊私有网络完整指南

投稿 2026-06-14 6:33 点击数: 5

以太坊作为全球第二大区块链平台,其灵活性和可扩展性使其成为区块链开发的首选,而Geth(Go-Ethereum)是以太坊官方实现的Go语言客户端,提供了完整的节点功能,包括私有网络搭建、交易处理、智能合约交互等,本文将详细介绍如何使用Geth从零开始搭建一个以太坊私有网络,并涵盖节点初始化、网络配置、节点启动及基础操作等关键步骤。

环境准备

在开始搭建私有网络前,需确保系统满足以下要求:

系统要求

  • 操作系统:Linux(推荐Ubuntu 18.04+)、macOS或Windows(需WSL2支持)
  • 硬件配置:CPU 2核+、内存4GB+、硬盘空间20GB+(根据节点需求调整)
  • 网络:私有网络节点间需能互相通信(同一局域网或通过端口映射)

安装Geth

Geth可通过官方预编译包或源码编译安装,推荐使用官方预编译包,步骤如下:

(1)Linux/macOS

# 下载最新版Geth(以Linux 64位为例)
wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.13.6-4bb3c97d.tar.gz
# 解压
tar -xzf geth-linux-amd64-1.13.6-4bb3c97d.tar.gz
# 将geth添加到系统PATH
sudo mv geth /usr/local/bin/

(2)Windows

  • 访问 随机配图
href="https://geth.ethereum.org/downloads/">Geth官方下载页,下载Windows版本(geth-windows-amd64-1.13.6-4bb3c97d.zip
  • 解压后将geth.exe所在目录添加到系统环境变量PATH
  • (3)验证安装

    geth version
    # 输出版本信息即表示安装成功

    初始化私有网络节点

    私有网络需要唯一的网络ID(避免与公有网络冲突)和创世区块(定义网络初始规则),以下是具体步骤:

    创建工作目录

    mkdir ~/ethereum-private-net
    cd ~/ethereum-private-net

    编写创世区块配置文件

    创世区块配置文件(genesis.json)定义了网络的初始参数,如链ID、难度、奖励分配等,以下是一个典型的私有网络创世配置示例:

    {
      "config": {
        "chainId": 2023,       // 私有网络唯一ID(避免与公有网络冲突,如主网为1,Ropsten为3)
        "homesteadBlock": 0,   // 启用Homestead规则的区块高度
        "eip155Block": 0,     // 启用EIP-155规则的区块高度
        "eip158Block": 0,     // 启用EIP-158规则的区块高度
        "byzantiumBlock": 0,   // 启用Byzantium规则的区块高度
        "constantinopleBlock": 0,
        "petersburgBlock": 0,
        "istanbulBlock": 0,
        "berlinBlock": 0,
        "londonBlock": 0,
        "mergeNetsplitBlock": 0,
        "terminalTotalDifficulty": 0,
        "terminalTotalDifficultyPassed": true,
        "alloc": {}            // 预分配地址(可选,用于测试)
      },
      "difficulty": "0x400",   // 初始难度(较低难度便于快速出块)
      "gasLimit": "0xffffffff", // gas上限
      "extradata": "",         // 额外数据(留空即可)
      "coinbase": "0x0000000000000000000000000000000000000000", // 矿工地址(初始无矿工)
      "nonce": "0x0000000000000042", // 初始nonce值
      "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", // 初始mixhash
      "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" // 父区块哈希(创世区块为空)
    }

    初始化节点

    使用geth init命令根据genesis.json初始化节点数据目录:

    geth --datadir ./data init genesis.json

    执行后,./data目录下会生成keystore(密钥存储)和geth(链数据)子目录。

    启动私有网络节点

    私有网络可启动多个节点形成网络,节点间需通过--bootnodes或静态发现机制互联,以下是单节点和多节点启动的示例:

    启动第一个节点(创世节点)

    geth \
      --datadir ./data \
      --networkid 2023 \
      --nodiscover \
      --maxpeers 25 \
      --rpc \
      --rpcaddr "0.0.0.0" \
      --rpcport 8545 \
      --rpcapi "eth,net,web3,personal" \
      --ws \
      --wsaddr "0.0.0.0" \
      --wsport 8546 \
      --wsapi "eth,net,web3,personal" \
      --wsorigins "*" \
      console

    参数说明

    • --datadir:指定数据目录
    • --networkid:网络ID(与genesis.json中一致)
    • --nodiscover:禁止自动发现其他节点(私有网络手动管理)
    • --maxpeers:最大连接节点数
    • --rpc:启用HTTP-RPC服务
    • --rpcaddr:RPC监听地址(0.0.0允许所有IP访问)
    • --rpcport:RPC端口(默认8545)
    • --rpcapi:开放的API接口(如ethnetweb3
    • --ws:启用WebSocket服务
    • --wsaddr--wsport--wsapi:WebSocket相关配置
    • --wsorigins:允许WebSocket跨域访问(允许所有域名)
    • console:启动交互式控制台(可选)

    启动后,节点会开始同步区块(创世区块为空,直接完成同步),并进入控制台界面(输入exit可退出)。

    启动第二个节点(同步节点)

    在另一台机器或同一机器的另一个目录下,启动第二个节点并连接到第一个节点:

    mkdir ./data2
    cd ./data2
    geth --datadir ./data --networkid 2023 --bootnodes "enode://<节点1的enode地址>:<端口>" console

    获取节点1的enode地址: 在节点1的控制台中输入:

    admin.nodeInfo.enode

    输出格式为:

    enode://<公钥>@<IP地址>:<端口>?discport=<发现端口>
    enode://a1b2c3d4e5f6...@192.168.1.100:30303?discport=30303

    将此地址复制到节点2的--bootnodes参数中,即可实现节点间同步。

    验证节点同步

    在任一节点控制台中输入:

    eth.syncing

    若返回{currentBlock: 0, highestBlock: 0, ...},表示同步完成(私有网络创世区块为空,同步瞬间完成)。

    私有网络基础操作

    创建账户

    在控制台中使用personal.newAccount命令创建新账户:

    personal.newAccount("your_password")

    返回账户地址,

    "0x1234567890123456789012345678901234567890"

    查看账户列表

    eth.accounts

    查看账户余额

    eth.getBalance("0x1234567890123456789012345678901234567890")

    私有网络初始无ETH,需手动转账或挖矿获取。

    挖矿获取ETH

    (1)启动挖矿

    miner.start(1)  // 1表示使用1个CPU线程

    (2)停止挖矿

    miner.stop()

    (3)查看挖矿状态

    eth.mining  // 返回true/false,