solidity整型溢出举例分析
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,这篇文章主要讲解了"solidity整型溢出举例分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"solidity整型溢出举例分析"吧!什么是整型溢出
千家信息网最后更新 2025年12月02日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安全错误
数据库的锁怎样保障安全
服务器被流量攻击
knx 数据库后缀
利信软件数据库
快速清理数据库表数据
西青区标准软件开发报价技术规范
网络安全市场特征
网站服务器怎么改内容
软件开发怎么学的
数据库文件表字段设计
12c数据库
cc数据库设计图片
网络安全中数据治理的成效
深圳电脑软件开发教程
维护mysql数据库安全性
网络安全防护软件的定义
我的世界54000m跑酷服务器
新加坡服务器 备案吗
卓越之剑修改数据库
广州贪吃虎网络技术有限公司扣钱
安徽web前端软件开发价格表
计算机网络安全知识普及率
sql 替换部分数据库
提升网络安全能力与水平研讨
浙江省网络安全宣传周启动
老乡网络技术
昆明软件开发公司招聘待遇
军队网络技术
瑞庭网络技术是真是假
知网数据库撤稿后更新
网络技术对文学的影响