Solidity

在視圖函式中呼叫狀態修改函式

  • April 4, 2021

有沒有可能做這樣的事情?

contract Test {
   function test (bool isTransaction) public view {
       if (isTransaction) {
         foo();
       }

       ...
   }
   
   function foo () public {
       ...
   }
}

在最好的情況下,我可以test()像通常的視圖/純函式一樣呼叫而不需要進行事務,但如果isTransaction是真的test()需要我進行事務才能呼叫它。也許我可以拋出異常或類似的東西來編譯和執行這段程式碼?

編輯: bool transaction得到bool isTransaction

您可以使用以下方法完成類似的操作staticcall

contract Test {
 function test (bool transaction) public view {
   if (transaction) {
     (bool success,) = address(this).staticcall(abi.encodeWithSignature("foo()"));
     require(success, "Contract call failed");
   }
 }
   
 function foo () public {
   // ...
 }
}

test只要foo()不修改狀態,這將編譯並執行而不會出錯。如果foo()確實修改了狀態,它將恢復,因為successis false

答案是不。它不會編譯

視圖函式不能修改狀態,編譯器會檢查這個並給你

TypeError:函式聲明為視圖,但此表達式(可能)修改了狀態

用solidity 0.8.3測試它

在此處輸入圖像描述

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