在以太坊生态中,geth 发送交易是开发者与链交互最基础也最核心的操作之一,无论你是想转账 ETH、调用合约,还是做自动化脚本,都必须先搞懂 geth 的交易机制,本文将结合命令行与代码示例,带你一步步完成从准备账户到广播交易的完整链路,并指出常见坑点,让你少走弯路。

准备环境

  1. 安装 Geth:在官网下载对应系统的二进制包,或使用包管理器(如 macOS 的 brew install ethereum)。
  2. 同步节点:主网数据量大,建议先用 --syncmode snap 快速同步;若只是测试,可直接用 --dev 启动私有链。
  3. 创建或导入账户:
    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 查询回执。

离线签名(更安全)
生产环境不建议解锁账户,推荐离线签名:

  1. geth account new 生成账户后,导出私钥到本地文件。
  2. 使用 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);

    这样私钥全程不触网,极大降低泄露风险。

常见坑点

  1. nonce 重复:同一地址连续发多笔交易时,必须手动递增 nonce,否则会被节点拒绝。
  2. gasPrice 过低:主网拥堵时,10 gwei 可能被打回,建议通过 eth.gasPrice 动态获取。
  3. 链 ID 错误:测试链与主网的 chainId 不同,离线签名时必须匹配,否则交易无法上链。
  4. 同步未完成:节点未同步到最新区块时,发送交易会报 replacement transaction underpriced,等待同步完成即可。

进阶技巧

  • 批量转账:用脚本循环构造交易数组,再并行 sendSignedTransaction,可显著提升效率。
  • 事件监听:结合 web3.eth.subscribe('pendingTransactions') 实时捕获待打包交易,做 MEV 或风控分析。
  • 本地模拟:Ganache 或 Hardhat 本地 fork 主网状态,提前测试 gas 消耗,避免主网失败浪费手续费。

总结
掌握 geth 发送交易不仅是入门以太坊的第一步,更是后续 DeFi、NFT、跨链桥等复杂场景的基石,牢记“离线签名 + 动态 gas + 正确 nonce”三大原则,你就能在链上世界自由穿梭,不再被“交易卡住”或“余额消失”吓到,祝各位开发顺利,早日实现财富自由!