Solidity

是否可以在不更改區塊鏈狀態的情況下從智能合約中對非靜態函式進行靜態呼叫?

  • January 8, 2022

我已經看到 Uniswap 的 Web 界面正在對持有流動性頭寸的合約進行“虛假”呼叫,並要求所有費用 ( .collect(..)) 而不實際要求它們。這意味著他們在不更改實際區塊鏈狀態的情況下偽造要執行的非靜態呼叫。

我現在的問題是,這是否也可以通過智能合約本身在 EVM 中實現?換句話說,有沒有辦法對一個非靜態函式進行靜態呼叫,只獲得所需的返回值而不改變區塊鏈狀態?

根據EIP-214的定義,靜態呼叫中的任何狀態更改都會導致錯誤。因此,如果您將函式定義為viewpure這將是不可能的,因為這表明他們應該使用的呼叫合約staticcall

但是如果你想寫一個方法並且不關心view或者pure你可以做一個小技巧。

您創建一個將執行呼叫的方法,將響應(成功,數據)編碼為 a bytes,然後通過帶有這些bytes的程序集還原,從而還原狀態更改。您現在可以從另一個函式呼叫此函式,擷取此錯誤並處理結果。

Gnosis 為此編寫了實用程序:https ://github.com/gnosis/util-contracts/blob/main/contracts/storage/StorageAccessible.sol

希望一旦 Solidity 允許擷取自定義錯誤,這可以簡化。到目前為止,您需要組裝才能做到這一點而不會浪費太多氣體。

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