Compilar contratos que se llamen entre sí

Tengo dos contratos, uno es Admin, otro es sujeto. Para simplificar las cosas, solo incluyo las funciones que se invocan en los contratos que se relacionan entre sí.

contract Subject {
  uint public count = 0;

  function increaseCount() returns newCount{
    count ++;
    newCount = count;
  }
}

El objeto del contrato tiene un contador que se puede aumentar mediante una llamada directa desde web3.jso desde el Mastercontrato.

contract Master {
  bool public isActive=false;
  uint public num=0;

  function changeState() returns bool newState{
    isActive = !isActive;
    newState = isActive;
  }

  function increaseSubjectCount(subjectAddr) returns uint newCount{
    SubjectContract subjectContract = SubjectContract(subjectAddr);
    newCount = ubjectAddr.increaseCount();
  }
}

por lo tanto, una transacción se dispara para Mastercontratar (una vez que se realiza, por supuesto) junto con una cantidad suficiente de gas. Esta función luego usa la función gas para llamar increaseCount()en el Subjectcontrato que devuelve el nuevo contador. Esto, a su vez, es devuelto por el Mastercontrato a través de web3.js. El problema al que me enfrento es que si uso la solidez del navegador para compilar el Mastercontrato, arroja un error que dice el parámetro SubjectContract indefinido. Si agrego ambos contratos y luego compilo el código, cuando uso

var myContract = web3.eth.contract(masterContract.abi);¿Esto no causará problemas si el código abi incluye el tema y el contrato maestro juntos, pero si no hago esto, el compilador arroja un montón de errores?

Otra cosa que he considerado es usar declaraciones de importación antes de la compilación, pero no estoy seguro de cómo implementarlas de manera segura. Por favor, ayuda chicos!

@Varun¿Cómo conseguiste el SubjectAddr? Tengo problemas para importar el contrato SubjectContract subjectContract = SubjectContract(subjectAddr);porque quiero que obtenga la dirección por sí mismo, como usar Subject.deplyed().addresso algo así.
Al compilar utilizando la solidez del navegador, debe colocar ambos contratos juntos. El navegador generará un código de bytes separado para que no tenga que preocuparse por eso. Aunque no entendí tu pregunta del todo. En cuanto a subjectAddr, es un parámetro que debes conocer de antemano y pasarlo como una expresión regular.
@VarunQuise decir eso porque tengo ambos contratos en el mismo *.sol archivo y tengo que obtener subjectAddrpara SubjectContract subjectContract = SubjectContract(subjectAddr);. Entonces, ¿hay un comando que pueda usar en Solidity para no tener que insertar la dirección del contrato en truffle o web3? algo como el.address
No que yo sepa. Verá en mi ejemplo, el punto de SubjectContract subjectContract = SubjectContract(subjectAddr);era hacer referencia a un contrato existente en una dirección conocida e inspeccionar sus valores. Entonces, si hay 100 contratos de este tipo implementados, quiero poder llamar a cada uno por separado e inspeccionar sus valores del Mastercontrato. Si no se insertara la dirección del contrato, anula el propósito de mi función. :)
¡Me parece bien! Pero sigo sintiendo que si tengo un solo archivo de solidez con múltiples contratos, deberían poder acceder a la información básica, como la addressde algún otro contrato en ese archivo.
No, puede acceder a él independientemente de si está en el mismo .solarchivo o no. De hecho, creo que no podrá acceder a la dirección de otro contrato si está en el mismo archivo que el contrato principal. Pruébelo utilizando la solidez del navegador o una red de prueba, porque estoy bastante seguro de que no podrá hacerlo. Avísame si puedes sin embargo.

Respuestas (1)

Lo que debe hacer es definir la interfaz del SubjectContractcontrato para que el Mastercontrato pueda compilarse.

Aquí está su Mastercontrato con la SubjectContractinterfaz, junto con algunos cambios menores:

pragma solidity ^0.4.2;

contract SubjectContract {
    function increaseCount() returns (uint newCount);
}

contract Master {
    bool public isActive=false;
    uint public num=0;

    function changeState() returns (bool newState) {
        isActive = !isActive;
        newState = isActive;
    }

    function increaseSubjectCount(address subjectAddr) returns (uint newCount) {
        SubjectContract subjectContract = SubjectContract(subjectAddr);
        newCount = subjectContract.increaseCount();
    }
}

Por separado, tendrá que implementar lo siguiente SubjectContractcon algunos cambios menores:

pragma solidity ^0.4.2;

contract SubjectContract {
    uint public count = 0;

    function increaseCount() returns (uint newCount) {
        count ++;
        newCount = count;
    }
}
De acuerdo, para compilar el contrato maestro, copiaría y pegaría lo que ha escrito en la solidez del navegador y lo compilaría. Pero ahora, cuando hago let myContract = web3.eth.contract(MasterContract.abi)y ejecuto esto, el código abi tiene la palabra contractusada dos veces, entonces, ¿cómo sabe web3js que quiero crear el contrato maestro y el contrato sujeto es solo una interfaz? ¿No habrá confusión con respecto a esto?
Consulte ethereum.stackexchange.com/questions/7488/… . Verá que hay una abiDefinition separada para TokenCreator y OwnedToken. De manera similar, tendrá ABI separados para los diferentes contratos.
Sí, cuando compilo en solc, obtengo una abi. Pero si tengo 3 contratos que son interdependientes entre sí, ¿coloco los tres juntos en la solidez del navegador y los compilo tres veces para obtener tres abi diferentes?