以太坊POA私有链搭建与发币完全指南,从零打造你的专属区块链网络
在区块链开发和测试过程中,直接使用以太坊主网不仅成本高昂,而且无法自由控制链上环境,通过 POA(Proof of Authority,权威证明)共识机制搭建私有链,可以让开发者在完全可控的环境中测试智能合约、发币、验证业务逻辑,本文将手把手教你搭建一条基于 Geth 的 POA 私有链,并在链上发行自己的 ERC-20 代币。
什么是 POA 共识?
POA(Proof of Authority)是一种基于信任的共识算法,与 PoW(工作量证明)依赖算力挖矿不同,POA 依赖预先设定的“签名者(Signer)”节点来轮流打包区块。
它的核心优势包括:
- 出块速度快:无需等待算力竞争,几秒内即可出块
- 无需消耗大量电力:没有挖矿过程,资源占用低
- 适合联盟链/私有链:节点身份已知且可控
- 交易手续费极低:由链管理员自行设定策略
以太坊 Geth 客户端内置的 Clique 就是一个成熟的 POA 实现,本文正是基于它来搭建。
环境准备
开始之前,请确保已安装以下工具:
- Geth(Go-Ethereum 客户端,建议 1.10 以上版本)
- Remix IDE(在线智能合约开发环境)
- MetaMask(浏览器钱包插件,用于交互测试)
验证 Geth 安装:
geth version
创建节点账户
首先建立工作目录并创建两个账户,一个作为初始签名者(矿工),一个作为日常使用账户:
mkdir poa-chain && cd poa-chain mkdir node1 node2 # 创建账户1(签名者) geth --datadir node1 account new # 创建账户2(普通用户) geth --datadir node2 account new
执行后系统会提示设置密码,并输出两个账户地址,
Address: {0x1234abcd...}
请务必记下这两个地址和密码,后续配置创世文件时会用到。
编写创世区块配置文件
在 poa-chain 目录下创建 genesis.json:
{
"config": {
"chainId": 20240808,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"clique": {
"period": 5,
"epoch": 30000
}
},
"difficulty": "1",
"gasLimit": "8000000",
"extradata": "0x0000000000000000000000000000000000000000000000000000000000000000012345678901234567890123456789012345678900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"alloc": {
"0x你的账户地址1": {
"balance": "100000000000000000000000000"
}
}
}
几个关键配置说明:
chainId:链的唯一标识,自定义一个不与公网冲突的数字period:出块间隔,单位为秒,这里设置为 5 秒extradata:这是 Clique POA 的核心,格式为0x+ 64位十六进制前缀 + 签名者地址(去掉0x前缀,40位) + 130位后缀alloc:预分配的以太币余额,方便初始测试
初始化并启动节点
初始化创世区块
geth --datadir node1 init genesis.json geth --datadir node2 init genesis.json
看到 Successfully wrote genesis state 即为初始化成功。
启动第一个节点(签名节点)
geth --datadir node1 \ --networkid 20240808 \ --port 30303 \ --http --http.addr 0.0.0.0 --http.port 8545 \ --http.corsdomain "*" \ --http.api eth,net,web3,personal,miner,admin,clique \ --unlock 0x签名者地址 \ --password node1/password.txt \ --mine --allow-insecure-unlock \ --syncmode "full" \ console 2>>node1.log
参数说明:
--mine:开启出块模式--unlock:解锁签名者账户(POA 出块签名必须解锁账户)--allow-insecure-unlock:允许 HTTP 环境下解锁账户(仅测试环境使用)--password:将账户密码写入password.txt文件方便自动化
启动第二个节点
新开一个终端:
geth --datadir node2 \ --networkid 20240808 \ --port 30304 \ --http --http.port 8546 \ --http.api eth,net,web3,admin \ console 2>>node2.log
连接节点组成网络
在节点2的控制台中获取节点信息:
admin.nodeInfo.enode // 输出类似:"enode://xxx@127.0.0.1:30304?discport=0"
在节点1的控制台中添加节点2为对等节点:
admin.addPeer("enode://xxx@127.0.0.1:30304?discport=0")
验证连接:
admin.peers
如果能看到对方节点信息,说明组网成功,此时节点1每 5 秒出一个块,可以用 eth.blockNumber 持续观察区块高度增长。
将私链接入 MetaMask
打开 MetaMask,添加自定义网络:
- 网络名称:My POA Chain
- RPC URL:
The End
发布于:2026-10-18,除非注明,否则均为原创文章,转载请注明出处。

