Contract-Design
如何部署合約及其抽象/介面?
假設我有一份契約 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); } }