Solidity

庫呼叫失敗取決於編譯器版本?

  • August 14, 2020

我正在嘗試部署我的庫,然後使用特定地址呼叫它。在測試這個時,我發現行為在編譯器的過程中發生了變化。

我嘗試遵循如何呼叫庫契約,但發生了以下不一致:

圖書館 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

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