一位安全研究员在测试CoW协议时发现,整数除法的向下取整特性,能让恶意求解器把每笔交易的手续费"抹零"到0 wei。
这不是理论推演。他用Foundry框架跑出了完整测试用例,1000 wei的极小交易量,就能让协议收不到一分钱。
漏洞藏在哪:部分成交订单的计费公式
CoW协议允许用户签署可部分成交的订单。求解器可以分多次执行,每次按比例计算手续费。
公式看起来合理:
executedFeeAmount = (feeAmount × executedAmount) / sellAmount
问题在于Solidity没有浮点数,整数除法永远向下取整。当分子小于分母时,结果就是0。
研究员的测试用例很直白:卖单金额100 ether,手续费1 ether,执行量仅1000 wei。计算过程是(1e18 × 1000) / 100e18,结果精确归零。
这个测试通过了。意味着协议确实没收到手续费。
正方:这是设计取舍,不是漏洞
从工程角度看,整数运算是智能合约的必然选择。浮点数在链上成本极高,且不同语言的实现差异会带来更大风险。
向下取整也是行业惯例。以太坊本身的gas计算、Uniswap的K值校验,都遵循同样逻辑。如果每笔交易都向上取整,小额交易者反而吃亏。
1000 wei的攻击门槛,意味着求解器需要拆解海量订单。gas成本、计算开销、被检测风险,都会侵蚀所谓的"套利空间"。
协议的经济模型或许已经考虑这点——微量流失被视作系统摩擦成本,就像传统支付网络的手续费损耗。
反方:自动化攻击会放大漏洞
研究员的反驳很具体:单个交易只漏几wei,但自动化求解器可以重复数千次。
这触及DeFi的核心矛盾。求解器本身就是自动化程序,它们批量撮合订单、优化路径、拆分执行。把大单拆成 dust 交易,在技术上毫无障碍。
更深层的问题是不公平竞争。遵守规则的求解器正常缴纳手续费,利用漏洞的求解器零成本运营。长期看,劣币驱逐良币。
协议收入流失还有连锁效应。CoW协议的DAO依赖手续费维持运营和激励,持续流失会削弱整个经济飞轮。
我的判断:精度问题是DeFi的系统性风险
这个案例的真正价值,在于揭示了一个被低估的攻击面。
整数除法的精度损失不是CoW协议独有的。任何涉及比例计算的DeFi协议——AMM、借贷清算、收益分配——都面临同样困境。区别在于,有些协议用乘数放大精度,有些用库函数处理舍入,有些则像这里一样暴露在外。
研究员提出的修复方案值得对比。"最低手续费"检查简单直接,但会伤害小额交易场景;向上取整的mulDivUp更公平,却可能增加合约复杂度。
没有完美解,只有权衡。
这个发现最终指向一个更本质的问题:智能合约的"确定性"既是优势也是枷锁。当所有计算都必须在链上公开、可验证、无歧义地完成时,传统金融里被忽略的微量误差,在这里会被无限放大和利用。
安全研究的价值,正在于把这些隐形成本显性化。
热门跟贴