以太坊 Geth 客户端从入门到实践,详细使用教程
以太坊作为全球领先的智能合约平台,其背后离不开众多客户端的实现,Geth(Go-Ethereum)是以太坊官方维护的、用Go语言编写的一款功能强大且广泛使用的以太坊客户端,它允许用户连接到以太坊网络,进行节点管理、挖矿、交易发送、智能合约部署与交互等一系列操作,本教程将带你从零开始,逐步了解并掌握Geth的基本使用方法。
Geth简介与安装
什么是Geth? Geth是“Go-Ethereum”的缩写,它不仅是一个以太坊节点,更是一个功能完备的命令行工具,通过Geth,用户可以:
- 连接到以太坊网络:主网(Mainnet)、测试网(如Ropsten, Goerli, Sepolia)或私有链。
- 同步区块链数据:下载并验证完整的或区块头级别的区块链数据。
- 管理账户:创建、导入、导出以太坊账户(钱包)。
- 发送交易:向其他账户转移ETH或与智能合约交互。
- 挖矿:在PoW机制下(或测试网/私有链的模拟机制)参与共识过程,获得区块奖励。
- 运行智能合约:部署新合约,或调用现有合约的函数。
- 搭建私有链/测试链:配置和启动自己的以太坊网络。
安装Geth
Geth的安装方式因操作系统而异:
-
Windows系统:
- 访问 Geth官方GitHub Releases页面。
- 下载适用于Windows的
geth-windows-amd64-版本号.zip文件。 - 解压压缩包,将
geth.exe所在的路径添加到系统环境变量PATH中,方便在任何目录下调用。 - 打开命令提示符(CMD)或PowerShell,输入
geth version验证安装是否成功。
-
macOS系统:
- 使用Homebrew(推荐):
brew install geth
- 手动安装:类似Windows,下载对应Darwin系统的压缩包,解压并配置PATH。
- 使用Homebrew(推荐):
-
Linux系统(以Ubuntu为例):
- 使用PPA(适用于Ubuntu 16.04+):
sudo add-apt-repository -y ppa:ethereum/ethereum sudo apt-get update sudo apt-get install geth
- 手动下载二进制文件:从GitHub下载对应Linux系统的压缩包,解压并配置PATH。
- 使用PPA(适用于Ubuntu 16.04+):
安装完成后,在终端输入 geth version 查看版本信息,确保安装成功。
首次启动与节点同步
安装好Geth后,第一步通常是启动节点并同步以太坊网络数据。
连接到主网(Mainnet)并同步
以太坊主网是真实值钱交易的链,启动Geth同步主网数据:
geth --syncmode "full" --http
--syncmode "full":指定同步模式为"完整同步",会下载并验证所有区块和交易数据,同步时间较长但数据最完整,其他可选模式有fast(只下载区块头,然后从最近的检查点同步状态)、light(轻客户端模式,不存储完整状态)。--http:启用HTTP-RPC服务,默认监听端口8545,方便与其他工具(如MetaMask、Truffle、Postman)或Web应用交互。
启动后,Geth会开始连接到其他节点,下载并同步区块数据,首次同步可能需要很长时间(几天到几周不等,取决于你的网络带宽和电脑性能),并占用大量磁盘空间(目前已超过TB级别)。
你可以通过以下命令查看同步状态:
geth attach
在进入的JavaScript交互式控制台中(类似浏览器控制台):
eth.syncing
如果返回false,表示已同步完成;如果返回一个对象,则表示仍在同步中,其中currentBlock是当前已同步的区块号,highestBlock是网络最高区块号。
连接到测试网
为了避免在测试网络中消耗真实的ETH,开发者通常在测试网上进行开发和测试,以太坊有多个测试网,如Sepolia(当前主流测试网)。
连接到Sepolia测试网并同步:
geth --sepolia --syncmode "full" --http
--sepolia:指定连接到Sepolia测试网。
后台运行
同步数据时,你可能不希望终端一直被占用,可以使用--http.addr和--http.port指定HTTP服务地址和端口,并结合nohup(Linux/macOS)或Windows的start /B命令让Geth在后台运行:
Linux/macOS:
nohup geth --sepolia --syncmode "fast" --http --http.addr "0.0.0.0" --http.port "8545" --http.api "eth,net,web3,personal" > geth.log 2>&1 &
--http.addr "0.0.0.0":允许任何IP访问HTTP服务。--http.api "eth,net,web3,personal":指定暴露给HTTP API的模块。> geth.log 2>&1 &:将标准输出和错误重定向到geth.log文件,并让进程在后台运行。
Windows:
start /B geth --sepolia --syncmode "fast" --http --http.addr "0.0.0.0" --http.port "8545" --http.api "eth,net,web3,personal" > geth.log 2>&1
账户管理

以太坊账户用于管理资产和发起交易。
创建新账户
在Geth交互式控制台中(通过geth attach进入):
personal.newAccount("your_password_here")
替换"your_password_here"为你为账户设置的强密码,命令执行后会返回一个账户地址,如"0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B",请务必妥善保存地址和密码!
查看账户列表
eth.accounts
导入账户 如果你有账户的私钥或Keystore文件(UTC/UTC--版本):
- 通过私钥导入:
personal.importRawKey("your_private_key_here", "your_password_here") - 通过Keystore文件导入:
首先将Keystore文件(如
UTC--2023-10-27T10-00-00.000000000Z--0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B)放到某个目录,然后在控制台中:personal.importKey("/path/to/your/keystore/file", "your_password_here")
查看账户余额
eth.getBalance("0xYourAccountAddress")
返回的余额是Wei,1 ETH = 10^18 Wei,要转换为ETH,可以除以1e18:
eth.getBalance("0xYourAccountAddress") / 1e18
发送交易
发送交易需要支付Gas(矿工费)。
解锁账户 在发送交易前,需要先解锁账户:
personal.unlockAccount(eth.accounts[0], "your_password", 300) // 300是解锁时间(秒)
或指定具体地址:
personal.unlockAccount("0xYourAccountAddress", "your_password", 300)
发送ETH转账
假设我们要从eth.accounts[0]向"0xRecipientAddress"转账0.1 ETH。
eth.sendTransaction({
from: "0xYourSenderAddress",
to: "0xRecipientAddress",
value: web3.toWei(0.1, "ether"),
gas: 21000 // 转账交易的默认Gas Limit
})
value:转账金额,使用web3.toWei将ETH转换为Wei。gas:Gas Limit,是用户愿意为交易支付的最大Gas量,简单转账通常21000 Gas。
发送成功后,会返回交易哈希(transaction hash),你可以通过eth.getTransaction("0xTransactionHash")查看交易状态,或通过`eth.getTransactionReceipt("0xTransactionHash