在以太坊开发中,是学习和测试的重要环节。私有网络允许开发者完全控制网络参数,无需消耗真实ETH,可以快速测试和迭代。本文详细介绍如何创建以太坊私有网络,包括创世区块配置、节点启动、网络连接等完整流程。

一、私有网络概述

一、1 什么是私有网络

1
定义:
  • 完全独立的以太坊网络
  • 不连接到主网或测试网
  • 可以自定义所有参数
  • 适合开发和测试
1
优势:
  • 完全控制网络
  • 快速出块(可自定义)
  • 免费使用(无需真实ETH)
  • 隐私保护
1
应用场景:
  • 智能合约开发测试
  • DApp功能测试
  • 学习以太坊原理
  • 企业内部应用

二、2 与测试网的区别

1
测试网:
  • 连接到公共网络
  • 需要同步区块
  • 使用测试币
  • 可能重置
1
私有网络:
  • 完全独立
  • 无需同步
  • 完全控制
  • 不会重置

二、准备工作

三、1 安装Geth

1
Windows:
1
2
3
# 下载预编译版本
# 或使用Chocolatey
choco install geth
1
Linux:
1
2
3
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum
1
macOS:
1
2
brew tap ethereum/ethereum
brew install ethereum

四、2 验证安装

1
geth version

三、创建创世区块

五、1 创世区块配置

1
创建genesis.json文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
"config": {
"chainId": 12345,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"londonBlock": 0
},
"alloc": {
"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb": {
"balance": "1000000000000000000000"
}
},
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x400",
"extraData": "",
"gasLimit": "0x8000000",
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}

六、2 配置说明

1
chainId:
  • 网络标识符
  • 防止重放攻击
  • 自定义数字
1
alloc:
  • 预分配账户和余额
    1
    - 格式:地址 -> 余额(Wei)
  • 可以预分配多个账户
1
difficulty:
  • 挖矿难度
  • 值越小出块越快
  • “0x400”表示较低难度
1
gasLimit:
  • 每个区块的Gas限制
  • “0x8000000”表示较大限制

七、3 初始化网络

1
2
3
4
5
# 创建数据目录
mkdir private-net

# 初始化创世区块
geth --datadir ./private-net init genesis.json
1
输出示例:
1
INFO [08-16|10:00:00] Successfully wrote genesis state

四、启动节点

八、1 基本启动

1
geth --datadir ./private-net --networkid 12345 --nodiscover console
1
参数说明:
  • --datadir:数据目录
  • --networkid:网络ID(与chainId一致)
  • --nodiscover:不发现其他节点
  • --console:启动控制台

九、2 启用RPC

1
2
3
4
5
6
7
8
9
geth --datadir ./private-net \
--networkid 12345 \
--nodiscover \
--http \
--http.addr "0.0.0.0" \
--http.port 8545 \
--http.api "eth,net,web3,personal,admin" \
--http.corsdomain "*" \
console
1
参数说明:
  • --http:启用HTTP RPC
  • --http.addr:监听地址
  • --http.port:端口号
  • --http.api:开放的API
  • --http.corsdomain:允许的跨域域名

十、3 启用挖矿

1
2
3
4
5
6
7
8
9
10
11
geth --datadir ./private-net \
--networkid 12345 \
--nodiscover \
--http \
--http.addr "0.0.0.0" \
--http.port 8545 \
--http.api "eth,net,web3,personal,admin" \
--mine \
--miner.threads 1 \
--miner.etherbase "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb" \
console
1
参数说明:
  • --mine:启用挖矿
  • --miner.threads:挖矿线程数
  • --miner.etherbase:挖矿收益地址

五、节点操作

十一、1 创建账户

1
在Geth控制台:
1
2
3
4
5
6
7
8
// 创建新账户
personal.newAccount("password")

// 查看账户列表
eth.accounts

// 查看账户余额
eth.getBalance(eth.accounts[0])

十二、2 解锁账户

1
2
3
// 解锁账户
personal.unlockAccount(eth.accounts[0], "password", 0)
// 参数:账户地址、密码、解锁时长(0表示永久)

十三、3 挖矿

1
2
3
4
5
6
7
8
// 开始挖矿
miner.start(1) // 参数是线程数

// 停止挖矿
miner.stop()

// 查看挖矿状态
eth.mining

十四、4 转账

1
2
3
4
5
6
7
8
9
10
11
// 发送交易
eth.sendTransaction({
from: eth.accounts[0],
to: eth.accounts[1],
value: web3.toWei(1, "ether")
})

// 需要先挖矿确认交易
miner.start(1)
// 等待几秒
miner.stop()

六、多节点网络

十五、1 启动第一个节点

1
2
3
4
5
6
7
8
geth --datadir ./node1 \
--networkid 12345 \
--port 30303 \
--http \
--http.port 8545 \
--http.api "eth,net,web3,admin,personal" \
--nodiscover \
console
1
获取enode地址:
1
2
admin.nodeInfo.enode
// 输出类似:enode://...

十六、2 启动第二个节点

1
2
3
4
5
6
7
8
geth --datadir ./node2 \
--networkid 12345 \
--port 30304 \
--http \
--http.port 8546 \
--http.api "eth,net,web3,admin,personal" \
--bootnodes "enode://第一个节点的enode地址" \
console

十七、3 连接节点

1
在第二个节点控制台:
1
2
3
4
5
6
7
8
// 添加对等节点
admin.addPeer("enode://第一个节点的enode地址")

// 查看对等节点
admin.peers

// 查看节点信息
admin.nodeInfo

七、使用私有网络

十八、1 连接MetaMask

1
添加网络:
  1. 打开MetaMask
  2. 网络选择器 → 添加网络
  3. 输入网络信息:
1
导入账户:
  1. 在Geth控制台获取私钥
  2. 在MetaMask导入账户
  3. 使用私钥导入

十九、2 使用Web3.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const Web3 = require('web3');
const web3 = new Web3('http://localhost:8545');

// 查看账户
const accounts = await web3.eth.getAccounts();
console.log('Accounts:', accounts);

// 查看余额
const balance = await web3.eth.getBalance(accounts[0]);
console.log('Balance:', web3.utils.fromWei(balance, 'ether'), 'ETH');

// 发送交易
await web3.eth.sendTransaction({
from: accounts[0],
to: accounts[1],
value: web3.utils.toWei('1', 'ether')
});

二十、3 部署智能合约

1
使用Hardhat:
1
2
3
4
5
6
7
8
9
10
// hardhat.config.js
module.exports = {
networks: {
private: {
url: "http://localhost:8545",
chainId: 12345,
accounts: [process.env.PRIVATE_KEY]
}
}
};
1
部署命令:
1
npx hardhat run scripts/deploy.js --network private

八、常见问题

二十一、1 节点无法启动

1
检查:
  • 数据目录是否正确
  • 创世区块是否初始化
  • 端口是否被占用
1
解决:
1
2
3
4
5
# 检查端口
netstat -ano | findstr :8545

# 重新初始化
geth --datadir ./private-net init genesis.json

二十二、2 交易未确认

1
原因:
  • 未启用挖矿
  • 挖矿已停止
1
解决:
1
2
// 启动挖矿
miner.start(1)

二十三、3 节点无法连接

1
检查:
  • 网络ID是否一致
  • enode地址是否正确
  • 防火墙设置
1
解决:
  • 确保网络ID相同
  • 使用正确的enode地址
  • 检查网络连接

九、最佳实践

二十四、1 配置建议

1
开发环境:
  • 低难度快速出块
  • 较大的Gas限制
  • 预分配测试账户
1
测试环境:
  • 接近主网参数
  • 多节点网络
  • 完整测试流程

二十五、2 安全建议

1
私有网络:
  • 仅用于开发测试
  • 不要存储真实资产
  • 定期清理数据
1
账户管理:
  • 使用强密码
  • 备份账户文件
  • 不要泄露私钥

十、总结

构建私有网络是以太坊开发的重要技能:

1
核心步骤:
  1. 创建创世区块配置
  2. 初始化网络
  3. 启动节点
  4. 配置和连接
1
关键要点:
  • 合理配置网络参数
  • 正确初始化创世区块
  • 掌握节点操作
  • 理解网络连接
1
应用场景:
  • 智能合约开发
  • DApp测试
  • 学习研究
  • 内部应用

通过构建私有网络,可以在完全控制的环境中学习和开发,为后续的主网部署打下坚实基础。

本文标题: 构建本地私有网络

发布时间: 2024年01月01日 00:00

最后更新: 2025年12月30日 08:54

原始链接: https://haoxiang.eu.org/59bab207/

版权声明: 本文著作权归作者所有,均采用CC BY-NC-SA 4.0许可协议,转载请注明出处!

× 喜欢就赞赏一下呗!
打赏二维码