Solidity
為什麼不使用 require() 代替 assert()?
即使
require()
使用量大大超過assert()
,也有使用的地方assert()
。一個例子是SafeMath
OpenZeppelin 廣泛採用的庫:
function add(uint256 a, uint256 b) internal pure returns (uint256 c) { c = a + b; assert(c >= a); return c; }
求和後檢查where
a + b
以防止溢出。似乎
require(c >= a)
可以用來代替assert(c >= a)
相同的功能,並有額外的機會退還未使用的 gas。有什麼理由不在這裡使用require()
嗎?assert()
僅用於強制人們不要執行導致上溢/下溢等不良後果的操作?乾杯
require
用於確保沒有將非法輸入傳遞給函式。
assert
是為了確保不應該發生的事情 - 不會發生。換句話說,
require
當您想要防止可能出現的情況時,以及assert
當您想要防止出現不可能的情況時(即程式碼中的錯誤)。
assert
如果您 100% 確定您的程式碼完美無缺,則可以將其視為最終會刪除的東西。
在拜占庭網路升級之前,require() 和 assert() 實際上行為相同,但它們的字節碼輸出略有不同。
assert() 使用 0xfe 操作碼導致錯誤條件 require() 使用 0xfd 操作碼導致錯誤條件
操作碼之間的一個非常重要的主要區別是 assert() 會消耗你的氣體,而 require() 不會!
請在以下位置查看非常詳細和出色的描述:
希望這可以幫助!