以太坊,作为全球领先的智能合约平台,其公链虽然功能强大,但对于开发者、学习者或企业而言,存在成本高、速度慢、测试环境不可控等问题,为了解决这些问题,搭建一个本地或私有的以太坊网络成为了开发测试的理想选择,本文将详细介绍如何在 Windows (Win) 系统环境下,从零开始搭建一个功能完备的以太坊私有网络。
在开始之前,我们先明确一下搭建私有网络的核心目的:

在动手之前,我们需要了解几个核心概念并准备好必要的工具。
核心概念:
工具准备:
.zip 文件,geth-windows-amd64-1.13.7-4dc529e5.zip)。安装并配置 Geth
.zip 文件解压到一个你方便管理的目录,C:\Ethereum,为了方便在命令行中直接使用 geth 命令,建议将这个路径添加到系统的环境变量 Path 中。
Path,点击“编辑”,新建”,将 C:\Ethereum 添加进去。geth version,如果能看到 Geth 的版本信息,说明安装成功。创建创世区块配置文件
创世区块是私有网络的“宪法”,我们需要创建一个 JSON 文件来定义它。
在你的工作目录(C:\Ethereum)下,创建一个名为 genesis.json 的文件。
用代码编辑器打开 genesis.json,并粘贴以下内容,这是一个基础的 PoA(权威证明)配置,适合私有网络使用。
{
"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,
"shanghaiTime": 0,
"terminalTotalDifficulty": 0,
"terminalTotalDifficultyPassed": true,
"ethash": {}
},
"alloc": {
// "0x...": { "balance": "100000000000000000000" } // 可以在这里预分配一些资金给指定地址
},
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x40000", // 初始难度,私有网络可以设低一些
"extraData": "",
"gasLimit": "0xffffffff",
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
} 关键参数解释:

chainId:非常重要,确保你的私有网络 ID 唯一。alloc:用于在创世区块中预分配资金给某些地址,这里我们留空,之后通过命令行创建。difficulty:初始挖矿难度,私有网络中我们可以将其设得很低,以便快速出块。初始化私有网络
我们使用刚刚创建的 genesis.json 文件来初始化一个新的数据目录,这个目录将存储我们的区块链数据。
C:\Ethereum\node1。cd C:\Ethereum\node1
geth --datadir "./" init C:\Ethereum\genesis.json
如果看到 Successfully initialised new genesis block 的提示,说明初始化成功。node1 目录下会生成 geth 和 keystore 等文件夹。
启动私有网络节点
我们启动这个节点,让它开始运行。
确保你仍在 C:\Ethereum\node1 目录下。
执行启动命令:
geth --datadir "./" --nodiscover --networkid 15 console
命令参数解释:
--datadir "./":指定数据目录为当前目录。--nodiscover:禁止节点自动发现其他节点,这对于私有网络至关重要,确保你的节点不会被公网节点发现。--networkid 15:指定网络 ID,必须与 genesis.json 中的 chainId 保持一致。console:启动后直接进入 JavaScript 交互式控制台。启动后,你会看到 Geth 正在同步区块(实际上是从创世区块开始),很快就会同步完成,并出现 > 提示符,表示已进入控制台。

与私有网络交互
我们的私有网络已经运行起来了!让我们在控制台中进行一些基本操作。
查看账户列表:
eth.accounts
刚开始,列表会是空的。
创建一个新账户:
personal.newAccount("请设置你的密码") 执行后,会返回一个以 0x 开头的地址,这个地址就是你的新账户,并且已经被 Geth 自动解锁,你可以再次运行 eth.accounts 查看确认。
查看账户余额:
eth.getBalance(eth.accounts[0])
由于我们没有预分配资金,所以余额会是 0。
开始挖矿: 为了让账户有资金并产生区块,我们需要开始挖矿。
miner.start(1) // 参数 1 表示使用 1 个 CPU 线程进行挖矿
挖矿开始后,你会看到节点开始打包交易并出块,等待片刻后,再次查看账户余额:
eth.getBalance(eth.accounts[0])