交易是以太坊网络的血液。每一次账户余额的变动、每一次智能合约的调用,都是由“交易”这一带密码学签名的指令驱动的。本文用通俗语言拆解从构造交易、支付燃料费到交易最终确认的全过程,并附上实战示例与常见疑问解答,助你熟练掌握以太坊交易的核心机制。
什么是以太坊交易?
简单来说,交易就是由外部持有账户(EOA)发出的、改变以太坊全局状态的一条签名消息。当 Bob 使用钱包给 Alice 转 1 枚 ETH,实际发生的事包括:
- Bob 的账户nonce 自动 +1,防止重放攻击;
- Bob 的余额减去1 ETH + 燃料费;
- Alice 的余额增加 1 ETH;
- 交易被打包进区块,最终在链上不可更改。
由此可见,“更新状态”与“支付燃料”是每条交易的共同特征。
交易结构速览
| 字段 | 解释 | 示例值 |
|---|---|---|
from | 发送方地址,发起交易的外部账户 | 0xEA6...ec8 |
to | 接收方地址,普通转账时是另一个账户,合约交互时为合约地址 | 0xac0...e5a |
value | 转账金额,以 wei 为单位 | 10000000000 ≈ 0.01 ETH |
nonce | 发送方已累计发起的交易次数,必须严格递增 | 0、 1、 2 … |
gasLimit | 该交易所消耗燃料的上限 | 21000(普通转账最低值) |
maxFeePerGas | 愿意为每单位燃料支付的最高总价 | 150 gwei |
maxPriorityFeePerGas | 小费,直接激励验证者将交易纳入区块 | 2 gwei |
data | 附加数据;合约交互时存储函数选择器与参数 | 0xa9059cbb... |
signature | 使用私钥对整个交易结构的哈希进行签名,确保不可伪造 | r、s、v 编码在交易尾部 |
交易对象必须先经过 RLP 编码,再进行椭圆曲线签名,才能广播到网络。
三种常见交易类型
- Type 0:传统交易
2015 年沿用至今的原始格式,无动态费率和访问列表功能,以0xf8开头。 - Type 1:访问列表交易
在柏林升级后引入,通过accessList提前声明将访问的合约 slot,帮助节省燃料,以0x01开头。 - Type 2:EIP-1559 交易
伦敦升级后的默认方案,把费用拆成“基础费 + 小费”,基础费直接燃烧,降低 gas 波动,以0x02开头。
燃料费计算范例
假设 Bob 要给 Alice 转 1 ETH,当前网络参数为:
baseFeePerGas = 190 gweimaxPriorityFeePerGas = 10 gweigasLimit = 21000
总费用 = (190 + 10) × 21000 = 4 200 000 gwei ≈ 0.0042 ETH
因此 Bob 实际支出 = 1 + 0.0042 = 1.0042 ETH。
其中 0.00399 ETH 被燃烧,仅 0.00021 ETH 给验证者作小费。
任何未用完的 gas 会立即退还到用户账户。
👉 想实时估算转账成本?不妨用链上行情工具先查 gas 价。
智能合约交互的 data 字段
当你调用代币合约 transfer 函数时,data 的前 4 字节是函数选择器,余下为 ABI 编码的参数。例如:
- 函数:
transfer(address,uint256) - 选择器:
0xa9059cbb - 参数:
to地址 + 转账金额
借助 4byte directory 可快速识别未知 selector 对应的函数名。
交易生命周期全解
- 签名并生成哈希
钱包本地用私钥签名,产生0x97d99bc772921111...并附带到交易。 - 广播到网络
节点首先把交易放进公共内存池(mempool)。 - 验证者打包
验证者按费用高低挑选交易,封进新区块。 - 区块确认
区块状态由“合理”升级为“最终确定”,至此交易不可逆,风险可忽略。
实操 JSON-RPC 示例
// eth_signTransaction 请求
{
"id": 2,
"jsonrpc": "2.0",
"method": "eth_signTransaction",
"params": [{
"from": "0x1923f626...",
"to": "0x07a565b7...",
"value": "0x1234",
"gas": "0x55555",
"maxFeePerGas": "0x1234",
"maxPriorityFeePerGas": "0x1234",
"nonce": "0x0",
"data": "0xabcd"
}]
}返回结果包含 raw(RLP 编码)与 tx(JSON 形式),前者直接广播即可完成链上确认。
常见问题解答(FAQ)
1. 为什么有时候 gasLimit 设置为 21000 还被退回部分 gas?
答:21000 只是普通 ETH 转账的理论下限。若执行中检测失败或提前 revert,EVM 会把多余未消费的 gas 退还;但已执行步骤所消耗的 gas 不会退回。
2. Type 2 交易的手续费到底该怎么设置?
答:推荐先把 maxFeePerGas 设成当前网络平均 gas 价,maxPriorityFeePerGas 填写 1–2 gwei。钱包测出的“预计费用”已是安全上限,打成区块后只扣实际消耗。
3. 可以用合约账户直接发起交易吗?
答:不行。只有 EOA 能主动签名并广播交易。合约逻辑想“转账”只能借助 SELFDESTRUCT 或内部 CALL 指令在已有交易中完成。
4. nonce 断档或重复会发生什么?
答:nonce 断档会导致交易在 mempool 中等待前一个 nonce 补上;重复 nonce 则依赖 gas 价格竞争,低新交易会被视为“替换”而废弃原交易。
5. EIP-1559 之后还会出现手续费大幅飙升吗?
答:极端拥堵时基础费会指数级上涨,但动态机制让你可以预估 2–3 个区块内的费用,比起旧版 blind auction 更透明、更少出现天价 gas。
6. 交易一直 pending,如何加速?
答:通过替换交易(Replace-by-Fee)提升 maxFeePerGas 与 maxPriorityFeePerGas,保持 nonce 不变即可重新广播,矿工优先选择费用更高者。
延伸阅读
交易是进入以太坊世界的第一步,也是最考验用户理解的环节。掌握地址、nonce、gas 三大核心,即可自信地在链上与任何人或合约完成价值交换。