Solidity

OpenZeppelin 的 ERC-20 範例中這行程式碼的目的是什麼?

  • August 29, 2022

我想知道if(currentAllowance != type(uint256).max)OpenZeppelin 的 ERC-20 模板中的以下函式是如何工作的。我理解這一行的目的——確保沒有超出uint256. 我還讀到這type是一個內置的solidity函式,它返回介面的唯一ID,但仍有一些問題:

  1. 為什麼max在介面的唯一ID上被呼叫?
  2. 函式來自哪裡max——我在solidity 或ethers 文件中都找不到它。
  3. 為什麼需要這個檢查?我認為在 Solidity 版本 0.8.0 之後,編譯器現在會檢查下溢/溢出?
  4. 為什麼要呼叫類型uint256- 這不是變數類型而不是介面嗎?

謝謝。

function _spendAllowance(
       address owner,
       address spender,
       uint256 amount
   ) internal virtual {
       uint256 currentAllowance = allowance(owner, spender);
       if (currentAllowance != type(uint256).max) {
           require(currentAllowance >= amount, "ERC20: insufficient allowance");
           unchecked {
               _approve(owner, spender, currentAllowance - amount);
           }
       }
   }

您誤解了該行的目的,因為它不是為了防止溢出。自 0.8.0 編譯器以來,溢出保護是預設行為。一些使用者提供他們信任的所謂無限批准協議,因此他們不必不斷簽署批准交易。這通常通過將批准量設置為uint256的最大值來實現。OZ 的合約只是檢查使用者是否對 msg.sender 提供了無限批准,在這種情況下,它將跳過“剩餘批准餘額”的更新以優化 gas。

請參閱文件中的類型:https ://docs.soliditylang.org/en/v0.8.11/types.html

介面 ID 是 ERC165 中引入的單獨主題

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