以太坊作为全球第二大区块链平台,以其智能合约功能和可编程性闻名于世,虽然大多数开发者选择在以太坊主网或测试网(如Ropsten、Kovan、Goerli)上进行开发和测试,但在某些特定场景下,例如企业内部应用、实验性项目或需要完全控制网络环境时,搭建一条私有或联盟链(可视为特定类型的“公有链”概念,此处更侧重于搭建一个独立的、可自定义的以太坊网络)是非常有价值的,本文将详细介绍如何从零开始搭建一条属于自己的以太坊公有链(更准确地说是私有/联盟链,因为真正的公有链需要去中心化和广泛的节点参与,但搭建过程类似,只是节点范围可控)。
重要提示: 严格意义上的“公有链”要求极高的去中心化、安全性和抗审查性,个人或小团队完全搭建一条可被广泛认可和使用的公有链难度极大,成本极高,本教程旨在指导搭建一个自定义的、可独立运行的以太坊网络,通常用于私有链或联盟链场景,理解其核心原理和搭建过程。
第一部分:准备工作
在开始搭建之前,请确保你的环境满足以下要求:
- 操作系统: 推荐使用 Linux(如 Ubuntu 20.04 LTS)或 macOS,Windows 系统也可以,但可能需要额外的配置或使用 WSL。
- 硬件要求:
- CPU: 至少 2 核,推荐 4 核或以上。
- 内存: 至少 4GB,推荐 8GB 或以上(运行节点和同步数据会占用较多内存)。
- 存储: 至少 100GB 可用空间(SSD 推荐用于同步速度)。

- 网络: 稳定的互联网连接,如果节点需要对外提供服务,则需要公网 IP。
- 软件依赖:
- Go 编程语言: 以太坊客户端(如 Geth)是用 Go 编写的,需要安装 Go 环境,推荐版本 1.19 或更高。
- Git: 用于下载源代码。
- 构建工具: 如
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 等。
- 使用 Geth 控制台: 在另一个终端窗口,运行: