solidity整型溢出举例分析
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要讲解了"solidity整型溢出举例分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"solidity整型溢出举例分析"吧!什么是整型溢出
千家信息网最后更新 2026年11月01日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安全错误
数据库的锁怎样保障安全
互联网科技
广州紫鲸互联网科技有限公司
金融科技还是互联网
互联网科技卖菜
科技与互联网发展
高科技与互联网
奔汉互联网科技
蓝色互联网科技
互联网科技公司的市场部门
深圳国际航运科技和互联网
和信科技工业互联网
成都互联网科技公司工作好不好
城市宝互联网科技有限公司
互联网科技数字货币
互联网科技融合创新
广州燕处互联网科技有限公司
萌小萌互联网科技河南有限公司
互联网科技平台产品运营
互联网科技大会大佬
承德科技产业互联网平台
云南咖啡
华服互联网科技怎么样
科技与互联网
互联网与科技金融数据
互联网科技公司有哪些
互联网科技博客
广州优美互联网科技
互联网科技热点资讯
福建科技产业互联网发展
保山浩联互联网科技有限公司