第三章:读懂一笔交易:从输入到输出
今天我们来拆解一笔以太坊转账交易的完整生命周期。说实话,很多新手看到交易哈希就头大,觉得那是一串天书。其实没那么复杂,我带你一步步看明白。
3.1 交易的起点:用户发起
一切从你点击「发送」按钮开始。你输入接收地址、金额,然后签名。这个签名动作,说白了就是用你的私钥给这笔交易「盖个章」。没有这个章,矿工不会认账。
我记得刚入行时,有个朋友问我:「我复制了别人的签名能花他的钱吗?」当然不行。因为签名里包含了你的地址和nonce值,每个交易都是独一无二的。
核心要点:一笔交易的核心字段包括:
- from:发送方地址
- to:接收方地址(合约地址或普通地址)
- value:转账金额(单位是wei,1 ETH = 10^18 wei)
- gasLimit:你愿意为这笔交易消耗的最大gas量
- maxPriorityFeePerGas:给矿工的小费(EIP-1559后引入)
- nonce:你的账户交易序号,从0开始递增
3.2 交易进入内存池:等待被选中
签名后的交易会广播到全网。所有节点收到后,先做基础校验:签名对不对?nonce对不对?余额够不够?
校验通过,交易就进入「内存池」(mempool)。你可以把内存池想象成一个候车大厅,所有待处理的交易都在这里排队。矿工会优先选择小费给得高的交易。
我在项目中遇到过一个问题:有次我发了一笔交易,gas给低了,结果等了半小时还没确认。后来我学乖了,用eth_gasPrice接口先查一下当前推荐价格。
实用技巧:你可以用Etherscan的「Pending Transactions」页面实时查看内存池状态。如果看到某笔交易卡了很久,大概率是gas给少了。
3.3 矿工打包:交易上链
矿工从内存池里挑出一批交易,按nonce排序,打包成一个区块。这里有个关键点:nonce必须连续。比如你账户的nonce是5,那么下一笔交易nonce必须是6。如果你跳过了nonce 6直接发nonce 7,那nonce 7的交易会一直卡着,直到nonce 6的交易被确认。
嗯,这个坑我踩过。有一次我同时发了两笔交易,nonce写错了顺序,结果第二笔先被确认,第一笔反而卡住了。后来我手动取消了第一笔才解决。
注意:如果你用同一个nonce发了两笔不同的交易,只有一笔会成功。这叫「nonce冲突」,在DeFi抢跑时经常发生。
3.4 交易确认:从待处理到完成
区块被挖出后,你的交易状态变成「已确认」。但注意,确认数越多越安全。一般建议等12个区块确认(约3分钟),尤其是大额转账。
为什么?因为有可能出现「叔块」或「重组」。说白了,就是另一条链上的区块比当前链更长,导致你的交易被回滚。虽然以太坊的最终性很强,但小心驶得万年船。
3.5 核心流程图:一笔交易的完整生命周期
下面我用SVG画了一张流程图,把整个过程串起来。你一看就明白。
3.6 实战:用代码解析一笔交易
光说不练假把式。我们拿一个真实的交易哈希来拆解。假设交易哈希是0xabc...123,用web3.js读取:
// 用web3.js获取交易详情
const Web3 = require('web3');
const web3 = new Web3('https://mainnet.infura.io/v3/YOUR_PROJECT_ID');
const txHash = '0xabc...123';
web3.eth.getTransaction(txHash).then(tx => {
console.log('发送方:', tx.from);
console.log('接收方:', tx.to);
console.log('金额:', web3.utils.fromWei(tx.value, 'ether'), 'ETH');
console.log('Gas价格:', tx.gasPrice);
console.log('Nonce:', tx.nonce);
console.log('交易状态:', tx.blockNumber ? '已确认' : '待处理');
});
输出结果大概长这样:
| 字段 | 值 | 说明 |
|---|---|---|
| from | 0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B | 发送方地址 |
| to | 0x742d35Cc6634C0532925a3b844Bc9e7595f2bD18 | 接收方地址 |
| value | 0.1 ETH | 转账金额 |
| gasPrice | 50 Gwei | Gas单价 |
| nonce | 42 | 该账户第43笔交易 |
| blockNumber | 12345678 | 所在区块高度 |
3.7 避坑指南:交易失败怎么办?
交易失败很常见,别慌。先查revert原因。用eth_call模拟一下,或者直接看Etherscan的「Error」列。常见原因有:
- Gas不够:比如合约交互需要更多gas,你只给了21000
- 滑点太高:DEX交易时价格变动超出预期
- Nonce错误:前面有交易卡着,导致后面的交易无法执行
我曾经有一次做闪电贷套利,gas给少了,结果交易被回滚,白白损失了手续费。后来我写了个脚本,自动根据内存池拥堵情况调整gas。
我的习惯:每次发交易前,先用eth_estimateGas预估gas,再乘以1.2作为安全余量。这样既不会浪费,也不会失败。
3.8 总结
一笔交易从你点击发送到最终确认,经历了签名、广播、内存池排队、矿工打包、区块确认等多个环节。每个环节都有坑,但只要你理解了nonce、gas、确认数这几个核心概念,就能轻松驾驭。
记住:链上数据不会骗人,但你需要知道怎么看。下一章我们聊聊如何通过交易数据发现市场信号。