Cómo implementar una aplicación Ethereum compleja dividida en múltiples contratos

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í?

Lo que hago es crear un contrato como "retransmisión" a otros. Allí mantiene todas las direcciones de otros contratos y cuando implementa un contrato nuevo/modificado, simplemente cambia la dirección del mismo en retransmisión. Luego, desde allí, llama funciones a contratos relacionados para establecer una nueva dirección.
Despliégalos uno por uno. Si el contrato X requiere la dirección del contrato Y en la construcción, implemente primero el contrato Y y use su dirección cuando implemente el contrato X.
El problema de esto es que hace que sea más difícil/engorroso para otros verificar que un determinado código fuente coincida con una dApp en particular. Además, ¿cómo se podría automatizar este proceso? ¿Migraciones de trufas?

Respuestas (2)

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 initializefunción y llama setRelayjusto 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