Solidity
在視圖函式中呼叫狀態修改函式
有沒有可能做這樣的事情?
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()
確實修改了狀態,它將恢復,因為success
isfalse
。
答案是不。它不會編譯
視圖函式不能修改狀態,編譯器會檢查這個並給你
TypeError:函式聲明為視圖,但此表達式(可能)修改了狀態
用solidity 0.8.3測試它