Optimization

如果我可以用它代替 if 語句,我應該使用它嗎

  • January 16, 2022

我很難為自己定義何時使用require以及何時使用if語句的最佳方法。

我們以下面的方法為例:

function setOwner(address _newOwner) public {
   require(_newOwner != address(0), "cannot set owner to 0");
   owner = _newOwner;
}

像這樣編寫這樣的函式是否有意義:

function setOwner(address _newOwner) public {
   if (_newOwner != address(0)) {
       owner = _newOwner;
   }
}

使用其中任何一種都有真正的優勢和/或不利因素嗎?我可以看到有人提出這樣的論點,即require它更加冗長,並幫助契約的最終使用者了解出了什麼問題。除此之外,我想知道是否對性能有任何影響*(閱讀:汽油費)*。

謝謝

require 將停止呼叫或恢復事務,if 語句不會。如果您嘗試替換require,則必須使用revert. 因此,您的範例不能提供相同的服務,並且您無法比較它們。

要替換require您將需要執行以下操作:

function setOwner(address _newOwner) public {
   if (_newOwner == address(0)) {
       revert("cannot set owner to 0")
   }
}

這將使它成為 2 個語句,而不是一個會增加 gas 成本的語句。

從功能的角度來看,標準所有權更改功能之一setOwner應該盡可能簡單,因此在其中添加更多條件和邏輯將使您的合約更難閱讀和證明,從而更難信任。最好創建另一個使用_setOwner私有函式的功能,該功能只需對所有者地址進行空地址檢查。

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