Contract-Invocation
使用實例與介面訪問合約
假設我已經部署
ContractA
並想要呼叫該函式updateX
。我可以使用創建一個實例ContractA
或者我可以使用一個介面。當你使用哪一個?兩者都updateXFromB
工作updateXFromBUsingInterface
得很好……pragma solidity ^0.8.0; interface IContract { function updateX(uint _x) external; } contract ContractA{ uint public x; function updateX(uint _x) public { x = _x; } } contract B { function updateXFromB(address _A, uint _x) public { ContractA c = ContractA(_A); c.updateX(_x); } function updateXFromBUsingInterface(address _A, uint _x) public { IContract(_A).updateX(_x); } }
您看不到差異,因為您在部署時位於同一個文件中。
如果您已將其分成兩個文件
contractA
並B
部署了 contractA 並嘗試updateX
使用實例從合約 B 呼叫函式,那麼您的程式碼會出錯。但是,界面選項可以正常工作。無權訪問程式碼時使用介面(需要函式簽名和合約地址)。否則,您需要復製contractA
到您的契約 B.在某種程度上,介面為您帶來了功能而不增加複雜性(您不需要複製功能)。