Contract-Invocation

使用實例與介面訪問合約

  • April 7, 2022

假設我已經部署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);
   }
}

您看不到差異,因為您在部署時位於同一個文件中。

如果您已將其分成兩個文件contractAB部署了 contractA 並嘗試updateX使用實例從合約 B 呼叫函式,那麼您的程式碼會出錯。但是,界面選項可以正常工作。無權訪問程式碼時使用介面(需要函式簽名和合約地址)。否則,您需要復製contractA到您的契約 B.

在某種程度上,介面為您帶來了功能而不增加複雜性(您不需要複製功能)。

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