Solidity
為什麼我不使用 require()?
CodeWars 劇透
我正在嘗試邊做邊學,我很困惑。我正在製作用於製作硬幣並將其發送給其他人的 kata。我的解決方案未通過測試,因為它說我沒有檢查餘額,但我將此行作為函式中的第一個命令:
require( (amount > 0) && (balanceOf(msg.sender) >= amount) );
我查看了通過的其他解決方案,它們都使用 if 語句:
if(balanceOf(msg.sender) < amount) return;
我在合約或函式中有多少條 require() 語句有限制嗎?
從我讀過的內容來看,我認為 require() 總是被首選作為檢查某些東西並優雅地失敗的最便宜(最少氣體)的方式。我顯然可以只寫一個 if 語句……
我只需要知道我是否遺漏了某些東西,或者 kata 測試是否只是失敗了。
有兩種情況下您希望中止事務:
- 程式碼中的錯誤
- 非法使用者輸入
第一種情況當然不應該發生。
儘管如此,為了確保它永遠不會發生,我們
assert
在變數或表達式上使用我們想要……斷言的正確性。如果我們在 QA 期間以某種方式未能檢測到程式碼中的錯誤,那麼這可以保證不會發生“錯誤事務”。
在這種情況下,儘管交易沒有完成,但使用者仍然需要為在(失敗的)斷言之前消耗的任何氣體付費。
第二種情況很可能會發生,因為我們不控制使用者輸入。
為了確保使用者輸入,我們使用
require
- 直接在輸入上,或者在從它派生的任何表達式上。在這種情況下,交易不會進行,使用者將保留所有的gas費用。
從技術上講,一旦您確定某段程式碼完美無缺,您就可以在部署它之前刪除所有剩餘的斷言(除非您不介意使用稍微額外的氣體)。