Solidity
如何部署複雜的乙太坊應用程序拆分為多個合約
如果您開發一個複雜的 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 的功能實現為空