solidity整型溢出举例分析
发表于:2025-01-28 作者:千家信息网编辑
千家信息网最后更新 2025年01月28日,这篇文章主要讲解了"solidity整型溢出举例分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"solidity整型溢出举例分析"吧!什么是整型溢出
千家信息网最后更新 2025年01月28日solidity整型溢出举例分析
这篇文章主要讲解了"solidity整型溢出举例分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"solidity整型溢出举例分析"吧!
什么是整型溢出呢?在solidity编写合约时,定义整型一般是用uint8, uint256。一个变量如果定义为uint8表示的无符号的8位整型,即取值范围为0-255。当给这个变量赋值256时,即整型溢出变成了0,以此类推257变成了1。
pragma solidity ^0.4.24;//author: netkiller//homepage: http://www.netkiller.cncontract NetkillerOverflowTest{ function add(uint8 a, uint8 b) pure public returns (uint8){ uint8 result = a + b; return result; } function sub(uint8 a, uint8 b) pure public returns (uint8){ uint8 result = a - b; return result; } function mul(uint8 a, uint8 b) pure public returns (uint8){ uint8 result = a * b; return result; } function div(uint8 a, uint8 b) pure public returns (uint8){ uint8 result = a / b; return result; } }
调用上面合约,运行结果
254 + 1 = 255254 + 2 = 0254 + 3 = 1
减法运行结果
10 - 20 = 246
乘法运行结果
51 * 5 = 25551 * 6 = 50
再来测试乘法
255 / 10 = 25
这有点想千年虫问题,即99年变成00年后,你无法区分1900年还是2000年。
现在测试一下uint256,uint256支持的取值范围是0到2^256-1
pragma solidity ^0.4.24;//author: netkiller//homepage: http://www.netkiller.cncontract TestUint256Overflow { // (2**256 - 1) + 1 = 0 向上溢出测试 function overflow() pure public returns (uint256 _overflow) { uint256 max = 2 ** 256 - 1; return max + 1; } // 0 - 1 = 2**256 - 1 向下溢出测试 function underflow() pure public returns (uint256 _underflow) { uint256 min = 0; return min - 1; }}
运行结果
_overflow : 0_underflow : 115792089237316195423570985008687907853269984665640564039457584007913129639935
第一个函数溢出为 0,第二个函数 0 - 1 = 115792089237316195423570985008687907853269984665640564039457584007913129639935
解决溢出问题使用SafeMath库
pragma solidity ^0.4.24;//author: netkiller//homepage: http://www.netkiller.cnlibrary SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256 c) { if (a == 0) { return 0; } c = a * b; assert(c / a == b); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256 c) { c = a + b; assert(c >= a); return c; }}contract NetkillerSafeMath { using SafeMath for uint256; function add(uint256 a, uint256 b) pure public returns (uint256){ uint256 result = a.add(b); return result; } function sub(uint256 a, uint256 b) pure public returns (uint256){ uint256 result = a.sub(b); return result; } function mul(uint256 a, uint256 b) pure public returns (uint256){ uint256 result = a.mul(b); return result; } function div(uint256 a, uint256 b) pure public returns (uint256){ uint256 result = a.div(b); return result; }}
测试 SafeMath
add(115792089237316195423570985008687907853269984665640564039457584007913129639934,1) => 115792089237316195423570985008687907853269984665640564039457584007913129639935add(115792089237316195423570985008687907853269984665640564039457584007913129639935,1) => 抛出异常
感谢各位的阅读,以上就是"solidity整型溢出举例分析"的内容了,经过本文的学习后,相信大家对solidity整型溢出举例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
测试
分析
结果
运行
问题
学习
乘法
内容
函数
变量
合约
范围
以此类推
减法
千年
千年虫
就是
思路
情况
文章
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器怎么扩大储存
服务器内存扩展是什么意思
盛林互联网科技
网络安全教育的心得800字
人才交流中心数据库习题
如何下载安检服务器
网络安全国家案例
数据库自动重新排布
呼吁网络安全的作文
资金盘网站服务器ip怎么查
税务软件开发工资
计算机网络技术研修总结
万户网络技术支持
芜湖网新网络技术有限公司泡澡桶
云数据库出现的背景
vpn 虚拟服务器
兴仁网络安全系统
网络安全法对电力影响
计算机网络安全保密性题目
yii2 多个数据库
属于数据库中的一条记录是
小学生共建网络安全文明
服务器称号
上海网络安全咨询报价
网络安全国家案例
服务器io读写3000
学网络安全最好的二本
云端服务器优势
ifix软件开发商
网络安全主题班会的主题