Solidity

如何部署複雜的乙太坊應用程序拆分為多個合約

  • February 20, 2019

如果您開發一個複雜的 dApp 並且由於部署氣體限製而必須將其拆分為單獨的單獨合約,那麼將單獨的合約部署和連結在一起的干淨流程/模式是什麼?

好的,這就是我的做法。

Relay.sol:

contract Relay {

   IOtherContract private otherContractInterface;

   modifier onlyOwner() {
     require(msg.sender == owner, "Sender is not owner");
     _;
   }

   function initialize(address _otherContractAddress) external onlyOwner {

       otherContractInterface = IOtherContract(_otherContractAddress);
   }
}

OtherContract.sol:

contract OtherContract {


 address relay;

 modifier onlyRelay() {
     require(msg.sender == relay, "Sender is not relay.");
     _;
 }

 function setRelay(address _relay) external onlyOwner {
     relay = _relay;
 }
}

然後您OtherContract.setRelay(relayAddress)從您的所有者帳戶呼叫或將其包裝在initialize函式中並setRelay在設置 newContract 地址後立即呼叫。

編輯:從其他合約訪問合約時也使用介面/抽像類,它會節省你的氣體並允許將更多程式碼放入單個合約中。

如果您將一份合約導入另一份合約,則字節碼只是附在最後。如果您導入多個契約,這會導致非常大的文件/字節碼。我所做的是為每個合約實現一個介面,然後導入它。然後我將相應合約的地址硬編碼到實現它們的合約中。這確保了無法篡改設計。

例如:(虛擬碼)

mycontract1.sol
implements Imycontract2.sol
{

 Imycontract(address).callFunction()
}

其中 Imycontract2.sol 只是一個假人,mycontract2.sol 的功能實現為空

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