ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

WTF Solidity 链上交易调试入门:从 Etherscan 字段解读到 Foundry 实战热身

2026/9/15 19:05:47 拓冰建站 浏览量
WTF Solidity 链上交易调试入门:从 Etherscan 字段解读到 Foundry 实战热身 WTF Solidity 链上交易调试入门从 Etherscan 字段解读到 Foundry 实战热身【免费下载链接】WTF-SolidityWTF Solidity 极简入门教程供小白们使用。Now supports English! 官网: https://wtf.academy项目地址: https://gitcode.com/GitHub_Trending/wt/WTF-Solidity本篇为 WTF Solidity 链上分析系列的第二课热身篇面向希望掌握链上交易分析能力的开发者与安全研究者。文章以链上交易调试为主题先讲解在区块浏览器 Etherscan 上应该关注哪些关键字段再通过资产转移、Uniswap Swap、Curve 3pool 添加流动性、Compound 治理提案、Uniswap 闪电兑换Flashswap五类典型交易逐一演示如何用交易可视化工具 Phalcon 还原函数调用流程最后给出链上分析必备的 Foundry Cheatcodes 速查并结合仓库内 57_Flashloan 与 TOOL07_Foundry 的源码与测试用例帮助你掌握看懂一笔链上交易 用 Foundry 复现链上行为的完整能力。一、热身准备环境与工具链上交易形态多样包括单笔资产转移、单个/多个 DeFi 合约交互、闪电贷套利、治理提案、跨链交易等。开始分析前需要先搭建本地环境并明确工具链安装 Foundry链上分析的核心测试工具是forge test。安装方式与入门可参考仓库内的 Foundry 工具教程其包含安装命令foundryup、项目初始化forge init、forge build/forge test等基础流程以及 Cast 与 Anvil 的进阶用法。选用区块浏览器每条链都有自己的区块浏览器本课以以太坊主网与 Etherscan 为例。交易可视化工具用 Phalcon。仓库根目录配置本仓库根目录的 foundry.toml 统一配置了src、test、libs、solc 0.8.34以及 forge-std / OpenZeppelin 的 remappings是运行forge test的基础。做链上复现时通常还需要在foundry.toml中配置各链的 RPC 地址供createSelectFork使用。二、Etherscan 上值得关注的五个字段分析一笔交易时通常会先看以下字段字段含义Transaction Action交易的关键行为摘要如 Swap、Add Liquidity。复杂 ERC-20 转账不易直接读懂时该字段可快速定位交易意图但并非所有交易都有此字段From发起交易的源钱包地址即msg.senderInteracted With (To)交易交互的合约地址ERC-20 Tokens Transferred代币的转账明细与流向Input Data交易的原始 calldata可看出调用了哪个函数、传入了哪些参数其中Input Data是分析的重点calldata 的前 4 字节是函数选择器Function Selector可通过 Ethereum Signature Database 等工具反查函数签名其余部分为 ABI 编码后的参数。在 TOOL07_Foundry 教程 中还给出了用 Cast 直接解码 calldata 的命令例如cast 4byte 0x38ed1739可解析出swapExactTokensForTokens(uint256,uint256,address[],address,uint256)cast pretty-calldata可逐参数解码作为 Etherscan 之外的有力补充。三、实战一资产转移以 USDT 为例以一笔 USDT 转账交易为例Etherscan 页面解读如下From发起该交易的 EOA 钱包地址Interacted With (To)Tether USD (USDT) 合约ERC-20 Tokens Transferred651.13 USDT 从用户 A 钱包转至用户 B 钱包Input Data调用了transfer函数。在 Phalcon 的 Invocation Flow 中可以看到整个调用流程只有一次Call USDT.transfer。这里需要特别注意Value数值EVM 不支持浮点数运算因此所有代币金额都用最小单位整数表示即实际金额 × 10^decimals每个代币都有自己的精度decimalsERC-20 默认 18 位但USDT 是 6 位。因此 651.13 USDT 在链上实际传入的数值是651130000如果精度处理不当例如误用 18 位精度解析 6 位精度代币会导致金额放大/缩小 10^12 倍产生严重问题精度值可通过 Etherscan 上的代币合约信息查询。这也解释了为什么链上分析时不能只盯表面数字必须结合代币合约的decimals()做换算。四、实战二Uniswap Swap以一笔 Uniswap V2 上的兑换交易为例Transaction Action用户在 Uniswap 上进行 Swap用 12,716 USDT 换得 7,118 UNDEADFrom发起交易的源钱包地址Interacted With (To)本例中是一个 MEV Bot 合约由它去调用 Uniswap 合约ERC-20 Tokens Transferred代币交换的流转过程。在 Phalcon 的调用流程中可以看到MEV Bot 调用了 Uniswap V2 的 USDT/UNDEAD 交易对合约Pair并调用其swap函数完成兑换。这条交易揭示了一个典型模式用户 EOA → 中间合约如 MEV Bot→ DEX Pair 合约中间合约往往承担了组装交易、路由兑换的职责。Foundry 模拟 Swap可用 Foundry 在本地 fork 主网模拟用 1 BTC 兑换 DAI的操作参考 DeFiLabs 示例Uniswapv2.sol执行命令forge test --contracts ./src/test/Uniswapv2.sol -vvvv该测试通过调用 Uniswap V2 Router 的swapExactTokensForTokens函数将 1 BTC 兑换为约 16,788 DAI。-vvvv会打印完整的调用 trace便于逐层核对 Router → Pair 的调用顺序与参数。五、实战三Curve 3pool 添加流动性以 Curve 3poolDAI/USDC/USDT的加池交易为例交易目的在 Curve 3pool 中添加流动性From发起交易的源钱包地址Interacted With (To)Curve.fi 的 DAI/USDC/USDT Pool 合约ERC-20 Tokens Transferred用户 A 向 Curve 3pool 存入 3,524,968.44 USDTCurve 铸造并返还 3,447,897.54 个 3Crv 流动性代币。Phalcon 的调用流程显示该交易依次执行了三个步骤add_liquidity—— 用户向池子存入资产transferFrom—— 池子从用户账户划转 USDT前提是用户先完成了approvemint—— 池子铸造 3Crv LP 代币给用户。这个存入资产 → 划转 → 铸造 LP的调用顺序是所有 AMM 加池交易的通用范式也是识别加流动性类交易的特征模式。六、实战四Compound 治理提案以一笔 Compound 治理提案交易为例用户向 Compound 治理合约提交了一份提案proposal。在 Etherscan 上点击Decode Input Data可以解码查看提案的具体内容目标合约、calldata、描述等。在 Phalcon 的调用流程中可以看到该交易通过调用propose函数提交提案并获得了提案编号 44。治理提案交易的特点在于交易本身通常只有一个主要外部调用propose提案内容编码在 calldata 中需要解码才能看到真实意图后续治理动作投票、执行会在其他交易中陆续发生。这提醒我们在分析治理类交易时解码 Input Data与追踪提案编号是两条关键线索。七、实战五Uniswap Flashswap闪电兑换用 Foundry 模拟 Flashswap本课使用 Foundry 模拟在 Uniswap 上借出 100 WETH 并在同一交易内归还参考 DeFiLabs 示例Uniswapv2_flashswap.sol执行命令forge test --contracts ./src/test/Uniswapv2_flashswap.sol -vv在该示例中合约通过 Uniswap 的swap函数发起闪电兑换借出 100 WETH随后 Pair 合约回调借款合约的uniswapV2Call函数由借款合约完成还款。归还时需要额外支付0.3% 手续费。从调用流程中可以清晰看到swap发起借款 →uniswapV2Call完成还款的回调链。Flashloan 与 Flashswap 的区别维度Flashloan闪电贷Flashswap闪电兑换共同点无需抵押即可借出代币必须在同一笔交易内归还否则整笔交易回滚失败同左归还规则借出 token0 必须归还 token0借出 token0 可以归还 token0 或 token1更灵活仓库源码印证Uniswap V2 闪电贷的实现本仓库 57_Flashloan 完整讲解了 Uniswap V2 / V3 与 AAVE V3 的闪电贷合约实现其核心机制与上述 Flashswap 完全一致。以 57_Flashloan/src/UniswapV2Flashloan.sol 为例闪电贷入口flashloan(uint wethAmount)将(WETH, wethAmount)编码进data然后调用 DAI/WETH Pair 合约的swap(0, wethAmount, address(this), data)其中amount1Out wethAmount即为借出数量回调函数uniswapV2CallPair 合约在乐观转账后回调该函数。合约先通过assert(msg.sender factory.getPair(token0, token1))校验调用者必须是官方 Pair 合约防止伪造调用者盗取资金然后按公式fee (amount1 * 3) / 997 1计算 0.3% 手续费向上取整最后weth.transfer(address(pair), amountToRepay)归还本金与费用从源码结构看Flashswap 本质就是 Pair 的swap函数在data.length 0时触发回调IUniswapV2Callee(to).uniswapV2Call(...)并在最后通过k x * y恒等式校验资金是否归还。配套测试 57_Flashloan/test/UniswapV2Flashloan.t.sol 验证了两种场景手续费充足时flashloan成功手续费不足时借助vm.expectRevert()断言交易回滚。这正是闪电贷/闪电兑换依赖交易原子性的代码级证明——还不上就整笔回滚。八、Foundry Cheatcodes链上分析的核心工具Cheatcodes作弊码是 Foundry 在测试合约中提供的vm接口用于操纵 EVM 环境状态是复现链上行为的关键。常用函数如下Cheatcode作用示例createSelectFork指定要 fork 的网络与区块高度进行测试需在 foundry.toml 中配置各链 RPCvm.createFork(rpc); vm.selectFork(mainnet);deal设置测试钱包余额设置 ETH 余额deal(address(this), 3 ether);设置代币余额deal(address(USDC), address(this), 1 * 1e18);prank模拟指定钱包身份仅对下一次调用生效令msg.sender变为指定地址例如模拟鲸鱼钱包转账vm.prank(whale);startPrank模拟指定钱包身份在stopPrank()之前的所有调用msg.sender均为指定地址vm.startPrank(alice); ... vm.stopPrank();label给钱包地址打标签提升调试时的可读性vm.label(whale, Whale);roll调整区块高度vm.roll(17000000);warp调整block.timestampvm.warp(1000);仓库内 Cheatcode 的落地用例在 TOOL07_Foundry 教程 的测试示例hello_wtf/test/Test.t.sol中可以看到这些 cheatcode 的完整组合用法deal(address(dai), alice, 1 ether)直接为测试账户灌注 DAI 余额链上分析中常用来模拟攻击者或受害者的持仓vm.prank(address(1))后调用h.whoCalled()验证msg.sender已被替换通过vm.envString(ETH_RPC_URL)读取 RPC 环境变量再vm.createFork(rpc)vm.selectFork(mainnet)在测试代码内部切换主网 fork。在 57_Flashloan 的闪电贷测试中同样大量使用了这些能力测试合约继承forge-std/Test.sol借助--fork-url在主网 fork 上直接操作真实的 WETH 合约weth.deposit/weth.transfer并用vm.expectRevert()断言手续费不足时的回滚。这套fork 主网 deal 注入资金 prank 模拟身份 expectRevert 断言失败路径的组合就是后续编写攻击 POC 复现的通用骨架。九、小结本课完成了链上交易调试的热身掌握了 Etherscan 五个关键字段的解读方法通过资产转移、Uniswap Swap、Curve 加池、Compound 提案、Uniswap Flashswap 五类交易建立了字段速览 → 函数调用流还原 → 参数与精度核对的分析流程并学会了用 Foundryforge test在本地 fork 复现 Swap 与 Flashswap最后掌握了链上分析必备的 CheatcodescreateSelectFork、deal、prank、startPrank、label、roll、warp。在后续课程中将基于这些能力进一步编写自己的攻击 POC分析真实漏洞与攻击流程。十、延伸资源Foundry 官方文档安装、forge test、Cheatcodes 参考WTF Solidity - Foundry 工具教程覆盖 Foundry 全量用法含 Cast 交易解析、Anvil 本地节点与 Cheatcode 实战WTF Solidity 第 57 讲闪电贷Uniswap V2 / V3 / AAVE V3 闪电贷合约源码与 Foundry 测试本系列第一课 01_tools交易调试工具Phalcon / Ethtx / Tenderly、签名数据库、反编译工具对比Foundry 根目录配置仓库统一构建配置与 remappings【免费下载链接】WTF-SolidityWTF Solidity 极简入门教程供小白们使用。Now supports English! 官网: https://wtf.academy项目地址: https://gitcode.com/GitHub_Trending/wt/WTF-Solidity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考