在以太坊生态中,geth 发送交易是开发者与链交互最基础也最核心的操作之一,无论你是想转账 ETH、调用合约,还是做自动化脚本,都必须先搞懂 geth 的交易机制,本文将结合命令行与代码示例,带你一步步完成从准备账户到广播交易的完整链路,并指出常见坑点,让你少走弯路。
准备环境
- 安装 Geth:在官网下载对应系统的二进制包,或使用包管理器(如 macOS 的 brew install ethereum)。
- 同步节点:主网数据量大,建议先用
--syncmode snap
快速同步;若只是测试,可直接用--dev
启动私有链。 - 创建或导入账户:
geth account new --datadir ./data
生成的 keystore 文件务必离线备份,密码牢记。
解锁账户与构造交易
Geth 不允许明文私钥出现在命令行,因此需要先把账户解锁到内存:
geth attach http://localhost:8545
> personal.unlockAccount(eth.accounts[0], "你的密码", 300)
解锁后,使用 eth.sendTransaction
发送交易:
> eth.sendTransaction({
from: eth.accounts[0],
to: "0xRecipientAddress",
value: web3.toWei(0.1, "ether"),
gas: 21000,
gasPrice: web3.toWei(10, "gwei")
})
返回的哈希即为交易 ID,可用 eth.getTransactionReceipt
查询回执。
离线签名(更安全)
生产环境不建议解锁账户,推荐离线签名:
- 用
geth account new
生成账户后,导出私钥到本地文件。 - 使用 Node.js 与
@ethereumjs/tx
库构造交易:const txData = { nonce: await web3.eth.getTransactionCount(from), gasLimit: 21000, gasPrice: 10000000000, to: to, value: 100000000000000000 }; const tx = new Tx(txData, { chain: 'mainnet' }); tx.sign(privateKey); const serialized = '0x' + tx.serialize().toString('hex'); web3.eth.sendSignedTransaction(serialized);
这样私钥全程不触网,极大降低泄露风险。
常见坑点
- nonce 重复:同一地址连续发多笔交易时,必须手动递增 nonce,否则会被节点拒绝。
- gasPrice 过低:主网拥堵时,10 gwei 可能被打回,建议通过
eth.gasPrice
动态获取。 - 链 ID 错误:测试链与主网的 chainId 不同,离线签名时必须匹配,否则交易无法上链。
- 同步未完成:节点未同步到最新区块时,发送交易会报
replacement transaction underpriced
,等待同步完成即可。
进阶技巧
- 批量转账:用脚本循环构造交易数组,再并行
sendSignedTransaction
,可显著提升效率。 - 事件监听:结合
web3.eth.subscribe('pendingTransactions')
实时捕获待打包交易,做 MEV 或风控分析。 - 本地模拟:Ganache 或 Hardhat 本地 fork 主网状态,提前测试 gas 消耗,避免主网失败浪费手续费。
总结
掌握 geth 发送交易不仅是入门以太坊的第一步,更是后续 DeFi、NFT、跨链桥等复杂场景的基石,牢记“离线签名 + 动态 gas + 正确 nonce”三大原则,你就能在链上世界自由穿梭,不再被“交易卡住”或“余额消失”吓到,祝各位开发顺利,早日实现财富自由!