【问题标题】:Why is the open zeppelin Safe Math contract not importing?为什么 openzeppelin Safemath 合约没有导入?
【发布时间】:2022-07-07 02:32:48
【问题描述】:

我正在使用来自 Ethernaut 的以下合同并执行sudo npm i @openzeppelin/contracts

pragma solidity 0.6.0;

import "@openzeppelin/contracts/math/SafeMath.sol";

contract CoinFlip {

  using SafeMath for uint256;
  uint256 public consecutiveWins;
  uint256 lastHash;
  uint256 FACTOR = 57896044618658097711785492504343953926634992332820282019728792003956564819968;

  constructor() public {
    consecutiveWins = 0;
  }

  function flip(bool _guess) public returns (bool) {
    uint256 blockValue = uint256(blockhash(block.number.sub(1)));

    if (lastHash == blockValue) {
      revert();
    }

    lastHash = blockValue;
    uint256 coinFlip = blockValue.div(FACTOR);
    bool side = coinFlip == 1 ? true : false;

    if (side == _guess) {
      consecutiveWins++;
      return true;
    } else {
      consecutiveWins = 0;
      return false;
    }
  }
}

但是,即使在安装了所有 openzeppelin 合约后,我仍然收到有关未找到 SafeMath 合约的错误:Error: Could not find @openzeppelin/contracts/math/SafeMath.sol from any sources

我的配置如下:

Truffle v5.1.39 (core: 5.1.39)
Solidity - 0.6.0 (solc-js)
Node v16.13.1
Web3.js v1.2.1

【问题讨论】:

    标签: ethereum truffle openzeppelin


    【解决方案1】:

    当您像以前一样使用 npm 安装 openzeppelin 合同时,您会安装带有当前标签的版本。当前标签现在是 Solidity 版本 ^0.8.0。从 0.8+ 版本开始,您不再需要使用 SafeMath,因为它是在语言级别上实现的。

    当您使用 Solidity 0.6 版时,您还应该为此版本安装 openzeppelin 包。这应该是 3.4.1。您可以使用以下命令安装此版本:

    npm i @openzeppelin/contracts@3.4.1
    

    然而,更好的解决方案是将你的合约更新到 Solidity 版本 0.8+,使用当前的 openzeppelin 实现并删除 SafeMath 库。

    【讨论】:

      猜你喜欢
      • 2021-08-24
      • 2022-01-08
      • 1970-01-01
      • 2021-08-14
      • 2021-10-18
      • 2021-07-01
      • 1970-01-01
      • 2017-09-20
      • 2021-10-06
      相关资源
      最近更新 更多