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

Ubuntu 系统:推荐使用 Ubuntu 20.04 或 22.04 LTS 版本,确保系统已更新至最新状态。
sudo apt update && sudo apt upgrade -y
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
安装 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),它定义了私有链的初始规则和参数。
创建创世配置文件: 在你的用户目录下创建一个目录用于存放私链相关文件,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" // 时间戳
} 初始化创世区块: 使用 Geth 的 init 命令,指定刚才创建的 genesis.json 文件。
geth --datadir ~/ethereum-private/data init genesis.json
执行成功后,~/ethereum-private/data 目录下会生成 geth 和 keystore 等文件夹,keystore 用于存放账户密钥。
启动节点:
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 交互式控制台。节点状态: 启动成功后,你会看到 Geth 的同步信息,因为是创世区块,所以会显示 "Syncing 0.00%",然后迅速完成同步,在控制台中,你可以输入一些基本命令来查看节点状态:
// 查看当前区块号 eth.blockNumber // 查看节点信息 admin.nodeInfo // 查看网络连接数 net.peerCount
创建账户: 在 Geth 控制台中,使用 personal.newAccount() 命令创建新账户,并设置密码:
personal.newPassword("your_password") // 先设置一个默认密码(可选)
personal.newAccount("your_password") // 创建账户,并输入密码 记住返回的账户地址,0x1234567890123456789012345678901234567890。
解锁账户: 在挖矿或发送交易前,需要先解锁账户:
personal.unlockAccount(eth.accounts[0], "your_password") // eth.accounts[0] 是第一个账户,即创世时可能默认生成的账户
// 或者使用你创建的账户地址
// personal.unlockAccount("0xYourAccountAddress", "your_password") 开始挖矿:
miner.start(1) // 开始挖矿,参数是线程数,私链建议 1 个线程即可