自动做市商的价格来自池子里两种代币的实际余额——这个听天由命的设计有一条隐蔽的旁路:任何人不经过流动性操作、直接往池子地址转一笔币,余额就变了。对普通 ERC-20,这笔转错的钱没有主人认领,只影响一次报价;但对余额会自己变化的弹性供应代币,攻击者转进去的币会跟着重基机制被放大或稀释到全池,一次小额注入可以撬动远超面值的报价位移。这个缝隙在两代弹性稳定币的事故史里反复出现,值得把机制根因一次讲透。涉及历史案例只描述公开记录的机制类型,不复述具体数字细节。
先复习弹性供应的记账特性。这类代币的目标是维持一单位挂钩价,手段是周期性重基:价格高于目标时全体地址的余额按比例上调,低于目标时下调,总供应量随之伸缩,持有人地址的相对占比不变。关键在实现层面——重基不移动任何币,只在转账和查询时按当前乘数折算余额。也就是说,余额这个概念在这类代币里是一个随时间漂移的函数值,而 AMM 池读取的恰恰是名义余额这个原始字段。两套语义的缝隙就此打开。
攻击原型这样发生。弹性代币 X 与稳定币组成池子,攻击者不走任何流动性接口,直接调用 X 的转账函数向池子转一笔 X。此刻池子的 X 余额增大,恒定乘积公式立刻报出 X 折价——但注意,攻击者转进去的 X 没有被任何人认领,它躺在池子合约里;而按弹性机制,池子里所有的 X(包括攻击者转入的)在下一次重基时都要乘上系数。如果攻击的时机选在价格刚被砸低、重基系数即将下调的窗口,攻击者实际转进去的原始成本被重基稀释,回收时通过认领通道或提前布局的头寸接回放大后的头寸——数学上是一笔用记账缝隙补贴的操纵,钱转了一圈大部分回自己口袋。
防线同样有据可查,全部围绕一句原则:合约不信任裸转账,信任可提取记录。主流实现把池子收币拆成两条通道——流动性操作与兑换走记账内转移,外部转入必须显式调用认领类函数才能入账计价,裸转账进来的资产只是无主挂账,不进价格。审计里这一项检查的关键词是余额型定价:凡是定价或储备校验直接读代币余额字段、又没有可提取性账本的合约,都被归入同一风险族。历史事故推动这套模式从衍生品协议扩散到了稳定币挂钩协议与多 hop 兑换路由,今天主流 AMM 对裸转账基本免疫,防线失效的剩余场景集中在山寨分叉、自建小池与把余额当净值核算的记账代码。
普通用户的位置在这张攻防图的外圈,但有两件事只有用户能做。第一,识别弹性代币进池的兼容风险:一个重基频率高、目标波动大、市场深度浅的弹性资产,与任何不熟悉其转账特性的新协议组合,都值得先拿小额测试一笔——先转出再转回、观察对方协议是否把这笔转账计入了任何头寸或净值,五分钟内能测出的事不要靠阅读信仰。第二,别把余额当净值:钱包显示你持有某个重基代币多少枚,与这些枚数在本次重基后仍然值多少,是两个数字;借贷协议用弹性代币做抵押时,抵押品价值随重基跳变,清算线跟着跳——历史上弹性抵押品连环清算的剧本,触发点从来不是市场价而是重基本身。
与这一族机制的远亲排排坐:转账税代币的实收申报差、金库的直接转币不领份额攻击、桥锁定地址里的无主币——四个故事共享同一课:链上资产的安全语义必须由协议账本定义,链上余额只是提示。写进合约的每一行读取外部资产余额的代码,都应当反问一句:这个字段最近一次变化是谁触发的?答不出,就是风险敞口。
顺带把弹性机制的两代教训各留一句。第一代弹性稳定币的公开教训:把价格稳定押在再平衡博弈上、用余额幻觉做激励,最终稳定层与攻击面同时塌方,它证明了弹性≠稳定。第二代把弹性限缩为挂钩修正工具、用超额抵押做地基,重心从博弈转向清算时序,重基攻击的剩余表面风险与抵押清算的先后顺序缠在一起,评估任何此类产品时问一句你的清算与重基哪个先到,比读白皮书的承诺有用。
最后给一个可以自己动手的验证清单,四步。一,读该代币的重基实现:确认重基是纯记账折算还是真的给地址补币——前者裸转攻击要重新推演,后者攻击模型完全不同。二,读目标池子的收币逻辑:有没有认领函数、定价是否引用可提取余额。三,查池子对该资产的历史重基日净值表现:重基日附近池子净值有没有异常锯齿,那是记账适配缺陷的公开体温计。四,弹性代币进任何借贷或衍生品协议前,在区块浏览器核对协议有没有专门的重基适配事件处理——适配缺失时重基日的清算名单会比行情推演的更意外。
本文仅讨论代币与做市机制,不构成投资建议;弹性供应代币存在重基损失、清算与合约适配风险,价格操纵攻击会瞬间摧毁流动性,参与任何相关交易前请独立核验实现与数据。

发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。