Solidity

SafeMath 中定義的函式 sub() 的單參數版本在哪裡?

  • May 18, 2022

我正在通過Ethernaut 挑戰來學習 Solidity,在挑戰 3(“硬幣翻轉”)中,他們顯示了以下程式碼,該程式碼從目前塊號中減去 1:

在此處輸入圖像描述

我假設這個“sub()”函式是一個內置的減法函式,但它似乎必須在OpenZeppelin 的 SafeMath.sol 庫中定義,因為當我在這個簡單的例子中註釋掉 SafeMath 的使用時,我得到一個編譯器警告:

在此處輸入圖像描述

但是,當我查看 SafeMath.sol 時,我沒有看到 sub() 函式的單參數版本。那裡只定義了 sub() 的兩參數和三參數版本:

在此處輸入圖像描述

sub() 函式的這個單參數版本在哪裡定義?

您在SafeMath.sol中看到的函式:

function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    return a - b;
}

是用 隱式呼叫的那個block.number.sub(1)。之所以如此,是因為 SafeMath.sol 是library附加到 type的 a uint256。你可以在 Etherenaut 挑戰合約中看到它:

using SafeMath for uint256;

文件中對此進行了描述,對於不匹配的參數數量,這是要閱讀的相關部分:

將 A 用於 B 的指令;可用於將函式 (A) 作為成員函式附加到任何類型 (B)。這些函式將接收它們被呼叫的對像作為它們的第一個參數(如 Python 中的 self 變數)。

但是你也可以直接使用這個庫,這個例子中顯示的兩種語法是完全等價的:

pragma solidity ^0.8.0;

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

contract Example {

   using SafeMath for uint256;

   function withAttachedFunction() public pure returns (uint256) {
       uint256 variable = 1;

       return variable.sub(1);
   }

   function withoutAttachedFunction() public pure returns (uint256) {
       uint256 variable = 1;

       return SafeMath.sub(variable, 1);
   }
}

顯然,使用variable.sub(...)語法更方便,這也是using X for Y;語句的預期目標。

我希望這能回答你的問題。

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