首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合同中的溢出是如何处理的?

合同中的溢出是如何处理的?
EN

Ethereum用户
提问于 2017-08-08 19:34:22
回答 3查看 788关注 0票数 3

假设我有一个uint256类型变量的智能契约。我编写了一个函数来增加这个变量。

EVM如何处理试图增加变量以存储超过256位的值?

可靠的医生说:

数字文字表达式保持任意精度,直到它们被转换成非文字类型(即,将它们与非文字表达式一起使用)。这意味着计算不会溢出,而除法不会在数字文字表达式中截断。

所以很明显它不会溢出,那么它会做什么呢?

EN

回答 3

Ethereum用户

发布于 2017-08-09 02:22:48

非文字表达式溢出。我认为一个“字面”的表达式大约是1223424234。我想这不会溢出,因为它甚至不会编译。如果a+b大于最大uint256,非文字表达式(a = 1213232;b= 121231231 -- a和b实际上很大)将溢出。至少这是我的读物。

票数 1
EN

Ethereum用户

发布于 2021-03-15 12:57:26

这取决于您正在使用的稳健性版本。

固体度v0.8及以上

默认情况下检查溢出和下溢。根据变化量g

检查溢出是非常常见的,因此我们将它们作为默认的,以提高代码的可读性,即使它是在稍微增加气体成本的情况下进行的。

更具体而言:

算术溢出将使用错误数据,该错误数据等于对Panic(uint256)的函数调用,并具有特定于环境的错误代码。

因此,以下代码将恢复:

代码语言:javascript
复制
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;
}

固体度v0.7及以下

默认情况下,不检查溢出和下溢。相同的代码片段返回0。

代码语言:javascript
复制
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.solCarefulMath.sol这样的数学库。

票数 1
EN

Ethereum用户

发布于 2020-11-19 17:32:48

Solity0.8.x将具有所谓的检查算法:

https://blog.soliditylang.org/2020/10/28/solidity-0.8.x-preview/

它不允许整数溢出或在代码块中下溢。

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/23937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档