漏洞解析:
由于solidity里不支持小数点,因此小数点后面的数字会进行截断(不是四舍五入)只取前面整数,从而对计算结果产生问题。
代码解析:
代码简单的说明了两种情况(先乘后除,和先除后乘),正确的计算合约是先乘后除。
pragma solidity ^0.8.0;
//错误的合约
contract Mis_calculation {
function price(
uint256 price,
uint256 discount
) public pure returns (uint256) {
return (price / 100) * discount; // wrong calculation
}
}
//正确的合约
contract Calculation {
function price(
uint256 price,
uint256 discount
) public pure returns (uint256) {
return (price * discount) / 100; // correct calculation
}
}
错误的计算方式——Mis_calculation方法调用
如果传入的是10,10,那么就是10/100 *10 那么实际结果0.1会被当成0,最终结果就是0
如果传入的是120,10,那么就是120/100 *10 那么实际结果1.2会被当成1,最终结果就是10
如果传入的是120,10,那么就是1900/100 *10 那么1.9也会被当成1,最终结果就是10
正确的Calculation方法调用,传入10,10,答案是1,正确
原文始发于微信公众号(Ice ThirdSpace):DeFiVulnLabs靶场全系列详解(二十四)先除后乘造成整数截断,计算产生错误
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论