Solidity

如何處理庫函式原型更改?

  • April 26, 2016

使用庫的一大好處是庫程式碼可以修改,只要api函式原型不變,我們只需要指向更新庫的新地址即可。

如果我們需要添加一個新函式,或者改變一個庫的函式原型,會發生什麼?由於簽名需要在主契約中聲明,有沒有更新這些的技巧?

無法更改 ABI,因為它是直接在原始碼中編譯的。但是,如果您不介意破壞合約的類型安全性,您可以手動呼叫函式。

例如,如果您的合約命名foo正在呼叫bar另一個合約的方法bazz,並且您擔心方法名稱會更改,則可以實現以下內容:

contract Foo {
   address bazz;
   string abiSignature;

   function Foo (address _bazz, string _abi) public {
       bazz = _bazz;
       abiSignature = _abi;
   }

   function updateABI (string _ABI) public {
       abiSignature = _ABI;
   }

   function callBazz(uint256 arg) public returns (bool bazzLib){
       bool bazzCall =  bazz.call(bytes4(sha3(abiSignature)), arg); //calls as a regular transaction
       bool bazzLib  = bazz.callcode(bytes4(sha3(abiSignature)), arg); //calls using "callcode" (like a library)
   }
}

通過傳入一個新字元串,例如bar(uint256), to updateABI,您可以更改函式的名稱。通過創建多個updateABI函式,每個函式都採用不同類型的參數,您可以根據需要創建任意數量的函式名稱和參數組合。

請注意,這address.call相當於向地址發送交易,並允許狀態更改,而callcode相當於呼叫庫函式,程式碼在原始合約的環境中執行。

call從和的返回值callcode是布爾值,呼叫成功或呼叫失敗。不可能從中返回值,call因為這需要合約事先知道返回類型。您也許可以通過callcode這種方式將儲存指針傳遞給並檢索數據,但我需要進行一些測試。

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