:2026-05-21 8:51 点击:1
以太坊作为全球领先的智能合约平台,其公链以其去中心化、透明性和安全性著称,在某些场景下,如企业内部应用、数据隐私要求高的项目、大规模测试网部署或特定协议的验证,我们并不需要公链的完全开放性,而是需要一个可控、私密、低成本的运行环境,这时,搭建以太坊私有链便成为了一个非常实用的选择,本文将详细介绍如何从零开始搭建一条以太坊私有链,并探讨其关键特性和应用场景。
为何选择以太坊私有链?
在动手之前,我们首先要明确搭建私有链的目的和优势:
搭建以太坊私有链的准备工作
环境要求:

web3.js/ethers.js 库进行交互。安装 Geth: 以 Ubuntu 为例,打开终端,执行以下命令:
# 更新包管理器 sudo apt-get update # 安装依赖 sudo apt-get install -y software-properties-common # 添加以太坊官方 PPA sudo add-apt-repository -y ppa:ethereum/ethereum sudo apt-get update # 安装 geth sudo apt-get install -y ethereum
安装完成后,可以通过 geth version 命令验证是否安装成功。
动手搭建:使用 Geth 创建私有链
搭建私有链的核心步骤包括:初始化创世区块、启动节点、控制节点以及添加节点(如果是多节点联盟链)。
创建创世区块配置文件
私有链的“规则”由创世区块定义,我们需要创建一个 JSON 格式的创世配置文件,private-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,
"ethash": {} // 共识算法,私有链可选 ethash (模拟公链) 或其他如 clique (用于权威证明)
},
"alloc": {
// "0x742d35Cc6634C0532925a3b844Bc454e4438f44e": {"balance": "1000000000000000000000000"} // 可预分配账户及余额
},
"coinbase": "0x0000000000000000000000000000000000000000", // 矿工地址
"difficulty": "0x4000", // 初始难度,私有链可以设得很低,便于挖矿
"extraData": "", // 附加信息
"gasLimit": "0xffffffff", // Gas 限制
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}
chainId:务必设置为一个唯一的非0值,避免与现有网络冲突。difficulty:私有链初始难度不宜过高,否则早期挖矿困难。alloc:可以预先分配一些账户并设置初始余额,方便后续测试。初始化创世区块
使用 Geth 的 init 命令,指定刚才创建的创世配置文件:
geth --datadir ./my-private-chain init private-genesis.json
执行后,Geth 会在 ./my-private-chain 目录下创建数据文件夹,包括 geth (链数据)、keystore (账户密钥) 等。
启动私有链节点 初始化完成后,即可启动私有链节点:
geth --datadir ./my-private-chain --networkid 15 --http --http.addr "0.0.0.0" --http.port "8545" --http.api "personal,eth,net,web3" --ws --ws.addr "0.0.0.0" --ws.port "8546" --ws.api "personal,eth,net,web3"
命令参数解释:
--datadir: 指定数据目录。--networkid: 设置网络 ID,与创世文件中的 chainId 保持一致。--http: 启用 HTTP-RPC 服务。--http.addr: HTTP-RPC 监听地址,"0.0.0.0" 表示允许任何 IP 访问(生产环境需谨慎)。--http.port: HTTP-RPC 监听端口。--http.api: 通过 HTTP-RPC 导出的 API 接口。--ws: 启用 WebSocket-RPC 服务。--ws.addr / --ws.port: WebSocket-RPC 监听地址和端口。--ws.api: 通过 WebSocket-RPC 导出的 API 接口。--mine (可选): 如果需要节点自己挖矿,可以添加此参数,并配合 --miner.etherbase 设置挖矿地址。--miner.threads (可选): 挖矿线程数。启动后,节点会开始尝试连接其他节点(如果配置了),如果没有其他节点,它将是创世节点。
控制台交互 打开一个新的终端窗口,进入 Geth 控制台:
geth attach http://localhost:8545
进入控制台后,你可以使用 Web3.js 或 JavaScript 命令与私有链交互:
// 查看当前区块号
eth.getBlock("latest").number
// 查看账户列表
eth.accounts
// 如果没有账户,可以创建一个
personal.newAccount("your-password")
// 记录下返回的账户地址
// 如果创世文件中预分配了余额,可以查看账户余额
eth.getBalance("0x预分配的账户地址")
// 如果没有预分配且节点在挖矿,可以设置挖矿地址并开始挖矿
// personal.unlockAccount(eth.accounts[0], "your-password")
// miner.setEtherbase(eth.accounts[0])
// miner.start(1) // 启动一个线程挖矿
// 发送交易(从一个账户转账到另一个账户)
// 需要先解锁发送方账户
// personal.unlockAccount(发送方账户地址, "密码")
// eth.sendTransaction({from: "发送方账户地址", to: "接收方账户地址", value: web3.toWei(1, "ether")})
// 查看交易是否被打包
// txpool.status
多节点私有链/联盟链简介
如果需要多个节点共同维护私有链(即联盟链场景),则需要:
本文由用户投稿上传,若侵权请提供版权资料并联系删除!