Optimization
如果我可以用它代替 if 語句,我應該使用它嗎
我很難為自己定義何時使用
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
私有函式的功能,該功能只需對所有者地址進行空地址檢查。