Solidity

為什麼不使用 require() 代替 assert()?

  • May 22, 2018

即使require()使用量大大超過assert(),也有使用的地方assert()。一個例子是SafeMathOpenZeppelin 廣泛採用的庫:

function add(uint256 a, uint256 b) internal pure returns (uint256 c) { c = a + b; assert(c >= a); return c; }

求和後檢查wherea + b以防止溢出。

似乎require(c >= a)可以用來代替assert(c >= a)相同的功能,並有額外的機會退還未使用的 gas。有什麼理由不在這裡使用require()嗎?assert()僅用於強制人們不要執行導致上溢/下溢等不良後果的操作?

乾杯

require用於確保沒有將非法輸入傳遞給函式。

assert是為了確保不應該發生的事情 - 不會發生。

換句話說,require當您想要防止可能出現的情況時,以及assert當您想要防止出現不可能的情況時(即程式碼中的錯誤)。

assert如果您 100% 確定您的程式碼完美無缺,則可以將其視為最終會刪除的東西。

在拜占庭網路升級之前,require() 和 assert() 實際上行為相同,但它們的字節碼輸出略有不同。

assert() 使用 0xfe 操作碼導致錯誤條件 require() 使用 0xfd 操作碼導致錯誤條件

操作碼之間的一個非常重要的主要區別是 assert() 會消耗你的氣體,而 require() 不會!

請在以下位置查看非常詳細和出色的描述:

https://medium.com/blockchannel/the-use-of-revert-assert-and-require-in-solidity-and-the-new-revert-opcode-in-the-evm-1a3a7990e06e

希望這可以幫助!

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