Ubuntu 系统下搭建以太坊私有链全指南

以太坊作为全球领先的智能合约平台,其公有链具有去中心化、公开透明的特点,在某些场景下,如企业内部应用开发、测试特定智能合约逻辑或进行隐私敏感的实验时,搭建一个本地或局域网内的以太坊私有链(Private Chain)就显得尤为必要,本文将详细介绍如何在 Ubuntu 系统下,从零开始搭建一个以太坊私有链,并实现基本的节点交互。

准备工作

  1. Ubuntu 系统:推荐使用 Ubuntu 20.04 或 22.04 LTS 版本,确保系统已更新至最新状态。

    sudo apt update && sudo apt upgrade -y
  2. Go 语言环境:以太坊客户端(如 Geth)是用 Go 语言开发的,因此需要安装 Go,本文以 Geth(Ethereum Go Client)为例。

    # 下载 Go 二进制包(以 1.19.5 为例,请根据需要替换最新版本)
    wget https://go.dev/dl/go1.19.5.linux-amd64.tar.gz
    # 解压到 /usr/local
    sudo tar -C /usr/local -xzf go1.19.5.linux-amd64.tar.gz
    # 添加 Go 到环境变量
    echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
    echo 'export GOPATH=$HOME/go' >> ~/.bashrc
    echo 'export GOBIN=$GOPATH/bin' >> ~/.bashrc
    # 使配置生效
    source ~/.bashrc
    # 验证 Go 安装
    go version
  3. 安装 Geth

    # 安装必要的依赖
    sudo apt-get install -y build-essential
    # 克隆 Geth 仓库(可选,如果需要特定版本或最新开发版)
    # go get -d github.com/ethereum/go-ethereum
    # 编译 Geth(如果从源码安装)
    # cd go-ethereum
    # make geth
    # 或者直接下载预编译的二进制文件(推荐,简单快捷)
    # 访问 https://geth.ethereum.org/downloads/ 下载适合 Ubuntu 的版本
    # 假设下载的是 geth-linux-amd64-1.10.23-966db4dc.tar.gz):
    wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.10.23-966db4dc.tar.gz
    tar -xzf geth-linux-amd64-1.10.23-966db4dc.tar.gz
    sudo cp geth-linux-amd64-1.10.23-966db4dc/geth /usr/local/bin/
    # 验证 Geth 安装
    geth version

初始化创世区块

私有链的第一个步骤是创建创世区块(Genesis Block),它定义了私有链的初始规则和参数。

  1. 创建创世配置文件: 在你的用户目录下创建一个目录用于存放私链相关文件,ethereum-private,然后创建一个 genesis.json 文件。

    mkdir ~/ethereum-private
    cd ~/ethereum-private
    nano genesis.json

    genesis.json 中填入以下内容(可根据实际需求修改):

    {
      "config": {
        "chainId": 15,       // 私有链的 ID,用于区分不同的以太坊网络,确保唯一性
        "homesteadBlock": 0,
        "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0,
        "byzantiumBlock": 0,
        "constantinopleBlock": 0,
        "petersburgBlock": 0,
        "istanbulBlock": 0,
        "berlinBlock": 0,
        "londonBlock": 0,
        "mergeNetsplitBlock": 0,
        "shanghaiTime": 0,
        "terminalTotalDifficulty": 0,
        "terminalTotalDifficultyPassed": true,
        "ethash": {}         // 如果是 PoW 共识,保留此行;PoS 则不需要
      },
      "alloc": {},           // 预分配的账户,这里留空,后续手动创建
      "coinbase": "0x0000000000000000000000000000000000000000", // 矿工地址,私有链可以随意填写
      "difficulty": "0x4000", // 初始难度,私有链可以设置较低值,方便挖矿
      "extraData": "",       // 额外数据,可以留空或填写自定义信息
      "gasLimit": "0x47b760", // 区块 Gas 限制
      "nonce": "0x0000000000000042", // 随机数
      "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", // 与 nonce 配合使用
      "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", // 父区块哈希,创世区块为 0
      "timestamp": "0x00"   // 时间戳
    }
  2. 初始化创世区块: 使用 Geth 的 init 命令,指定刚才创建的 genesis.json 文件。

    geth --datadir ~/ethereum-private/data init genesis.json

    执行成功后,~/ethereum-private/data 目录下会生成 gethkeystore 等文件夹,keystore 用于存放账户密钥。

启动私有链节点

  1. 启动节点

    geth --datadir ~/ethereum-private/data --networkid 15 --nodiscover --rpc --rpcaddr "0.0.0.0" --rpcport 8545 --rpcapi "eth,net,web3,personal" --console

    参数解释:

    • --datadir: 指定数据存储目录。
    • --networkid: 设置网络 ID,与 genesis.json 中的 chainId 保持一致,用于区分不同的网络。
    • --nodiscover: 禁止自动发现其他节点,因为是私链,不需要连接外部网络。
    • --rpc: 启动 RPC 服务,方便外部应用(如 Mist、Remix 或 Web3.js)连接。
    • --rpcaddr "0.0.0.0": RPC 监听地址,0.0.0 表示监听所有网络接口。
    • --rpcport 8545: RPC 端口号,默认是 8545,可以修改。
    • --rpcapi: 指定 RPC 支持的 API,这里开放了常用的 eth, net, web3, personal API。
    • --console: 启动后直接进入 Geth 的 JavaScript 交互式控制台。
  2. 节点状态: 启动成功后,你会看到 Geth 的同步信息,因为是创世区块,所以会显示 "Syncing 0.00%",然后迅速完成同步,在控制台中,你可以输入一些基本命令来查看节点状态:

    // 查看当前区块号
    eth.blockNumber
    // 查看节点信息
    admin.nodeInfo
    // 查看网络连接数
    net.peerCount

创建账户与挖矿

  1. 创建账户: 在 Geth 控制台中,使用 personal.newAccount() 命令创建新账户,并设置密码:

    personal.newPassword("your_password") // 先设置一个默认密码(可选)
    personal.newAccount("your_password") // 创建账户,并输入密码

    记住返回的账户地址,0x1234567890123456789012345678901234567890

  2. 解锁账户: 在挖矿或发送交易前,需要先解锁账户:

    personal.unlockAccount(eth.accounts[0], "your_password") // eth.accounts[0] 是第一个账户,即创世时可能默认生成的账户
    // 或者使用你创建的账户地址
    // personal.unlockAccount("0xYourAccountAddress", "your_password")
  3. 开始挖矿

    miner.start(1) // 开始挖矿,参数是线程数,私链建议 1 个线程即可

相关文章