Cómo acceder a Objetos de diferentes Contratos

Objetivo : Quiero crear un programa de solidez que incluya más de 3 contratos. Esto significa que tengo un contrato (llamémoslo maestro por ahora) que tiene como objetivo configurar todo. Esto significa que este contrato tiene una función que solicita direcciones de contratos que deben interactuar entre sí. El maestro almacena esta información de dirección y luego puede pasarla a otros contratos. Tendré más de 3 contratos que obtienen esta "información de contacto" del contrato maestro y luego esos 3+ comienzan a interactuar entre sí (cambiando otras variables, llamando a funciones de otros contratos)

Ejemplo : el contrato tiene una función de configuración que solicita las direcciones de los contratos A y B. Almacena esas direcciones y llama a la función 1 del contrato A. Ahora, la función 1 del contrato A hace algunas cosas, luego busca la dirección del contrato B (esto es donde lucho) y llama a la Función 2 que pertenece al Contrato B.

Pregunta : ¿Puede alguien ayudarme con esta pregunta y darme un código de ejemplo? Ya intenté pasar una estructura con las direcciones del maestro a A y B, intenté almacenarlas en un mapeo e intenté hacer que los datos de mis contratos maestros fueran accesibles para A y B a través de la herencia.

Si tiene algún problema para entender esta pregunta, no dude en preguntar ;)

Respuestas (2)

Debido a limitaciones de tiempo, puedo responder indirectamente con un patrón (con suerte) claro.

pragma solidity ^0.4.11;

contract A {

    function talkToMe() public constant returns(bool success) {
        return true;
    }
}

contract B {

    A a; // contract "A" called "a"

    event LogResponse(bool whatItSaid);

    function B() {
        a = new A(); // deploy B and it will make it's own A and note the address
    }

    function prove() public returns(bool success) {
        bool response = a.talkToMe();
        LogResponse(response);
        return response;
    }

    function newA(address addressA) public returns(bool success) {
        a = A(addressA); // start using previously deployed A 
        return true;
    }
}

Aquí está Remix para mostrar su funcionamiento.

  1. Implementar B
  2. prove()

ingrese la descripción de la imagen aquí

Esta respuesta aborda algunas preocupaciones más, como realizar un seguimiento de los contratos generados por la "fábrica". ¿Existe un patrón de fábrica de contrato simple?

Espero eso ayude.

Gracias por tu rápida respuesta. Sé que el patrón que me diste está funcionando porque es básicamente lo que ya tengo :) Supongo que no estaba claro en ese sentido, ¡eso es lo que me pasa! Intentaré insertar una imagen de mi código para mostrar lo que estoy tratando de lograr.

ingrese la descripción de la imagen aquí

Arriba puedes ver mi Código. ¡Utiliza el patrón que ya me has mostrado y funciona bien! Todos los contratos pueden interactuar. Ahora quiero limpiar esto un poco. Resalté las cosas que quiero cambiar en amarillo.

Para mi, sería genial extraer todas las "cosas amarillas" del contrato 'ObjA' para ponerlas en el contrato 'masterObj'. Así que me gusta crear algo como una matriz/mapa donde pongo todos los contratos (digamos 'a' que luego se refiere al contrato concreto de ObjA) y luego, si interactúo con algún contrato, solo paso esta matriz/mapa y luego puede leer la dirección del contrato de todos los demás contratos de esta matriz/mapeo.

Básicamente, solo quiero tener "cálculos" en los contratos de la A a la Z y todo lo demás que sea administración en el contrato masterObj. ¿Tiene alguna idea de cómo darse cuenta de esto? Espero que mi pregunta se aclare ahora :) ¡Y muchas gracias por su tiempo!