把故事压成可复核的因果
读者读完后,应能沿着哈希和源码自己走一遍。走不通的句子,就还不能发表。

初始资金→准备与授权→触发漏洞→破坏不变量→提取与变现
用一个公开案例练习“抽取方法”
下面这段从重入和 The DAO 讲起。本课要你练的不是背 DAO,而是看完后能独立写出:根因、放大器、触发条件、后果。
证据有等级,观点没有特权
- 链上事实
交易、trace、事件、余额和存储槽。
- 当前代码
已验证源码与当时的实现地址,不是仓库默认分支。
- 官方复盘
postmortem 和修复 commit。
- 审计与竞赛
只能说明当时范围内有人看过。
- 社交解释
线索,不是证据。
开源核验
仓库 commit、已验证源码、当前实现、审计后是否升级、前端是否指向官方地址,要分开勾。混为一谈会写出错误的“已审计”结论。
先建时间线,再给角色起名
按交易排,不按新闻排
- 初始资金从哪来
- 准备交易和授权
- 核心攻击交易
- 兑换、跨链、转移
- 暂停、升级、追回
每个地址只承担一种功能
- 攻击者 EOA 与攻击合约
- 受害协议的代理与实现
- token、oracle、pool、bridge
- 管理员、多签、应急角色
不要只看 token transfer。每个关键调用前后记录:余额、供应、份额、抵押、债务、价格、权限、实现地址、暂停位和内部记账。
根因不是“有人用了闪电贷”
根因允许不安全状态或价值提取的设计/代码错误。
放大器闪电贷、厚流动性、可组合性。
触发特定价格、时间、空池、管理员动作。
后果资产损失、坏账、冻结或治理接管。
修复必须恢复不变量
- 测试为何遗漏这条路径。
- 审计范围是否覆盖被打的部署版本。
- 暂停是否可用,管理员是否及时。
- 修复是堵住单一入口,还是让系统承诺重新成立。
安全边界
复现只用本地最小模型或固定历史区块 fork。不向真实协议发送攻击交易,不移动非自有资产。公开文章可隐藏尚未修复问题的可武器化细节。
完成证据
选一笔已公开、已修复的历史交易,写出时间线、四类事实拆分、被破坏的不变量,以及修复 commit 是否覆盖根因。所有句子后面跟哈希或文件名。
课末自测
为什么攻击交易里出现闪电贷,仍不能直接写成根因?
信心