State Changes(状态变化)
查看交易完成后真正写入链上的 Storage 与账户状态。
State Changes 用来回答:这笔交易最终修改了链上的什么状态?
它对比交易执行前后的 Storage、Nonce 与余额相关状态。与 Execution Trace 不同,这里只保留最终写入结果,因此适合验证交易是否真的改变了合约状态。
先看一个例子
跟着这笔交易读状态变化
1. 先看 UniswapV3Pool 的 slot0.tick
展开 UniswapV3Pool,可以看到 slot0.tick 从 -247248 变为 -275057。tick 是池子当前价格所在的离散位置;这个变化说明交易中的 Swap 确实改变了 Pool 的价格状态,而不只是发生了一笔转账。
同一组里的 feeGrowthGlobal0X128 和 observations[0].blockTimestamp 也发生了变化:前者记录费用累积,后者更新预言机观测值。这些是一次 Uniswap V3 交换常见的伴随状态写入。
2. 再看 X Pepe 的余额与授权
在 X Pepe 分组中,_balances[UniswapV3Pool]、_balances[TokenStaker] 与 _allowances[...] 都改变了。它们分别说明 Pool 与 Staker 的代币余额发生变动,以及中间合约为后续操作写入了授权。
这与 Token Flow 中看到的 X Pepe 转账、质押和提取相互印证:资产移动在 Token Flow 中可见,余额和授权的最终落点则在这里确认。
怎么读 State Changes
- 先按合约地址分组,优先查看你关心的业务合约。
- 再看变量名与 Slot;有源码和 Storage Layout 时会显示变量名,缺少解码信息时仍可通过原始 Slot 判断变化。
- 比较 Before 与 After,确认写入后的最终值;变化后的值会在解码视图和 Slot 表格中同时呈现。
- 需要知道是哪次调用写入该 Slot 时,回到 Execution Trace 或 Debugger 查看调用上下文。
注意
- State Changes 展示的是交易开始和结束之间的差异。中间写入后又被覆盖的值,可能不会出现在这里。
mapping和动态数组的 Slot 通常是哈希派生值;变量名和键的解码依赖 ABI、源码与编译信息。- Storage 变化不一定都代表用户资产变化,例如价格、预言机观测值和授权额度也会写入 Storage。
