Contract-Design

如何部署合約及其抽象/介面?

  • January 14, 2022

假設我有一份契約 A:

pragma solidity ^0.4.4;
contract A{
 struct St{
   uint val;
 }
 function double(uint a)external returns (uint res){
 res= 2*a;
 }
}

讓我們呼叫上面的程式碼塊 1行。

我部署了合約 A。然後我有一個合約 B 想要呼叫合約 A 的函式:

pragma solidity ^0.4.4;
contract B{
  uint res;
  function call_double(uint val) {
  A a=A(0x1);// 0x1 is the address of contract A after it's deployed.
  res = a.double(val);
  }
}
// how to include this contract abstract when deploying contract B?
contract A{
   function double(uint a)external returns (uint res);
   struct St{
   uint val;
  }
}

讓我們呼叫上面的程式碼塊 2行。


問題:我在部署合約 B 時如何包含合約 A?換句話說,我該如何部署block2?

請注意,當我使用 remix 時(在部署契約 A 之後),我將契約 B 和契約 A 的摘要放在一頁中並部署 B,一切正常。但是我不清楚當我使用 web3 手動部署到私有區塊鏈時它是如何完成的。此外,當我想與合約 B 互動時,我還不清楚我需要哪個 ABI。

您可以在合約 B 中創建合約 A 的實例,然後將該實例指向合約 A 的地址。

部署合約 A:

contract A{
 struct St{
   uint val;
 }
 function double(uint a)external returns (uint res){
 res= 2*a;
 }
}

現在在創建合約 B 的時候,你可以傳入合約 A 的地址。B 的建構子會初始化 A 的實例:

contract A{
    function double(uint a)external returns (uint res);
    struct St{
    uint val;
   }
}

contract B{
   uint res;
   A objOfA;
   function B(address _addressOfContractA){
     objOfA = A(_addressOfContractA);
   }
   function call_double(uint val) {
     res = objOfA.double(val);
   }
}

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