Solidity
如何處理庫函式原型更改?
使用庫的一大好處是庫程式碼可以修改,只要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)
, toupdateABI
,您可以更改函式的名稱。通過創建多個updateABI
函式,每個函式都採用不同類型的參數,您可以根據需要創建任意數量的函式名稱和參數組合。請注意,這
address.call
相當於向地址發送交易,並允許狀態更改,而callcode
相當於呼叫庫函式,程式碼在原始合約的環境中執行。
call
從和的返回值callcode
是布爾值,呼叫成功或呼叫失敗。不可能從中返回值,call
因為這需要合約事先知道返回類型。您也許可以通過callcode
這種方式將儲存指針傳遞給並檢索數據,但我需要進行一些測試。