使用Geth搭建以太坊私有网络完整指南
以太坊作为全球第二大区块链平台,其灵活性和可扩展性使其成为区块链开发的首选,而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、--wsapi:WebSocket相关配置--wsorigins:允许WebSocket跨域访问(允许所有域名)console:启动交互式控制台(可选)
启动后,节点会开始同步区块(创世区块为空,直接完成同步),并进入控制台界面(输入exit可退出)。
启动第二个节点(同步节点)
在另一台机器或同一机器的另一个目录下,启动第二个节点并连接到第一个节点:
mkdir ./data2 cd ./data2 geth --datadir ./data --networkid 2023 --bootnodes "enode://<节点1的enode地址>:<端口>" console
获取节点1的enode地址: 在节点1的控制台中输入:
admin.nodeInfo.enode
输出格式为:
enode://<公钥>@<IP地址>:<端口>?discport=<发现端口>
enode://a1b2c3d4e5f6...@192.168.1.100:30303?discport=30303
将此地址复制到节点2的--bootnodes参数中,即可实现节点间同步。
验证节点同步
在任一节点控制台中输入:
eth.syncing
若返回{currentBlock: 0, highestBlock: 0, ...},表示同步完成(私有网络创世区块为空,同步瞬间完成)。
私有网络基础操作
创建账户
在控制台中使用personal.newAccount命令创建新账户:
personal.newAccount("your_password")
返回账户地址,
"0x1234567890123456789012345678901234567890"
查看账户列表
eth.accounts
查看账户余额
eth.getBalance("0x1234567890123456789012345678901234567890")
私有网络初始无ETH,需手动转账或挖矿获取。
挖矿获取ETH
(1)启动挖矿
miner.start(1) // 1表示使用1个CPU线程
(2)停止挖矿
miner.stop()
(3)查看挖矿状态
eth.mining // 返回true/false,
下一篇: web3是什么
