Solidity
修改器與函式哪種方法在氣體方面更有效?
contract test { address public _onwer; error NotOwner(); modifier OnlyOwner1() { if(msg.sender != _onwer) { revert NotOwner(); } _; } function OnlyOwner2() private view { if(msg.sender != _onwer) { revert NotOwner(); } } function toDoSomething1() public view OnlyOwner1() { // to do something } function toDoSomething2() public view { OnlyOwner2(); // to do something } }
以上面的程式碼為例toDoSomething1()和toDoSomething2(),哪個方法效率更高,修飾符(OnlyOwner1())還是函式(OnlyOwner2())?
如果您能解釋原因,我將不勝感激。
我在 Remix 中進行了測試,雖然兩個函式呼叫都恢復了,但兩種方法的執行成本大致相似(成本僅在被合約呼叫時適用),
toDoSomething1()
23410 氣體與toDoSomething2()
23403 氣體。它們的效率幾乎與在執行函式之前執行相同的條件檢查一樣有效。但是為了獲得最佳編碼實踐,我會使用modifier
關鍵字聲明修飾符,因為它們可以根據需要被派生契約繼承和覆蓋。
這將取決於程式碼,但在執行方面通常不會有太多內容,但在部署程式碼的大小上可能會有很大的不同。當程式碼被部署時,修飾符程式碼被插入或包裹在它使用的每個函式中。
在你的例子中
function toDoSomething1() public view OnlyOwner1() { if(msg.sender != _onwer) { revert NotOwner(); } // to do something }
或者
modifier testMod { ++stateVar1; _; ++stateVar2; } function testFunc() public testmod { --stateVar3; }
變成
function testFunc() public { ++stateVar1; --stateVar3; ++stateVar2; }
如果一個修飾符被多次使用,它可能會導致大量的程式碼重複,這會使部署成本更高,或者可能會產生足夠的差異,從而使合約大小超過限制。