Ubuntu系统下搭建以太坊私链完整指南

以太坊作为领先的智能合约平台,其公链虽然功能强大,但在开发、测试和学习阶段,搭建一个本地或私有的以太坊网络(私链)往往更为便捷和高效,本文将详细介绍如何在Ubuntu操作系统上从零开始搭建一个以太坊私链,涵盖环境准备、Geth安装、创世区块配置、节点启动以及常用交互命令。

环境准备

在开始之前,确保你的Ubuntu系统已经满足以下基本条件:

  1. 操作系统:推荐使用Ubuntu 20.04 LTS或更高版本,本文以Ubuntu 20.04为例。
  2. 硬件要求:私链对硬件要求不高,普通PC即可,建议至少2GB内存,10GB以上可用磁盘空间。
  3. 网络连接:虽然私链可以离线运行,但初始安装和更新软件需要网络连接。
  4. 用户权限:建议使用具有sudo权限的用户进行操作,避免直接使用root用户。

更新系统软件包列表并安装必要的工具:

sudo apt update
sudo apt upgrade -y
sudo apt install -y build-essential curl git wget

安装Geth

Geth(Go-Ethereum)是以太坊官方的Go语言实现客户端,是最常用的以太坊节点软件之一,我们将通过二进制文件方式安装Geth,这是最简单快捷的方法。

  1. 下载Geth: 访问Geth官方发布页面:https://geth.ethereum.org/downloads/随机配图

a>,选择适合Ubuntu系统的最新稳定版amd64二进制文件,或者使用以下命令直接下载(请替换为最新版本号):

# 假设最新版本为1.13.6,请自行替换
GETH_VERSION="1.13.6"
wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.13.6-4e9e9586.tar.gz
  • 解压并安装

    tar -xzf geth-linux-amd64-${GETH_VERSION}-4e9e9586.tar.gz
    sudo cp geth-linux-amd64-${GETH_VERSION}-4e9e9586/geth /usr/local/bin/
  • 验证安装

    geth version

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

  • 创建创世区块文件

    每个以太坊网络都有一个创世区块(Genesis Block),它是区块链的起点,私链需要自定义创世区块配置。

    1. 创建创世配置文件: 在你的用户目录下创建一个名为ethereum的文件夹,并在其中创建一个genesis.json文件:

      mkdir -p ~/ethereum
      cd ~/ethereum
      nano genesis.json
    2. 编辑创世配置文件: 在genesis.json文件中输入以下内容(这是一个基本的私链创世配置示例):

      {
        "config": {
          "chainId": 15,          // 私链的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"
      }
      • chainId:非常重要,确保你的私链ID是唯一的。
      • difficulty:初始难度值越低,挖出区块越容易。

      保存并退出nano编辑器(Ctrl+X,然后Y,回车)。

    初始化创世区块

    使用Geth的init命令,使用我们刚创建的genesis.json文件来初始化数据目录。

    1. 创建数据目录(可选,Geth会自动创建):

      mkdir -p ~/ethereum/data
    2. 初始化

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

      如果看到Successfully initialised new Ethereum-style chain.的输出,表示创世区块已成功初始化,在~/ethereum/data目录下会生成gethkeystore等文件夹。

    启动私链节点

    现在可以启动我们的私链节点了。

    1. 基本启动命令

      geth --datadir ~/ethereum/data console
      • --datadir:指定数据目录。
      • console:启动JavaScript交互控制台,方便后续操作。

      启动后,你会看到类似Geth版本、节点信息、网络信息等的日志输出,节点会开始监听RPC端口(默认8545)和P2P端口(默认30303)。

    2. 常用启动参数

      • --networkid:指定网络ID,应与genesis.json中的chainId一致。
      • --nodiscover:禁止节点自动发现其他节点,适用于私链,避免连接到公链。
      • --maxpeers 0:限制最大连接节点数为0,即完全独立运行,不与其他节点连接(纯私链场景)。
      • --rpc:启用HTTP-RPC服务。
      • --rpcaddr "0.0.0.0":允许任何IP连接RPC服务(默认只允许本地连接)。
      • --rpcport "8545":指定RPC端口。
      • --rpccorsdomain "*": 允许所有来源的CORS请求(开发时方便,生产环境需谨慎)。
      • --mine:启用挖矿。
      • --minerthreads 1:指定挖矿线程数。
      • --etherbase "0xYourAccountAddress":指定挖矿收益账户地址(需要先创建账户)。

      一个更完整的启动命令(包含RPC和挖矿):

      geth --datadir ~/ethereum/data --networkid 15 --nodiscover --rpc --rpcaddr "0.0.0.0" --rpcport 8545 --rpccorsdomain "*" --mine --minerthreads 1 console

    私链常用交互命令

    启动console后,你可以使用JavaScript API与私链进行交互。

    1. 查看账户信息

      // 查看所有账户
      eth.accounts
      // 查看当前默认账户(coinbase)
      eth.coinbase
    2. 创建新账户

      // 会提示输入密码,请妥善保存
      personal.newAccount("your_password")
      // 创建后,可以用 eth.accounts[0] 等方式访问
    3. 解锁账户(在进行交易或挖矿前可能需要):

      personal.unlockAccount(eth.accounts[0], "your_password")
    4. 开始/停止挖矿

      // 开始挖矿
      miner.start(1) // 1是线程数
      // 停止挖矿
      miner.stop()
    5. 查看余额

      // 查看第一个账户的余额,单位是Wei
      eth.getBalance(eth.accounts[0])
      // 转换为Ether
      eth.getBalance(eth.accounts[0]) / 1e18
    6. 转账(发送交易): 假设我们要从eth.accounts[0]eth.accounts[1]转账1个Ether。

      // 首先确保账户0有足够余额且已解锁
      personal.unlockAccount(eth.accounts[0], "your_password")
      // 发送交易
      eth.sendTransaction({
        from: eth.accounts[0],
        to: eth.accounts[1],
        value: web3.toWei(

    本文由用户投稿上传,若侵权请提供版权资料并联系删除!

    上一篇:

    下一篇: