nbundi/defi-exploit-loss-analysis

GitHub: nbundi/defi-exploit-loss-analysis

一个用于实证分析DeFi协议因漏洞导致损失的Python工具。

Stars: 0 | Forks: 0

# DeFi 犯罪拖累 — 复制与扩展 本文始于对亚历克斯·麦克法兰(@flipdazed)发表的 **“DeFi 借贷在 EVM 和 Solana 上有 3 个基点的犯罪拖累”** 一文的复制研究 — [x.com/flipdazed/status/2055814695664152834](https://x.com/flipdazed/status/2055814695664152834)。 原标题数字已被复制,误差在约 3% 以内;随后的分析已扩展到涵盖每个 DeFi 领域(不仅仅是借贷)和 DefiLlama 跟踪的每条链(不仅仅是 EVM + Solana)。 ## 范围与原文对比 原文仅限于 **EVM + Solana**,并在截至 2026 年 5 月 16 日的过去 365 天内得出 **3.1 个基点的总损失率 / 3.0 个基点的净损失率**。 本代码库最初匹配该范围,并复制了标题数字,误差在约 3% 以内。分析此后已扩展到涵盖 **DefiLlama 跟踪的所有链**(除 EVM ∪ Solana 集外,还包括 Bitcoin、Tron、Sui、Aptos、Near、Stellar、Hyperliquid、PulseChain 等)。因此,标题数字不再是对原文的直接复制 — 更广泛的范围在分子中加入了非 EVM/非 SOL 的借贷黑客攻击损失,在分母中加入了非 EVM/非 SOL 的借贷 TVL。 ### 过去 365 天,所有链,截至 2026 年 5 月 16 日 | | 原文 (EVM+SOL) | 本代码库 (所有链) | | ---------------- | --: | --: | | 总损失 | $30.9m | **$66.26m** | | 净损失 | $30.1m | **$46.99m** | | 平均借贷 TVL | ~$99.7B (隐含) | **$103.84B** | | 总损失率 | 3.1 bps | **6.38 bps** | | 净损失率 | 3.0 bps | **4.53 bps** | 造成差距的 5 起非 EVM/非 SOL 借贷黑客攻击: PulseChain 上的 BetterBank ($5m),Hyperliquid L1 上的 Hyperdrive HL ($0.77m),Stellar 上的 Blend Pools V2 ($11m),Near 上的 Rhea Lend ($18.4m),Sui 上的 Scallop Lend ($0.15m) — 总计 $35.3m 的额外总损失。 在 `main.py` 中将 `chain_universe()` 设回 `{EVM 链} ∪ {Solana}` 可以恢复原文的 3 个基点研究范围。 ## 图表 [figures/](figures/) 目录下有八张图表。滚动图表从 2021 年开始绘制 — 2021 年之前的借贷 TVL 规模太小,使得滚动 365 天分母计算失去意义。图表 1 是唯一的仅针对借贷领域的图表;其余所有图表涵盖所有 DeFi 领域: 1. `1_defi_lending_exploit_losses_rolling.png` — **仅针对借贷**(Lending+CDP+RWA-Lending)跨所有链的滚动 365 天总损失率。 2. `2_defi_sectors_exploit_losses_rolling.png` — 每个 DeFi 领域(Lending, DEX, Derivatives, Yield, Bridge, LiquidStaking, RWA, Algo-Stables)加上 DeFi 总体(黑色粗线)的对数坐标 y 轴滚动 365 天总损失率。 3. `3_defi_exploit_losses_distribution.png` — 跨所有 DeFi 协议黑客攻击事件的单次事件总损失规模(对数坐标 x 轴)的直方图。 4. `4_defi_exploit_bps_losses_distribution.png` — `hack_gross / target_protocol_TVL_on_hack_date`(以基点为单位)在整个时间窗口内的分布(单一直方图)。 5. `5_defi_exploit_losses_distribution_by_year.png` — 按年份划分的 DeFi 协议总损失规模(对数美元)小提琴图,单个事件叠加显示为点,年份中位数显示为红色条。 6. `6_defi_exploit_bps_losses_distribution_by_year.png` — 按年份划分的相同单次事件 `hack_gross / target_protocol_TVL`(以基点为单位,y 轴对数)的小提琴图。可以揭示*典型*黑客攻击损失占目标自身资本基础的比例是否随时间下降。 7. `7_defi_exploit_causes_by_year.png` — 按年份和 DefiLlama `classification`(分类)划分的总黑客攻击损失堆积条形图,涵盖所有 DeFi 领域,包括跨链桥。 8. `8_non_defi_exploit_losses_rolling.png` — **非 DeFi 协议**黑客攻击(CEX, Wallet, Gaming, ICO, Token, NFTfi, Chain)的滚动 365 天总美元损失 — 即从图表 1-7 中排除的领域。以美元而非基点绘制,因为这些目标类型在数据集中没有清晰的 TVL 时间序列。 完整数字输出位于 [output/headline_loss_ratios.csv](output/headline_loss_ratios.csv)、 [output/rolling_lending.csv](output/rolling_lending.csv), 以及按领域×日划分的 TVL 面板 [output/sector_tvl_panel.csv](output/sector_tvl_panel.csv)。 ## 按领域划分的过去 365 天损失率(所有链,截至 2026 年 5 月 16 日) 范围:仅限 `target_type=="DeFi Protocol"` — 排除 CEX(Bybit, FTX, WazirX 等)、Wallet、Gaming、ICO、Token、NFTfi、Chain 黑客攻击。跨链桥黑客攻击包括在内。 | 领域 | 总损失 ($m) | 净损失 ($m) | 平均 TVL ($B) | 总损失率 (bps) | 净损失率 (bps) | | -------------- | --: | --: | --: | --: | --: | | 借贷 | 66.26 | 46.99 | 103.84 | 6.38 | 4.53 | | DEX | 373.29 | 373.09 | 15.22 | 245.3 | 245.2 | | 跨链桥 | 331.74 | 331.36 | 50.10 | 66.2 | 66.1 | | 衍生品 | 338.75 | 298.45 | 3.87 | 876 | 772 | | 收益聚合 | 13.64 | 13.30 | 12.33 | 11.1 | 10.8 | | 流动性质押 | 0.00 | 0.00 | 67.10 | 0.0 | 0.0 | | 现实世界资产 | 0.04 | 0.04 | 16.54 | 0.0 | 0.0 | | 算法稳定币 | 0.00 | 0.00 | 0.10 | 0.0 | 0.0 | | **DeFi 总计** | **1318.55** | **1258.06** | **269.11** | **49.0** | **46.7** | ## 方法论 所有数据均来自 DeFiLlama 的公共 API: - `/hacks` — 黑客攻击台账,包含 `amount`(金额)、`returnedFunds`(已归还资金)、`chain`(链)、`bridgeHack`(跨链桥攻击)、`defillamaId`。 - `/protocols` — 协议快照,用于将黑客攻击的 `defillamaId` 映射到类别。 - `/v2/chains` — 链元数据。默认的 `chain_universe()` 返回 DefiLlama 跟踪的所有链(446 个条目)。要限制为文章的 EVM+SOL 范围,请将 `chain_universe()` 更改为返回 `{c["name"] for c in chains if c.get("chainId") is not None} | {"Solana"}`。 - `/protocol/{slug}` — 单个协议的历史 TVL,包含链级别的细分,用于构建按领域×链集合划分的每日 TVL 时间序列。 关键方法论细节: 1. **目标类型过滤。** 所有图表和标题表格仅限于 DefiLlama `targetType == "DeFi Protocol"` 的黑客攻击。这排除了整个历史中的 59 条记录,总额约 $2.6B — CEX(Bybit $1.4B, FTX $450m, WazirX, Bitmart 等)、Wallet(Atomic Wallet $100m)、Gaming(Munchables)、Token、NFTfi、ICO、DAO。只有 2 条跨链桥记录(Multichain $7.9m, Adshares $0.6m)被过滤掉;Ronin, Wormhole, Nomad, Harmony, BNB Bridge, Kelp 等均保留 `targetType="DeFi Protocol"` 并被保留。 2. **借贷 TVL = 闲置 TVL + 已借出。** DefiLlama 默认的“TVL”是净值(闲置存款),但文章的分母是*使用市场的资本量* — 即供应的存款。因此,对于借贷协议,我们包含 `-borrowed` 时间序列。不进行此修正,EVM+SOL 的损失率将约为 4.2 个基点,而非文章的 3.1 个基点。其他领域使用默认 TVL。 3. **"Borrowing and lending"** 是 DeFiLlama 类别 `{Lending, CDP, RWA Lending}` 的并集。 4. **跨链桥黑客攻击**根据明确的 `bridgeHack` 标志从非跨链桥领域行(Lending, DEX, Derivatives, Yield, LiquidStaking, RWA, Algo-Stables)中排除。它们保留在跨链桥行、DeFi 总计行以及所有涵盖所有领域的图表(3, 4, 5, 6, 7)中,这与文章将跨链桥视为“DeFi 一部分”的框架一致。因此,顶部领域表中的跨链桥行捕获了每个 `targetType="DeFi Protocol"` 的符合条件的跨链桥事件。 5. **符合条件**= 黑客攻击的 `chain` 列表与链集合(默认为 DefiLlama 跟踪的所有链)相交。 6. **黑客攻击 → 类别映射**:首先通过 `defillamaId`,然后通过与 `/protocols` 进行的名称规范化匹配,最后可选进行手动覆盖。少数黑客攻击记录即使协议存在于 DefiLlama 上,其 `defillamaId` 也为 null(例如 Silo Finance, CrediX)— 名称回退机制可以恢复这些情况。 7. **净损失** = `总损失 − min(已归还资金, 总损失)`,将任何汇率超额追回上限为 100%。 8. **每个领域的前 N 名**:对于 TVL 面板,我们获取每个领域中当前符合条件的 TVL 排名前 50 的协议的完整历史数据。对于借贷,这捕获了符合条件的链上该类别 TVL 的 >99%。 9. **滚动序列**:过去 365 天损失 / 平均 TVL,按月采样。图表从 2021 年开始绘制 — 更早的借贷 TVL 规模太小,使得滚动分母计算失去意义。 ## 仓库布局 ``` defi-crime-drag/ ├── main.py # single Jupyter-style pipeline ├── data/ │ ├── raw/ # cached /hacks, /protocols, /v2/chains │ └── protocols/ # cached /protocol/{slug} (one JSON per protocol) ├── output/ │ ├── hacks.csv # per-hack normalized table │ ├── sector_tvl_panel.csv # daily TVL by sector across all chains │ ├── headline_loss_ratios.csv # per-sector + DeFi-total trailing-365d table │ └── rolling_lending.csv # monthly rolling-365d lending loss ratio └── figures/ # 8 PNGs (see chart list above) ``` ## 运行 ``` python3 main.py # uses on-disk cache where possible python3 main.py --refresh # bypass cache and re-fetch from DeFiLlama ``` 使用所有链范围的冷启动运行会获取约 600 个协议的历史数据(每个领域的前 50 名加上对前 50 名之外的被黑协议的按需查询)。磁盘占用约为 ~2 GB。运行时间约为 ~20–40 分钟,具体取决于带宽和 DefiLlama 负载。后续运行几乎是即时的,因为所有内容都缓存在磁盘上;传入 `--refresh` 参数可强制完全重新获取。 ## 什么算作“黑客攻击”?(包含的原因) DeFiLlama `/hacks` 端点中的每条记录都包含在总损失/净损失中 — 没有按原因过滤。DefiLlama 根据两个字段对每个事件进行分类,这些字段在 [output/hacks.csv](output/hacks.csv) 中保留原样: - `classification`(分类)— 高级原因: - **协议逻辑**(约占所有事件的 55%):智能合约漏洞。对于符合条件的借贷市场,这是主要类别 — 重入攻击、访问控制失败、数学/精度错误、有缺陷的抵押品或借贷逻辑、预言机信任假设。 - **基础设施**(约占 22%):私钥泄露(包括网络钓鱼、社会工程)、热钱包被清空、前端/DNS 攻击。 - **生态系统**(约占 15%):跨协议利用,其中一个协议被用来耗尽另一个协议的资金 — 主要是闪电贷驱动的预言机攻击。对于借贷市场,这是按美元损失计算的第二大原因。 - **跑路**(约占 6%):内部人员退出和团队合约清空。 - **智能合约语言**(约占 1%):底层语言或编译器 / 特定 Solidity 字节码怪癖的漏洞。 - **求解器利用**(罕见):意图求解器利用。 - `technique`(技术)— 具体的攻击模式。在符合条件的**借贷**黑客攻击(所有链,非跨链桥)中,按整个历史的总美元损失计算的顶级技术是: `Flashloan Price Oracle Attack`(闪电贷价格预言机攻击)($241m, n=13), `Flashloan Donate Function Logic Exploit`(闪电贷捐赠函数逻辑利用)($228m, n=5), `Math Mistake Exploit`(数学错误利用)($147m, n=1), `Private Key Compromised (Phishing)`(私钥泄露(网络钓鱼))($55m, n=1), `Access Control Exploit`(访问控制利用)($53m, n=2), `Price Oracle Attack`(价格预言机攻击)($49m, n=6), `Collateral Validation Exploit`(抵押品验证利用)($48m, n=1)。 注意:分析基于**目标类型**(仅限 `DeFi Protocol`)进行过滤,但不过滤**原因** — 非恶意的基础设施故障和纯粹的跑路事件都包含在同一个损失数字中,这与文章的方法论一致。要按原因细分,请将 `output/hacks.csv` 按 `classification` 或 `technique` 分组。 ## 已知注意事项 - DefiLlama 的黑客攻击记录 `defillamaId` 覆盖不一致。名称回退机制可以恢复大多数情况,但仍有少数黑客攻击被归入“其他”领域桶 — 这些是尚未(或尚未)在 DefiLlama 上列出的协议(例如 Solana 借贷协议 Texture)。文章严格使用 DefiLlama 标记的黑客攻击;本次复制也是如此。 - 图表 4 / 图表 6(单次事件占协议 TVL 的基点)跳过了目标协议在黑客攻击日期既没有 `defillamaId` 也没有历史 TVL 的记录。大约三分之一的符合条件的 DeFi 协议黑客攻击属于此桶(主要是小型的、已失效的或刚刚启动的协议)。样本量显示在图表标题中。 - DefiLlama 在最大的协议(例如 `balancer-v2`)上偶尔会返回 HTTP 524。一个缺失的顶级 50 DEX 协议会使 DEX 桶的 TVL 偏移 <2%,这不会影响借贷的标题数字。 - 非 DeFi 滚动序列(图表 8)以美元为单位,而非基点。CEX/Wallet 黑客攻击在数据集中没有清晰的 AUM 分母,因此无法与基点图表进行同类比较。
标签:DeFi, DefiLlama, DeFi借贷, EVM, Python, Solana, TVL, 代码示例, 加密货币, 区块链安全, 区块链数据, 去中心化金融, 图表生成, 复制研究, 多链分析, 实证分析, 总锁定价值, 扩展分析, 损失统计, 数据分析, 无后门, 网络安全, 逆向工具, 金融犯罪, 隐私保护, 黑客攻击