Solidity

使用 SafeMath 的編譯錯誤

  • June 11, 2019

我正在嘗試使用 SafeMath 庫進行減法運算。以下是我的程式碼:

pragma solidity ^0.5.1;
library SafeMath {
 function sub(uint256 a, uint256 b) internal pure returns (uint256) {
   assert(b <= a);
   return a - b;
 }
}
contract Underflow1 {
using SafeMath for uint;
   uint8 num= 0;
   function testf2() public returns (uint8){
   //val--;    
   num= num.sub(1);
   return num;
   }
}

我收到以下錯誤消息:

browser/UF8-SM.sol:13:10:TypeError:在 uint8 中進行參數相關查找後,找不到成員“sub”或不可見。數字=數字.sub(1); ^—–^

有人請指導我。

祖爾菲。

您收到該錯誤的原因num是 type uint8,而sub()SafeMath 的功能正在尋找 type uint256。此外,您聲明using SafeMath for uint;,它確認它僅適用於uint256(作為uint的別名uint256)。


有兩種方法可以修復它:

1)製作num類型uint256。您的程式碼如下所示:

pragma solidity ^0.5.1;
library SafeMath {
 function sub(uint256 a, uint256 b) internal pure returns (uint256) {
   assert(b <= a);
   return a - b;
 }
}

contract Underflow1 {
using SafeMath for uint;
   uint256 num= 0;
   function testf2() public returns (uint256){
   //val--;    
   num = num.sub(1);
   return num;
   }
}

2)(非首選)允許 SafeMath 處理 type uint8。您的程式碼如下所示:

pragma solidity ^0.5.1;
library SafeMath {
 function sub(uint8 a, uint8 b) internal pure returns (uint8) {
   assert(b <= a);
   return a - b;
 }
}

contract Underflow1 {
using SafeMath for uint8;
   uint8 num= 0;
   function testf2() public returns (uint8){
   //val--;    
   num = num.sub(1);
   return num;
   }
}

引用自:https://ethereum.stackexchange.com/questions/71726