Solidity

修改器與函式哪種方法在氣體方面更有效?

  • November 7, 2022
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;
}

如果一個修飾符被多次使用,它可能會導致大量的程式碼重複,這會使部署成本更高,或者可能會產生足夠的差異,從而使合約大小超過限制。

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