Si desarrolla una dApp compleja y tiene que dividirla en contratos individuales separados debido al límite de gas de implementación, ¿cuál es un proceso/patrón limpio para implementar y vincular los contratos individuales entre sí?
Bien, así es como lo hago.
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;
}
}
Y luego llama OtherContract.setRelay(relayAddress)
desde su cuenta de propietario o la envuelve en initialize
función y llama setRelay
justo después de que se establece la nueva dirección de Contrato.
EDITAR : también use interfaces/clases abstractas al acceder al contrato desde otro contrato, le ahorrará gasolina y permitirá que se coloque más código en un solo contrato.
Si importa un contrato a otro, el código de bytes se adjunta al final. Esto conduce a archivos/códigos de bytes muy grandes si importa varios contratos. Lo que hago es implementar una interfaz para cada contrato y luego simplemente importar esto. Luego codifico la dirección de los contratos correspondientes en el contrato que los implementa. Esto asegura que no haya forma de alterar el diseño.
por ejemplo: (pseudocódigo)
mycontract1.sol
implements Imycontract2.sol
{
Imycontract(address).callFunction()
}
donde Imycontract2.sol es solo un maniquí con implementaciones vacías de las funciones de mycontract2.sol
maxpeinas
buena vibración
matthias_buehlmann