以太坊作为全球第二大区块链平台,以其智能合约功能和可编程性闻名于世,虽然大多数开发者选择在以太坊主网或测试网(如Ropsten、Kovan、Goerli)上进行开发和测试,但在某些特定场景下,例如企业内部应用、实验性项目或需要完全控制网络环境时,搭建一条私有或联盟链(可视为特定类型的“公有链”概念,此处更侧重于搭建一个独立的、可自定义的以太坊网络)是非常有价值的,本文将详细介绍如何从零开始搭建一条属于自己的以太坊公有链(更准确地说是私有/联盟链,因为真正的公有链需要去中心化和广泛的节点参与,但搭建过程类似,只是节点范围可控)。

重要提示: 严格意义上的“公有链”要求极高的去中心化、安全性和抗审查性,个人或小团队完全搭建一条可被广泛认可和使用的公有链难度极大,成本极高,本教程旨在指导搭建一个自定义的、可独立运行的以太坊网络,通常用于私有链或联盟链场景,理解其核心原理和搭建过程。
在开始搭建之前,请确保你的环境满足以下要求:
make(在 Linux/macOS 上通常已预装或可通过包管理器安装)。以太坊有多个客户端实现,如 Geth(Go 语言)、Parity(Rust 语言)、OpenEthereum(原 Parity Core)等,本教程以最常用和功能最全面的 Geth 为例。
安装 Go:

# 下载 Go (以 Linux 为例,具体版本请访问 Go 官网) wget https://go.dev/dl/go1.19.linux-amd64.tar.gz # 解压 sudo tar -C /usr/local -xzf go1.19.linux-amd64.tar.gz # 配置环境变量 echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc source ~/.bashrc # 验证安装 go version
下载并编译 Geth:
# 克隆 Geth 仓库 git clone https://github.com/ethereum/go-ethereum.git # 进入目录 cd go-ethereum # 切换到稳定版本(可选,v1.13.0) git checkout v1.13.0 # 编译 Geth make geth # 编译完成后,可执行文件在 ./build/bin/geth # 可以将其复制到系统 PATH 中方便使用 sudo cp ./build/bin/geth /usr/local/bin/ # 验证安装 geth version
创世区块是区块链的起点,包含了网络初始的配置信息,我们需要创建一个自定义的创世区块配置文件。
创建创世配置文件 genesis.json: 在你的工作目录下创建一个名为 genesis.json 的文件,内容如下:
{
"config": {
"chainId": 12345, // 自定义链 ID,确保唯一性
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"londonBlock": 0,
"mergeNetsplitBlock": 0,
"shanghaiTime": 0,
"terminalTotalDifficulty": 0,
"terminalTotalDifficultyPassed": true,
"ethash": {} // 使用 Ethash 共识算法(PoW)
},
"alloc": {}, // 预分配地址和余额(可选)
"coinbase": "0x0000000000000000000000000000000000000000", // 矿工地址
"difficulty": "0x40000", // 初始难度
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000", // 额外数据
"gasLimit": "0x8000000", // Gas 限制
"nonce": "0x0000000000000042", // 随机数
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", // 混合哈希
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" // 父区块哈希(创世区块为空)
}
chainId: 非常重要,用于区分不同的以太坊网络,避免交易广播到错误网络。alloc: 可以在这里预分配一些地址和初始代币,方便测试。"ethash": {}: 表明我们使用 PoW 共识,如果是 PoA(权威证明),需要修改为 clique 配置。初始化节点: 使用 geth 的 init 命令,并指定刚才创建的 genesis.json 文件:

geth --datadir ./data init genesis.json
执行后,./data 目录下会生成 geth 运行所需的数据结构,包括区块链数据、密钥等。
现在我们可以启动初始化好的节点了,根据你的需求,可以选择不同的启动模式。
启动私有节点(仅自己可见,不与其他节点连接):
geth --datadir ./data --networkid 12345 --nodiscover --http --http.addr "0.0.0.0" --http.port "8545" --http.api "personal,eth,net,web3,miner,txpool"
--datadir ./data: 指定数据目录。--networkid 12345: 指定网络 ID,与 genesis.json 中一致。--nodiscover: 不自动发现其他节点,适用于私有链。--http: 启动 HTTP-RPC 服务,方便与 Dapp 交互。--http.addr "0.0.0.0": 允许任何 IP 访问 HTTP-RPC 服务(生产环境请谨慎设置)。--http.port "8545": 指定 HTTP-RPC 端口。--http.api: 暴露的 API 接口列表。启动节点并允许其他节点加入(联盟链场景): 如果你希望其他已知节点能加入你的网络,可以省略 --nodiscover,并通过 --bootnodes 指定引导节点(如果有):
geth --datadir ./data --networkid 12345 --http --http.addr "0.0.0.0" --http.port "8545" --bootnodes "enode://<其他节点的enode地址>@<其他节点IP>:30303"
启动后,geth 会开始同步区块,由于是新建网络,创世区块就是当前的全部。
启动节点后,我们可以通过多种方式与节点交互,如 geth 控制台、Web3.js、Web3.py 等。
免责声明:本文为转载,非本网原创内容,不代表本网观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
如有疑问请发送邮件至:bangqikeconnect@gmail.com