五、链上交易全过程:签名、Gas 与区块确认
五、链上交易全过程:签名、Gas 与区块确认
钱包里的“确认”按钮看似简单,背后却涉及签名、节点传播、交易排序、合约执行和全网状态更新。理解这个过程,能帮助我们判断 Pending、失败扣费、Nonce 冲突和授权交易等常见问题。

1. 交易究竟是什么
交易是账户发给区块链的一条带签名指令。它可以是转账,也可以是调用合约、授权代币或部署程序。
以太坊交易通常包含:
| 字段 | 作用 |
|---|---|
to | 接收地址或合约地址 |
value | 转移的 ETH 数量 |
data | 合约调用的方法与参数 |
nonce | 该账户交易的顺序编号 |
gasLimit | 最多允许消耗的计算量 |
| 费用参数 | 愿意支付的基础费上限和优先费 |
signature | 证明账户所有者批准了指令 |
Ethereum.org 将交易定义为账户发出的密码学签名指令。参考:Ethereum 交易文档
2. 从点击按钮到区块确认
第一步:应用构造请求
DApp 告诉钱包要调用哪个合约、执行哪个方法、传入什么参数。应用只能提出请求,不能代替用户签名。
第二步:钱包展示并签名
钱包把请求转换为待确认内容。用户确认后,私钥在本地对交易摘要签名。正常情况下,私钥不会被发送给网站或节点。
第三步:节点广播
钱包通常通过 RPC 服务把已签名交易发送给某个节点。节点检查格式、签名、Nonce 和余额等基本条件,再把交易传播给其他节点。
第四步:进入交易池
尚未写入区块的有效交易会在节点的交易池中等待。不同节点看到的交易集合和顺序可能略有差异,交易池也不是区块链永久记录的一部分。
第五步:验证者打包和执行
验证者从交易池选择交易,按照协议规则执行。交易进入区块后,其他节点会重新执行并验证结果,而不是盲目信任出块者。
第六步:确认与最终确定
一次确认表示交易所在区块已经被链接受。随着后续区块和共识投票增加,交易被重组的可能性继续降低,最终达到协议意义上的最终确定。
3. Gas 是计算量,不是汽油价格
Gas 衡量执行操作需要的计算资源。最终费用可以简化为:
交易费用 = 实际使用的 Gas × 每单位 Gas 的价格- 简单转账需要的操作较少。
- 调用复杂合约、交换代币或铸造 NFT 通常消耗更多 Gas。
- 网络拥堵时,用户竞争有限区块空间,每单位 Gas 的费用可能提高。
Gas Limit 是允许交易最多消耗多少 Gas,不代表一定全部花完。正常未使用的部分不会被收取。
Ethereum.org 说明,Gas 用来衡量计算工作并防止垃圾请求和无限循环。参考:Ethereum Gas 与费用
4. 为什么失败仍然扣手续费
如果合约执行中触发条件失败或 Gas 耗尽,状态修改会回滚,但验证者已经执行了计算,因此使用过的 Gas 仍需支付。
案例:用户在 DEX 设置最多接受 1% 滑点。交易执行时价格变化超过限制,合约按规则回滚交换。代币没有换成,但链上已经验证和执行过这次尝试,所以仍产生手续费。
这与交易在广播前就被节点拒绝不同。格式错误、余额明显不足等请求如果没有进入区块,通常不会产生链上执行费。
5. Nonce 为什么重要
Nonce 是账户已发出交易的顺序编号,用来防止交易被重复执行,并确保同一账户的操作按顺序处理。
假设账户下一笔 Nonce 为 18:
- Nonce 18 未确认时,19 往往需要等待。
- 使用同一个 Nonce 发送更高费用的交易,可以尝试替换原交易。
- 钱包显示多笔交易一起 Pending,可能是前面某个 Nonce 卡住。
钱包中的“加速”通常是用相同 Nonce、相同意图和更高费用重新广播;“取消”通常是用相同 Nonce 给自己发送一笔更高费用的零值交易。它们都是竞争替换,并不保证成功。
6. 转账、授权和交换为何不一样
原生资产转账
直接把 ETH 等原生资产发送给地址,价值写在交易的 value 字段中。
ERC-20 转账
代币余额由合约保存。转账实际上是调用代币合约的 transfer 方法,而不是像 ETH 一样直接修改原生余额。
授权后交换
DEX 通常需要两步:
- 调用代币合约的
approve,允许路由合约在额度内使用代币。 - 调用 DEX 合约执行交换。
因此首次使用某种代币时常出现两次确认、两笔交易和两次 Gas。ERC-20 标准定义了余额、转账、授权和额度等通用接口。参考:Ethereum ERC-20 标准介绍
7. 区块浏览器应该看什么
拿到交易哈希后,可以在对应网络的区块浏览器核对:
- 状态是 Pending、成功还是失败。
- From 和 To 是否符合预期。
- 交易发生在哪条网络。
- 转移的原生资产和代币数量。
- 调用了哪个合约方法。
- 实际 Gas 使用量与费用。
- 交易所在区块和确认数。
- 事件日志中记录了哪些资产变化。
浏览器只是读取并组织链上数据,不是交易的批准者。页面标签也可能由平台维护,不能代替合约地址核验。
8. 常见异常如何判断
| 现象 | 可能原因 | 处理思路 |
|---|---|---|
| 长时间 Pending | 费用偏低、Nonce 阻塞、节点传播问题 | 查浏览器和账户 Nonce,谨慎加速 |
| 交易失败 | 滑点、合约条件、余额或 Gas Limit | 查看失败原因,不盲目重复 |
| 钱包已扣款但对方没显示 | 网络或代币版本错误、平台入账延迟 | 核对链、地址、合约和交易哈希 |
| 钱包看不到代币 | 未添加代币、RPC 或前端显示问题 | 用浏览器确认余额,再核对代币合约 |
| 手续费突然很高 | 网络拥堵或合约操作复杂 | 等待低峰、检查网络与操作 |
9. 一次安全交易的检查清单
在签名前依次确认:
- 当前网络是否正确。
- 网站域名和合约地址是否可信。
- 操作是连接、登录签名、授权还是转账。
- 接收地址、代币和金额是否正确。
- 授权对象和额度是否合理。
- Gas 是否异常,钱包模拟是否显示意外资产流出。
- 大额或首次转账是否先做小额测试。
本文小结
- 链上交易是账户发出的带签名指令,不只是转账。
- 私钥负责签名,正常情况下不会离开钱包。
- RPC 节点负责接收和传播,验证者负责执行并打包,其他节点会重新验证。
- Gas 衡量计算量;执行失败时,已经消耗的计算资源仍可能收费。
- Nonce 决定同一账户交易顺序,也是加速与替换交易的基础。
- 代币授权和交换是不同合约调用,首次操作常需要两笔交易。
- 交易哈希是排查问题最重要的入口。