Execution Trace(执行追踪)
按调用层级阅读交易,理解每一步如何推动资产和状态变化。
Execution Trace 用来回答:一笔交易是怎样一步步执行的?
它把合约调用组织成树:父节点表示发起调用的上下文,子节点表示该调用执行期间发生的下一步操作。
先看一个例子
跟着这笔交易读 Trace
1. 从最外层开始
先看 Transaction,再展开 CREATE。它表示交易先创建了一个中间合约,后续调用都从这条执行路径展开。
2. 找到资产进入的位置
展开 UniswapV3Pool.flash(...),可以看到 XPEPE.transfer(...)。这说明 XPEPE 从 Pool 转入中间合约,是后续操作的资产来源。
3. 查看中间合约做了什么
同一分支下的 TokenStaker.stake(...) / withdrawAll() 表示中间合约与 TokenStaker 发生多次质押和提取。继续向下看 SwapRouter02 / Pool.swap(...),可以把这些操作和 WETH 的获得关联起来。
4. 找到资产最终转出的调用
展开 WETH.withdraw(...),可看到 WETH 被 unwrap 为 ETH;最后的 ETH transfer 则把 ETH 发给交易发起方和费用接收方。
怎么读 Trace
- 从最外层节点开始,逐层展开与问题相关的分支。
- 每一行先看操作类型,例如
CALL、CREATE或STATICCALL,再看调用目标与函数名。 - 使用顶部工具栏筛选调用类型、展开层级或搜索函数、地址和参数。
- 点击节点左侧的详情图标,查看参数、返回值、Gas 和错误信息。
- 不确定某次调用为什么发生时,回到它的父节点查看调用上下文。
注意
- 缩进表示调用层级,不表示时间间隔;同一层节点按执行顺序排列。
- 内部调用失败不一定导致整笔交易失败,父调用可能捕获错误并继续执行。
- 函数名和参数依赖 ABI、源码或签名解码;无法解码时,地址和原始数据仍然可以作为分析依据。
