以太坊作为全球领先的智能合约平台,其公链虽然功能强大,但对于开发者而言,在进行应用测试、算法验证或学习研究时,搭建一个本地或私有的以太坊网络(即“私链”)往往更为便捷和高效,本文将详细介绍如何在 Ubuntu 系统上,从零开始搭建一个以太坊私链。
在开始之前,请确保您的 Ubuntu 系统满足以下基本条件:
git:用于下载源代码。make:用于编译构建。g :C 编译器。build-essential:包含基本编译工具集。更新系统并安装必要的软件包:
sudo apt update sudo apt upgrade -y sudo apt install -y git make g build-essential
以太坊客户端(如 Geth)通常使用 Go 语言开发,因此需要先安装 Go。

下载 Go:访问 Go 官方下载页面 获取最新版本的 Linux AMD64 下载链接,以下以 Go 1.21.0 为例:
wget https://go.dev/dl/go1.21.0.linux-amd64.tar.gz
解压并安装:
sudo tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz
配置环境变量:编辑 ~/.bashrc 文件,添加 Go 的 bin 目录到 PATH:
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc source ~/.bashrc
验证安装:
go version
如果显示 Go 版本号,则安装成功。
Geth(Go-Ethereum)是以太坊官方实现的 Go 语言客户端,是最常用的以太坊节点软件之一。
克隆 Geth 源代码:
git clone https://github.com/ethereum/go-ethereum.git cd go-ethereum
编译 Geth:
make geth
编译过程可能需要一些时间,具体取决于您的电脑性能。

验证安装:
./build/bin/geth version
如果能看到 Geth 的版本信息,说明编译安装成功,为了方便使用,可以将 Geth 添加到系统 PATH:
sudo cp ./build/bin/geth /usr/local/bin/
私链需要一个独特的“创世区块”(Genesis Block),这是区块链的起点。
创建创世配置文件:在您的用户目录下创建一个 ethereum 目录,并在其中创建一个 genesis.json 文件。
mkdir ~/ethereum cd ~/ethereum nano genesis.json
编写创世配置内容:以下是一个简单的创世区块配置示例,您可以根据需要修改:
{
"config": {
"chainId": 15, // 私链 ID,用于区分不同的以太坊网络,公链是 1, Ropsten 是 3,这里自定义一个数字
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"londonBlock": 0,
"mergeNetsplitBlock": 0,
"terminalTotalDifficulty": 0,
"terminalTotalDifficultyPassed": true,
"ethash": {}
},
"alloc": {
// 可以在这里预分配一些账户及其余额,格式为 "地址": {"balance": "数值"}
// "0x742d35Cc6634C0532925a3b844Bc454e4438f44e": {"balance": "1000000000000000000000"}
},
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x40000", // 初始难度,私链可以设置低一些
"extraData": "",
"gasLimit": "0xffffffff", // Gas 限制
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
} 保存并退出 nano 编辑器(Ctrl X,Y,回车)。
初始化创世区块:
geth --datadir ~/ethereum/data init ~/ethereum/genesis.json
这会在 ~/ethereum/data 目录下创建区块链数据,并根据 genesis.json 初始化创世区块,如果提示 datadir already exists,可以删除 ~/ethereum/data 目录后重新执行。
现在可以启动您的私链节点了。

基本启动方式:
geth --datadir ~/ethereum/data --networkid 15 console
参数说明:
--datadir ~/ethereum/data:指定数据存储目录。--networkid 15:指定网络 ID,必须与 genesis.json 中的 chainId 一致。console:启动后进入 JavaScript 交互式控制台,方便管理节点和执行命令。启动后,节点会开始同步区块(因为是创世区块,所以同步很快),然后您会看到一个 > 提示符,表示已进入控制台。
常用启动参数(可选):
--rpc:启用 HTTP-RPC 服务,方便其他工具(如 MetaMask、Remix)连接。--rpcaddr "localhost":指定 RPC 监听地址。--rpcport "8545":指定 RPC 端口。--ws:启用 WebSocket 服务。--wsaddr "localhost":指定 WebSocket 监听地址。--wsport "8546":指定 WebSocket 端口。--nodiscover:禁止自动发现其他节点,适合私链。--maxpeers 0:限制最大连接节点数为 0,即纯私链,不与外部任何节点连接。带 RPC 服务的启动命令:
geth --datadir ~/ethereum/data --networkid 15 --rpc --rpcaddr "localhost" --rpcport "8545" --nodiscover console
进入控制台后,您可以执行以下命令:
查看账户信息:
// 查看账户列表 eth.accounts // 默认是空列表,除非在 genesis.json 中预分配了 // 查看当前账户余额(单位:Wei) eth.getBalance(eth.accounts[0])
创建新账户:
personal.newAccount("your_password_here")
// 记下返回的地址,并设置密码 启动/停止挖矿:
// 启动挖矿,默认 1 个线程 miner.start(1) // 停止挖矿 miner.stop()
挖矿会产生新的区块,并给矿工(coinbase 地址)奖励以太币,默认情况下,coinbase 地址是第一个创建的账户或预分配的账户。
转账(发送交易):
//