以太坊作为全球领先的智能合约平台,其公网拥有强大的算力和丰富的应用生态,但在许多场景下,如企业内部应用开发、测试、原型验证或特定业务逻辑的实验,我们并不需要公网的开放性和复杂性,而是需要一个独立、可控、私有的测试环境,搭建以太坊私有网络(Private Ethereum Network)正是为了满足这类需求,本文将详细介绍如何从零开始搭建一个以太坊私有网络。
为什么需要搭建私有网络?
在动手之前,我们首先要明确搭建私有网络的目的:

搭建以太坊私有网络的核心组件
搭建一个基本的以太坊私有网络,通常需要以下核心组件:
搭建以太坊私有网络的步骤
以下是使用Geth搭建一个简单单节点或多节点私有网络的详细步骤:
安装Geth
你需要安装以太坊客户端Geth,根据你的操作系统,可以选择不同的安装方式:
brew install geth)。sudo apt-get install geth) 或下载二进制文件。安装完成后,在终端输入 geth version 验证安装是否成功。
创建创世区块配置文件
创世区块配置是一个JSON文件,定义了私有网络的初始参数,创建一个名为 genesis.json 的文件,内容如下(这是一个示例,你可以根据需求修改):

{
"config": {
"chainId": 12345, // 自定义链ID,确保唯一性
"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": {} // 使用PoW共识,私有网络也可以选择其他共识如PoA(权威证明)
},
"alloc": {}, // 可选,预分配一些账户及其余额,用于测试
"coinbase": "0x0000000000000000000000000000000000000000", // 矿工地址
"difficulty": "0x40000", // 初始难度
"extraData": "", // 额外数据
"gasLimit": "0xffffffff", // Gas限制
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}
初始化创世区块
使用Geth的init命令,用上述genesis.json文件来初始化一个新的数据目录(data directory),这将创建创世区块并生成初始的区块链结构。
geth --datadir ./my_private_chain init genesis.json
执行后,会在当前目录下创建一个名为my_private_chain的文件夹,其中包含geth、keystore等子目录。
启动私有网络节点
现在可以启动私有网络节点了,根据你的需求,可以选择不同的启动方式:
启动单节点私有网络(用于简单测试)
geth --datadir ./my_private_chain --networkid 12345 --http --http.addr "0.0.0.0" --http.port "8545" --http.api "eth,net,web3,personal" --ws --ws.addr "0.0.0.0" --ws.port "8546" --ws.api "eth,net,web3,personal" console
参数说明:
--datadir: 指定数据目录。--networkid: 设置网络ID,与genesis.json中的chainId保持一致。--http: 启用HTTP-RPC服务,默认端口8545,--http.addr和--http.port可配置监听地址和端口。--http.api: 暴露的HTTP API接口。--ws: 启用WebSocket-RPC服务,默认端口8546,--ws.addr和--ws.port可配置监听地址和端口。--ws.api: 暴露的WebSocket API接口。console: 启动后进入JavaScript控制台,方便与节点交互。启动后,节点会开始同步创世区块,并开始挖矿(如果配置了PoW且没有预分配足够余额)。
启动多节点私有网络(形成网络)

如果需要多个节点组成一个私有网络,步骤如下:
节点1(创世节点):
geth --datadir ./node1 --networkid 12345 --port 30303 --http --http.addr "0.0.0.0" --http.port 8545 --http.api "eth,net,web3,personal" console
记录下节点1的enode地址(在console中输入admin.nodeInfo.enode获取,格式类似enode://<node_id>@<ip>:<port>)。
节点2(加入节点): 首先初始化节点2(使用相同的genesis.json):
geth --datadir ./node2 init genesis.json
然后启动节点2,并连接到节点1:
geth --datadir ./node2 --networkid 12345 --port 30304 --http --http.addr "0.0.0.0" --http.port 8546 --http.api "eth,net,web3,personal" --bootnodes "enode://<节点1的node_id>@<节点1的IP>:30303" console
--bootnodes参数用于指定已知节点列表,帮助新节点发现网络。
可以启动更多节点,每个节点使用不同的datadir、port和bootnodes(指向已存在的节点)。
与私有网络交互
启动节点并进入console后,你可以使用Web3.js或eth.js等库,或者直接在Geth console中与节点交互:
eth.accountseth.getBalance(eth.accounts[0])personal.newAccount("your_password")eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(1, "ether")})web3.eth.contract()和new()方法部署。私有网络的高级配置与注意事项