以太坊作为领先的智能合约平台,其公链虽然功能强大,但在开发、测试和学习阶段,搭建一个本地或私有的以太坊网络(私链)往往更为便捷和高效,本文将详细介绍如何在Ubuntu操作系统上从零开始搭建一个以太坊私链,涵盖环境准备、Geth安装、创世区块配置、节点启动以及常用交互命令。
环境准备
在开始之前,确保你的Ubuntu系统已经满足以下基本条件:
- 操作系统:推荐使用Ubuntu 20.04 LTS或更高版本,本文以Ubuntu 20.04为例。
- 硬件要求:私链对硬件要求不高,普通PC即可,建议至少2GB内存,10GB以上可用磁盘空间。
- 网络连接:虽然私链可以离线运行,但初始安装和更新软件需要网络连接。
- 用户权限:建议使用具有sudo权限的用户进行操作,避免直接使用root用户。
更新系统软件包列表并安装必要的工具:

sudo apt update sudo apt upgrade -y sudo apt install -y build-essential curl git wget
安装Geth
Geth(Go-Ethereum)是以太坊官方的Go语言实现客户端,是最常用的以太坊节点软件之一,我们将通过二进制文件方式安装Geth,这是最简单快捷的方法。
-
下载Geth: 访问Geth官方发布页面:https://geth.ethereum.org/downloads/,选择适合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),它是区块链的起点,私链需要自定义创世区块配置。
-
创建创世配置文件: 在你的用户目录下创建一个名为
ethereum的文件夹,并在其中创建一个genesis.json文件:mkdir -p ~/ethereum cd ~/ethereum nano genesis.json
-
编辑创世配置文件: 在
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文件来初始化数据目录。
-
创建数据目录(可选,Geth会自动创建):
mkdir -p ~/ethereum/data
-
初始化:
geth --datadir ~/ethereum/data init ~/ethereum/genesis.json
如果看到
Successfully initialised new Ethereum-style chain.的输出,表示创世区块已成功初始化,在~/ethereum/data目录下会生成geth和keystore等文件夹。
启动私链节点
现在可以启动我们的私链节点了。
-
基本启动命令:
geth --datadir ~/ethereum/data console
--datadir:指定数据目录。console:启动JavaScript交互控制台,方便后续操作。
启动后,你会看到类似Geth版本、节点信息、网络信息等的日志输出,节点会开始监听RPC端口(默认8545)和P2P端口(默认30303)。

-
常用启动参数:
--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与私链进行交互。
-
查看账户信息:
// 查看所有账户 eth.accounts // 查看当前默认账户(coinbase) eth.coinbase
-
创建新账户:
// 会提示输入密码,请妥善保存 personal.newAccount("your_password") // 创建后,可以用 eth.accounts[0] 等方式访问 -
解锁账户(在进行交易或挖矿前可能需要):
personal.unlockAccount(eth.accounts[0], "your_password")
-
开始/停止挖矿:
// 开始挖矿 miner.start(1) // 1是线程数 // 停止挖矿 miner.stop()
-
查看余额:
// 查看第一个账户的余额,单位是Wei eth.getBalance(eth.accounts[0]) // 转换为Ether eth.getBalance(eth.accounts[0]) / 1e18
-
转账(发送交易): 假设我们要从
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(
