Solidity
OpenZeppelin 的 ERC-20 範例中這行程式碼的目的是什麼?
我想知道
if(currentAllowance != type(uint256).max)
OpenZeppelin 的 ERC-20 模板中的以下函式是如何工作的。我理解這一行的目的——確保沒有超出uint256
. 我還讀到這type
是一個內置的solidity函式,它返回介面的唯一ID,但仍有一些問題:
- 為什麼
max
在介面的唯一ID上被呼叫?- 函式來自哪裡
max
——我在solidity 或ethers 文件中都找不到它。- 為什麼需要這個檢查?我認為在 Solidity 版本 0.8.0 之後,編譯器現在會檢查下溢/溢出?
- 為什麼要呼叫類型
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 中引入的單獨主題