Если вы разрабатываете сложное 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
Макспеинас
хорошая вибрация
matthias_buehlmann