以太坊作为全球第二大区块链平台,其灵活性和可扩展性使其成为区块链开发的首选,而Geth(Go-Ethereum)是以太坊官方实现的Go语言客户端,提供了完整的节点功能,包括私有网络搭建、交易处理、智能合约交互等,本文将详细介绍如何使用Geth从零开始搭建一个以太坊私有网络,并涵盖节点初始化、网络配置、节点启动及基础操作等关键步骤。
环境准备
在开始搭建私有网络前,需确保系统满足以下要求:
系统要求
- 操作系统:Linux(推荐Ubuntu 18.04+)、macOS或Windows(需WSL2支持)
- 硬件配置:CPU 2核+、内存4GB+、硬盘空间20GB+(根据节点需求调整)
- 网络:私有网络节点间需能互相通信(同一局域网或通过端口映射)
安装Geth
Geth可通过官方预编译包或源码编译安装,推荐使用官方预编译包,步骤如下:
(1)Linux/macOS
# 下载最新版Geth(以Linux 64位为例) wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.13.6-4bb3c97d.tar.gz # 解压 tar -xzf geth-linux-amd64-1.13.6-4bb3c97d.tar.gz # 将geth添加到系统PATH sudo mv geth /usr/local/bin/
(2)Windows
- 访问 Geth官方下载页,下载Windows版本(
geth-windows-amd64-1.13.6-4bb3c97d.zip) - 解压后将
geth.exe所在目录添加到系统环境变量PATH中
(3)验证安装
geth version # 输出版本信息即表示安装成功
初始化私有网络节点
私有网络需要唯一的网络ID(避免与公有网络冲突)和创世区块(定义网络初始规则),以下是具体步骤:
创建工作目录
mkdir ~/ethereum-private-net cd ~/ethereum-private-net
编写创世区块配置文件
创世区块配置文件(genesis.json)定义了网络的初始参数,如链ID、难度、奖励分配等,以下是一个典型的私有网络创世配置示例:
{
"config": {
"chainId": 2023, // 私有网络唯一ID(避免与公有网络冲突,如主网为1,Ropsten为3)
"homesteadBlock": 0, // 启用Homestead规则的区块高度
"eip155Block": 0, // 启用EIP-155规则的区块高度
"eip158Block": 0, // 启用EIP-158规则的区块高度
"byzantiumBlock": 0, // 启用Byzantium规则的区块高度
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"londonBlock": 0,
"mergeNetsplitBlock": 0,
"terminalTotalDifficulty": 0,
"terminalTotalDifficultyPassed": true,
"alloc": {} // 预分配地址(可选,用于测试)
},
"difficulty": "0x400", // 初始难度(较低难度便于快速出块)
"gasLimit": "0xffffffff", // gas上限
"extradata": "", // 额外数据(留空即可)
"coinbase": "0x0000000000000000000000000000000000000000", // 矿工地址(初始无矿工)
"nonce": "0x0000000000000042", // 初始nonce值
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", // 初始mixhash
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" // 父区块哈希(创世区块为空)
}
初始化节点
使用geth init命令根据genesis.json初始化节点数据目录:
geth --datadir ./data init genesis.json
执行后,./data目录下会生成keystore(密钥存储)和geth(链数据)子目录。
启动私有网络节点
私有网络可启动多个节点形成网络,节点间需通过--bootnodes或静态发现机制互联,以下是单节点和多节点启动的示例:
启动第一个节点(创世节点)
geth \ --datadir ./data \ --networkid 2023 \ --nodiscover \ --maxpeers 25 \ --rpc \ --rpcaddr "0.0.0.0" \ --rpcport 8545 \ --rpcapi "eth,net,web3,personal" \ --ws \ --wsaddr "0.0.0.0" \ --wsport 8546 \ --wsapi "eth,net,web3,personal" \ --wsorigins "*" \ console
参数说明:
--datadir:指定数据目录--networkid:网络ID(与genesis.json中一致)--nodiscover:禁止自动发现其他节点(私有网络手动管理)--maxpeers:最大连接节点数--rpc:启用HTTP-RPC服务--rpcaddr:RPC监听地址(0.0.0允许所有IP访问)--rpcport:RPC端口(默认8545)--rpcapi:开放的API接口(如eth、net、web3)--ws:启用WebSocket服务--wsaddr、--wsport