Solidity中uint8与整数字面量相加触发VM error revert报错
核心原因
这个差异来自Solidity对显式类型变量运算和整数字面量运算的两套不同检查规则,0.8.x版本默认开启的整数溢出检查是触发回滚的直接前提。
触发回滚的写法逻辑
第一段问题代码:
function somePureFunction() public pure returns(uint256){ uint8 temp = 255; return 2 + temp; }
uint8是8位无符号整数,合法取值范围固定为0~255- 当显式声明类型的
uint8变量temp参与加法运算时,Solidity会遵循类型匹配规则:另一侧的整数字面量2会被隐式转换为uint8类型,两个uint8运算的结果默认也是uint8类型 - 运算结果
2+255=257明显超出uint8的最大值255,运行时溢出检查被触发,直接导致交易revert - 报错信息里提到的
payable相关提示是调试工具的通用兜底文案,和本次回滚的真实原因没有关系
正常运行的写法逻辑
第二段可正常执行的代码:
function somePureFunction() public pure returns(uint256){ return 2 + 255; }
- Solidity里的整数字面量本身没有绑定固定宽度的整数类型,它的实际类型会根据上下文在编译阶段推断
- 纯字面量之间的运算会在编译期直接完成常量折叠计算,不会套用小宽度整数类型的溢出规则:编译器会直接算出
2+255=257,再检查这个结果是否符合返回值要求的uint256类型的取值范围,257显然在uint256的合法区间内,整个过程没有运行时溢出风险,所以可以正常执行
补充说明
如果想让第一段代码正常运行,只需要在运算时把temp显式转换为uint256即可,比如写成return 2 + uint256(temp);,此时运算的统一类型为uint256,257不会触发溢出。
内容的提问来源于stack exchange,提问作者Mandroid
相关产品推荐
相关产品推荐

