蝴蝶效应:Comptroller 代码更新事故全景回顾与启示

·

有时候,社区只听见链上的一声轻叹,却未见角落里数千万美元的悄然蒸发。

背景速写:Compound 的运作肌理

为什么必须有“借贷”?

在区块链世界,所有资产皆可代币化。

当你既想留住原生资产,又想押注新项目,去中心化借贷就是杠杆倍增器:抵押既有资产 → 借入目标代币 → 放大收益敞口。
延伸概念:去中心化借贷杠杆交易流动性挖矿

Compound 借还流程三步走

  1. 用户向任意 CToken 合约存入底层资产(例如 ETH → cETH)。
  2. 质押生成的 cToken 代表权益,平台实时累计利息。
  3. 在“超额抵押率”允许范围内,可随时调用 borrow() 借出其他资产。

Comptroller 是规则的“守门员”:
计算账户流动性、校验抵押率、更新奖励指数,一切可编程、可审计。

COMP 治理与激励


代码升级事故:两部连环套

事故 1:初始化错误导致奖励下溢

  1. 提案 62 试图修复 Comptroller 合约,核心变量 compSpeed(每区块发放的 COMP 数量)被调整。
  2. 若管理员将某市场 compSpeed 设为 0(暂停),后续再改回非零值时,未重新初始化奖励指数,导致调用链:

    mint() → mintFresh() → distributeSupplierComp()

    出现 supplierIndex = 1e36supplyIndex = 0 的严重错位。

  3. 连续减法运算触发 uint256 下溢,合约直接“送”用户以天文数字的 COMP。

事故 2:修复逻辑再添一把火

  1. 为了补洞,合约新建 _initializeMarket(),将新增市场奖励指数强行设为 1e36
  2. 然而用户奖励指数 (compSupplierIndex[用户][市场]) 未同步初始化,等于 “仓库上了锁,钥匙没给人”
  3. 结果是:存量用户在升级前留下的 cToken 突然获得 1e36 × 余额 的额外 COMP。
    受波及的池子:cSAI cTUSD cMKR cSUSHI cAAVE cYFI 等。

查看链上痕迹,一位用户地址 0xa7b95d2...74fc 一次性领取超过 8,000 万枚 COMP,市场抛压瞬间扩大。
👉 速查链上数据:事故影响有多深?


技术诊疗:问题到底出在哪?

关键词场景解释对应风险域
compSupplyState记录某市场全局累计的 COMP 指数未初始化或跳过
compInitialIndex设计预设为 1e36,误作初始值使用初始化逻辑缺失
setCompSpeed=0管理手段,暂停奖励再重启后无补偿
超发补偿公式deltaIndex × cTokenBalance巨大 uint256 溢出

修复方案最终在提案 64 上线:
修改分发函数准入判断,把用户奖励指数 supplierIndex 强制从 0 改为 compInitialIndex 的时机前移,杜绝历史债务集中清算。


常见疑问 FAQ

Q1:为什么我升级合约前要如此谨慎?
A:以太坊一旦上链即不可回滚,代理模式升级必须确保存储布局兼容,否则极小的错位就能引发全局 трансформация。

Q2:事件里价值 1 亿美金的 COMP 最终怎么处理?
A:Compound 官方悬赏 10% 白帽奖励呼吁自愿归还,同时使用法律途径施压,最终约 37% 代币被返还,其余仍悬而未决。

Q3:DAO 投票为何在紧急时刻反而“拖后腿”?
A:链上治理需等待投票期、时间锁,48 小时乃至 7 天的延迟在市场剧烈波动面前显得尤为漫长。提案 63 尝试立即关闭奖励,却因社区分歧被否决。

Q4:作为普通用户,如何第一时间识别此类漏洞?
A:紧盯官方治理区公告、关注区块链浏览器异常的大额 Claim、使用实时审计平台监测关键函数调用即可做到未雨绸缪。

Q5:未来还能安全参与 DeFi 借贷吗?
A:可!优先选择已通过多家安全机构审计的协议,分散仓位,启用硬件钱包与限额授权,并保留“紧急止损”方案(如随时提币)。

Q6:COMP 价格为何在事件后几天反而止跌回升?
A:由于部分用户抛售随即获利了结,加上 Compound 官方回购、返还 $COMP 缓解抛压,市场情绪触底反弹,而又因 DeFi 赛道长期价值仍在。


总结与反思

  1. 测试与审计永远无价:一次刚刚好覆盖 100% 分支的单元测试,就能避免上万倍损失。
  2. 代理升级需双重校验存储插槽,别让补丁带来新的补丁。
  3. DAO 虽然去权威,但在突发灾难时仍需紧急多重签名熔断机制以平衡效率与安全。
  4. 再老牌的 去中心化平台 也可能摔倒,须知“安全不是名片,是底线”。

愿每一位开发者、投资者在区块链大潮中,既记得追逐 APY,也珍视“覆水难收”的信条。