Kovan网络闪电贷合约测试:提高借贷金额触发SafeMath溢出错误
闪电贷合约溢出问题解析
问题场景
在Kovan网络通过Remix开发Aave闪电贷合约:
- 初始合约(地址
0x567B73a65E211a62966772071C156A5B2Ecdc21F)可成功借出1 DAI(资产地址0xFf795577d9AC8bD7D90Ee22b6C1703490b6512FD) - 将合约第39行
uint amount = 1 ether;修改为uint amount = 100 ether;后,新部署合约(地址0x97D3f2072a77712B04D6065A0584C0a287EBddfe)执行时触发SafeMath: subtraction overflow错误
错误性质判断
这不属于合约Bug,而是还款逻辑的数值计算问题,核心原因如下:
- 闪电贷要求在回调周期内归还本金+利息,借款金额提升到100 ether后,利息也会按比例增长
- 若合约未正确计算本息总和,或回调结束时合约可用资金不足以覆盖本息,就会触发SafeMath的减法溢出检查(比如用合约余额减去还款额时,余额小于还款额)
- 额外注意:DAI为18位小数稳定币,需确认
100 ether的单位是否与资产小数位数匹配,避免单位不匹配导致的计算偏差
排查修复建议
- 检查回调函数(如
executeOperation):确认是否正确计算还款金额为amount + fee,且在回调结束前确保合约持有足够资金覆盖该金额 - 验证操作逻辑:确认闪电贷对应的套利/业务逻辑是否能在单次闪电贷周期内产生足够资金偿还本息,若无法覆盖,需调整策略或补充初始资金
- 核对数值单位:确认DAI的小数位数(18位)与代码中
ether单位的一致性,避免因单位错误导致的实际借款量远超预期
内容的提问来源于stack exchange,提问作者Alucard
相关产品推荐
相关产品推荐

