• 预防溢出


    假设我们有一个 uint8, 只能存储8 bit数据。这意味着我们能存储的最大数字就是二进制 11111111 (或者说十进制的 2^8 - 1 = 255).

    来看看下面的代码。最后 number 将会是什么值?

    uint8 number = 255;
    number++;
    

    在这个例子中,我们导致了溢出 — 虽然我们加了1, 但是 number 出乎意料地等于 0了。 (如果你给二进制 11111111 加1, 它将被重置为 00000000,就像钟表从 23:59 走向 00:00)。

    下溢(underflow)也类似,如果你从一个等于 0 的 uint8 减去 1, 它将变成 255 (因为 uint 是无符号的,其不能等于负数)。

    虽然我们在这里不使用 uint8,而且每次给一个 uint256 加 1 也不太可能溢出 (2^256 真的是一个很大的数了),在我们的合约中添加一些保护机制依然是非常有必要的,以防我们的 DApp 以后出现什么异常情况。

    然而,又是OpenZeppelin帮忙,它建立了一个叫做safeMath的库来帮忙,库是Solidity中一种特殊的合约,其中的一个功能是给原始数据类型增加方法。

    比如使用SafeMath库的时候,使用using SafeMath for uint256这样的语法,SafeMath对于数据有add,sub(减法),mul(乘法)和div(除法)语法使用

    如:using SafeMath for uint256; uint256 a = 5; uint256 b = a.add(3); // 5 + 3 = 8 uint256 c = a.mul(2); // 5 * 2 = 10

    库与继承合约不同,库可以把自己的使用方法赋予某一个数据类型(有点类似类和包)


    根据不同的uint字节数,有不同的SafeMath库来对应

    SafeMath16

    SafeMatn32等等

  • 相关阅读:
    Redis介绍
    getch
    gecher
    C语言中的sleep函数
    sleep
    C语言中的System()函数
    System的使用
    函数参数的传递方式
    C语言strlen()函数:返回字符串的长度
    strlen
  • 原文地址:https://www.cnblogs.com/beautiful7/p/12423102.html
Copyright © 2020-2023  润新知