Solidity
SafeMath 中定義的函式 sub() 的單參數版本在哪裡?
我正在通過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的 auint256
。你可以在 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;
語句的預期目標。我希望這能回答你的問題。