假设我有一个uint256类型变量的智能契约。我编写了一个函数来增加这个变量。
EVM如何处理试图增加变量以存储超过256位的值?
可靠的医生说:
数字文字表达式保持任意精度,直到它们被转换成非文字类型(即,将它们与非文字表达式一起使用)。这意味着计算不会溢出,而除法不会在数字文字表达式中截断。
所以很明显它不会溢出,那么它会做什么呢?
发布于 2017-08-09 02:22:48
非文字表达式溢出。我认为一个“字面”的表达式大约是1223424234。我想这不会溢出,因为它甚至不会编译。如果a+b大于最大uint256,非文字表达式(a = 1213232;b= 121231231 -- a和b实际上很大)将溢出。至少这是我的读物。
发布于 2021-03-15 12:57:26
这取决于您正在使用的稳健性版本。
默认情况下检查溢出和下溢。根据变化量g:
检查溢出是非常常见的,因此我们将它们作为默认的,以提高代码的可读性,即使它是在稍微增加气体成本的情况下进行的。
更具体而言:
算术溢出将使用错误数据,该错误数据等于对
Panic(uint256)的函数调用,并具有特定于环境的错误代码。
因此,以下代码将恢复:
pragma solidity ^0.8.0;
function foo() external pure returns (uint256) {
uint256 a = type(uint256).max;
uint256 b = 1;
uint256 c = a + b; // Reverts
return c;
}默认情况下,不检查溢出和下溢。相同的代码片段返回0。
pragma solidity ^0.7.0;
function foo() external pure returns (uint256) {
uint256 a = type(uint256).max;
uint256 b = 1;
uint256 c = a + b; // Does NOT revert
return c; // Equal to 0
}为了确保程序的行为正确,您应该使用像SafeMath.sol或CarefulMath.sol这样的数学库。
发布于 2020-11-19 17:32:48
Solity0.8.x将具有所谓的检查算法:
https://blog.soliditylang.org/2020/10/28/solidity-0.8.x-preview/
它不允许整数溢出或在代码块中下溢。
https://ethereum.stackexchange.com/questions/23937
复制相似问题