Solidity
庫呼叫失敗取決於編譯器版本?
我正在嘗試部署我的庫,然後使用特定地址呼叫它。在測試這個時,我發現行為在編譯器的過程中發生了變化。
我嘗試遵循如何呼叫庫契約,但發生了以下不一致:
圖書館 1
pragma solidity 0.7.0; library Seven { function seven() public returns (bool) { return true; } }
圖書館 2
pragma solidity 0.4.6; library Foursix { function foursix() public returns (bool) { return true; } }
主契約
pragma solidity 0.7.0; abstract contract Foursix { function foursix() virtual public returns (bool); } abstract contract Seven { function seven() virtual public returns (bool); } contract Foo { function callfoursix(address a) public { Foursix fs = Foursix(a); bool b = fs.foursix(); } function callseven(address a) public { Seven s = Seven(a); bool b = s.seven(); } }
注意除了使用的編譯器之外,庫 1 和 2 是如何相同的。在混音庫 1 中進行測試時出現錯誤:
處理到 Foo.callseven 錯誤:VM 錯誤:還原。
而對庫 2 的呼叫成功。
為什麼會這樣?如何呼叫 Library 1 合約?似乎 ABI 編碼與它有關,因為似乎找不到較新的版本,但目前我一無所知。
事實證明,在solidity 0.5版本之後從外部呼叫時,必須將函式聲明為“視圖或純”。
https://solidity.readthedocs.io/en/develop/contracts.html#call-protection-for-libraries