以太坊作为全球领先的智能合约平台,其公链以其去中心化、透明性和安全性著称,在某些场景下,如企业内部应用、数据隐私要求高的项目、大规模测试网部署或特定业务逻辑的验证,我们并不希望所有数据都公开在公链上,这时,部署一条以太坊私有链便成为了一个理想的选择,本文将详细介绍以太坊私有链的部署步骤、关键考量及实用技巧。

以太坊私有链是指使用以太坊的底层技术(如以太坊客户端、共识机制、智能合约等),但在一个受限的、非公开的网络环境中运行的区块链,它与公链的核心区别在于:
部署以太坊私有链有多种方式,选择哪种方式取决于具体需求、技术栈熟悉度和复杂度容忍度。
使用Geth(Go-Ethereum)的“--dev”模式或私有网络模式:
--dev模式:创建一个单节点、即时的私有链,主要用于开发和测试,数据不会持久化。--networkid:通过指定唯一的networkid来创建一个私有网络,多个节点使用相同的networkid和正确的创世块文件即可组成私有链,这是最常用和相对轻量的方式之一。使用Parity客户端:
使用Clique(权威证明)共识算法:
使用第三方框架或工具:

使用Substrate(高级):
这里以最常用的Geth客户端为例,介绍部署一条基于自定义创世块的私有链的基本步骤:
go get -u github.com/ethereum/go-ethereum命令安装,或下载预编译的二进制文件。创世块是区块链的起点,定义了初始的区块链参数,创建一个名为genesis.json的文件,内容如下(这是一个简单的PoA示例):
{
"config": {
"chainId": 12345, // 私有链的唯一ID,与公链区分
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"londonBlock": 0,
"clique": { // 使用Clique PoA共识
"period": 15, // 出块时间(秒)
"epoch": 30000, // 每隔多少区块重新初始化签名者列表
"blocktime": 15
}
},
"nonce": "0x0",
"timestamp": "0x0",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000", // 初始签名者地址可以在这里指定,格式为 "0x<address>0000000000000000000000000000000000000000000000000000000000000000"
"gasLimit": "0xffffffff",
"difficulty": "0x400",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": {} // (可选)预分配账户和以太币
}
注意: 如果使用Clique,extraData字段可以设置初始的授权签名者地址,格式为0x<address1>0000<address2>0000...,每个地址后跟8个零,最多可指定32个地址。
在命令行中,进入genesis.json文件所在的目录,执行以下命令:
geth --datadir ./my_private_chain init genesis.json
此命令会在./my_private_chain目录下创建区块链数据文件夹,包括创世块。

启动第一个节点(作为创世节点):
geth --datadir ./my_private_chain --networkid 12345 --nodiscover --ipcdisable --authrpc.addr "localhost" --authrpc.port 8551 --http --http.addr "0.0.0.0" --http.port 8545 --http.vhosts "*" --allow-insecure-unlock
参数说明:
--datadir: 指定数据目录。--networkid: 指定网络ID,与创世块中的chainId一致,确保不同私有链隔离。--nodiscover: 禁止自动发现其他节点,因为是私有链。--ipcdisable: 禁用IPC接口(可选,根据需求)。--authrpc.addr 和 --authrpc.port: JSON-RPC接口地址和端口,用于与节点交互(如通过web3.js)。--http 和 --http.addr 和 --http.port: HTTP JSON-RPC接口。--allow-insecure-unlock: 允许在不加密的情况下解锁账户(仅开发测试环境使用,生产环境应避免)。启动后,节点会开始同步创世块,并等待其他节点连接。
如果需要多个节点组成私有链,可以在另一台机器或同一台机器的不同端口上启动第二个节点,并指定第一个节点的节点ID进行连接。
获取第一个节点的节点ID: 第一个节点启动后,会在geth attach的console中或通过geth nodekey命令获取到节点ID(enode URL)。
然后启动第二个节点,并添加第一个节点为静态节点:
geth --datadir ./my_private_chain_node2 --networkid 12345 --nodiscover --ipcdisable --authrpc.addr "localhost" --authrpc.port 8552 --http --http.addr "0.0.0.0" --http.port