以太坊作为全球领先的智能合约平台,其公有链具有去中心化、公开透明的特点,在某些场景下,如企业内部应用开发、测试特定智能合约逻辑或进行隐私敏感的实验时,搭建一个本地或局域网内的以太坊私有链(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,personalAPI。--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 个线程即可