Solidity

為什麼我不使用 require()?

  • January 14, 2018

CodeWars 劇透

我正在嘗試邊做邊學,我很困惑。我正在製作用於製作硬幣並將其發送給其他人的 kata。我的解決方案未通過測試,因為它說我沒有檢查餘額,但我將此行作為函式中的第一個命令:

require( (amount > 0) && (balanceOf(msg.sender) >= amount) );

我查看了通過的其他解決方案,它們都使用 if 語句:

if(balanceOf(msg.sender) < amount) return;

我在合約或函式中有多少條 require() 語句有限制嗎?

從我讀過的內容來看,我認為 require() 總是被首選作為檢查某些東西並優雅地失敗的最便宜(最少氣體)的方式。我顯然可以只寫一個 if 語句……

我只需要知道我是否遺漏了某些東西,或者 kata 測試是否只是失敗了。

有兩種情況下您希望中止事務:

  1. 程式碼中的錯誤
  2. 非法使用者輸入

第一種情況當然不應該發生。

儘管如此,為了確保它永遠不會發生,我們assert在變數或表達式上使用我們想要……斷言的正確性。

如果我們在 QA 期間以某種方式未能檢測到程式碼中的錯誤,那麼這可以保證不會發生“錯誤事務”。

在這種情況下,儘管交易沒有完成,但使用者仍然需要為在(失敗的)斷言之前消耗的任何氣體付費。

第二種情況很可能會發生,因為我們不控制使用者輸入。

為了確保使用者輸入,我們使用require- 直接在輸入上,或者在從它派生的任何表達式上。

在這種情況下,交易不會進行,使用者將保留所有的gas費用。

從技術上講,一旦您確定某段程式碼完美無缺,您就可以在部署它之前刪除所有剩餘的斷言(除非您不介意使用稍微額外的氣體)。

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