Skip to content

Solidity8新特性

新特性

  • 安全数学
  • 自定义错误
  • 函数在合约之外
  • 引用合约的名称可以起别名
  • create2

safe math

之前的uint无符号正整数是有数学溢出的,我们在使用数学方法的时候一般都要引用一个安全数学方法,如果是0-1得到的是uint256的最大值而不是-1,因为uint是无符号整数。这种情况就叫做数学溢出的错误。

JavaScript
// SPDX-License-Identifier:MIT

pragma solidity ^0.8;

  

// safe math

contract SafeMath {

    function testUnderflow() public pure returns (uint) {

        uint x = 0;

        x--;   // 会自动检测安全溢出:call to SafeMath.testUnderflow errored: execution reverted

        return x;

    }

    function testUncheckedUnderflow() public pure returns (uint) {

        uint x = 0;

        unchecked { x--; }  // 不检验安全溢出

        return x;

    }

}

Custom error

JavaScript
// SPDX-License-Identifier:MIT

pragma solidity ^0.8;

  

// custom error

contract VendingMachine {

    address payable owner = payable(msg.sender);

  

    function withdraw() public {

        if(msg.sender != owner){

            revert("error");  // 以前我们是通过revert(str)的方式进行报错

            // 其中字符串的长度决定你消耗的gas多少

        }

  

        owner.transfer(address(this).balance);

    }

}

函数在合约之外的使用

JavaScript
// SPDX-License-Identifier:MIT

pragma solidity ^0.8;

  

// function outside contract

  

function helper(uint x) view returns (uint) {

    return x*2;

}  

// 这种函数里只能进行简单的状态运算,不能含有状态变量

// 该文件,或者继承该文件的地方都可以使用该函数

  

contract TestHelper {

    function test() external view returns (uint) {

        return helper(123);

    }

}

as name

JavaScript
import {symbol1 as alias, symbol2} from "filename";

create2

原来我们使用create2是使用内联汇编的形式: 以前需部署的时候才能知道这个地址,而现在可以使用这个盐(salt)