区块链技术作为分布式账本技术的核心,其应用场景日益广泛。本文将手把手教你搭建一个私有区块链网络,通过实践加深对区块链技术的理解。
搭建一个区块链私有链网络是一个非常有趣且实用的练习。私有链(Private blockchain)通常用于企业内部数据管理、测试和开发环境中,具备较高的 隐私性与控制性。
在本教程中,我们将使用 Go-Ethereum (Geth) 来搭建一个 私有以太坊链,并演示如何:
- 启动主节点并初始化链
- 引入多节点并进行同步
- 完成跨账户转账与查询余额
阅读完本文,你将掌握从 创世区块 到 智能合约部署 前的全套私有链构建流程。
👉 想要快速体验无需本地安装?点这里在线控制台让你3分钟连上私有链。
01 | 准备工作与开发环境
1.1 操作系统与工具
| 需求 | 最低版本 | 推荐版本 |
|---|---|---|
| 操作系統 | Ubuntu 20.04 / macOS 13 / Windows 10 | |
| 核心工具 | Go-Ethereum (Geth) 1.12+ | |
| 可选前端 | Node.js 18 + npm |
Linux/Mac 快速安装 Geth:
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update && sudo apt-get install geth如你在 Windows,可直接下载 geth.exe 并将所在目录加入系统 PATH。1.2 目录与编码规范
myPrivateChain/
├── genesis.json # 创世区块配置
├── node1/
│ ├── data/
│ └── keystore/ # 存放账户
├── node2/
└── script/ # 用于自动化的 shell/js02 | 创建创世区块并初始化链
2.1 编写 genesis.json
创世区块配置文件控制着整条 私有链 的底层参数。以下是一份“起步难度低、便于实验”的示例:
{
"config": {
"chainId": 202506,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0
},
"alloc": {
"0xYourPrefundedAddress": {
"balance": "1000000000000000000000"
}
},
"difficulty": "0x400",
"gasLimit": "0x7A1200"
}核心关键词自然融入:chainId 设置为 202506,方便在多条 私有链 中识别。
2.2 初始化链数据
geth --datadir ./node1/data init genesis.json
echo ✅ 创世区块初始化完成03 | 启动第一个节点
3.1 命令与参数拆解
geth --datadir ./node1/data \
--networkid 202506 \
--http --http.addr 0.0.0.0 --http.port 8545 \
--http.api "eth,net,web3,personal,txpool,miner" \
--http.corsdomain "*" \
--nodiscover --allow-insecure-unlock \
console--networkid必须与 创世区块 保持一致--nodiscover关闭节点自动发现,确保私有链安全
示例输出中出现的 console 提示 Welcome to the Geth JavaScript console! 即代表节点已启动。
3.2 创建并解锁账户
personal.newAccount('MyAwesomePass')
personal.unlockAccount(eth.accounts[0], 'MyAwesomePass', 3600)上述密码 MyAwesomePass 记好后写在 gitignore 文件外,避免提交到版本库。3.3 启动挖矿
由于 难度值 极低,单核即可达到秒级出块:
miner.start(1)等待数个区块挖出后,执行 eth.getBalance(eth.accounts[0]) 查看余额。
04 | 多节点组网:跨机通信
教程继续扩展到第二台主机(或本机不同端口):
- 在 node2 完成相同的
genesis.json初始化 - 启动第二个节点:
geth --datadir ./node2/data \
--networkid 202506 --port 30304 \
--http --http.port 8546 --nodiscover console- 获取主节点 enode 地址:
admin.nodeInfo.enode
// 输出精简后形如:
"enode://[email protected]:30303"- 在 node2 控制台加入:
admin.addPeer("enode://[email protected]:30303")
admin.peers.length // 若值>0 表示成功互联👉 一次跑通还不够?用脚本 5 分钟拉起 10 节点弹性测试环境。
05 | 使用 Web3.js 进行交易
5.1 安装与连接
npm init -y
npm install web3@^1.xconst Web3 = require('web3');
const web3 = new Web3('http://localhost:8545');
(async () => {
const [from, to] = await web3.eth.getAccounts();
const tx = {
from,
to,
value: web3.utils.toWei('1', 'ether'),
gasPrice: web3.utils.toWei('1', 'gwei'),
gas: 21000
};
const receipt = await web3.eth.sendTransaction(tx);
console.log('Tx hash:', receipt.transactionHash);
})();交易哈希即刻返回,链上确认后在 私有链 浏览器可查看状态。
5.2 事件监听(进阶)
web3.eth.subscribe('newBlockHeaders')
.on('data', block => console.log('🔨 mined:', block.number));06 | 常见问题 FAQ
Q1:空姐网络环境无法发现节点怎么办?
A:检查防火墙是否放行 TCP/30303(或自定义端口),并确保每个节点 genesis.json 完全一致。
Q2:账户解锁后仍提示 “authentication needed”?
A:在启动参数里添加 --allow-insecure-unlock;生产环境建议改为 --http.api web3,eth 移除 personal,并改用私钥签名交易。
Q3:如何调整出块速度?
A:减少 difficulty,降低矿工数量,或直接在 创世区块 配置中加入 clique 共识以秒级出块。
Q4:能否在同一台机器运行多节点?
A:可以,只需保证 --port、--http.port、--datadir 唯一即可。通过 admin.addPeer 手动互联。
Q5:如何迁移已运行节点的数据?
A:关闭节点后,复制 data/geth 与 keystore 目录至新机,再使用相同 genesis.json 重新初始化即可。
Q6:私有链能不能做跨链?
A:可以通过桥接合约与中间人服务与主网或其他 区块链网络 进行资产互通,需设计公证人或轻客户端验证机制。
07 | 总结与下一步
至此,你已经完成了:
- ✅ 构建高可用的 私有链网络
- ✅ 节点互联与跨机测试
- ✅ 使用 Web3.js 完成转账、监听
下一步可尝试部署 智能合约(Solidity)、接入 私有链浏览器(BlockScout)、或用 Docker-Compose 一键扩展至上百节点并发压测。
保持好奇心,继续深耕,你将成为区块链架构设计的下一个高手!