¿Cómo hacer referencia a un contrato de monedas que ya está en la cadena?

En este tutorial: https://dappsforbeginners.wordpress.com/tutorials/interactions- between-contracts/

hablan de interacciones entre contratos. Sin embargo, el contrato de metacoin parece estar en el mismo archivo de origen que el contrato al que hace referencia. ¿Qué sucede si quisiera hacer referencia a un contrato que ya se implementó? ¿Cuál sería el identificador?

si tenemos

contract caller{
    metaCoin m = metaCoin(   ...address... )
}

entonces esto dará un error de compilación, ya que se desconoce el tipo metaCoin. ¿Cómo hago esto? es decir, contratos de referencia ya en cadena

Respuestas (1)

Cuando se usa coinCaller, toma como parámetro coinContractAddress, que es la dirección del contrato metaCoin que ya se ha implementado. Por lo tanto, su contrato de coinCaller no necesita esa información cuando lo compila; Todo lo que necesita son las firmas de función de cualquier método en ese contrato que va a llamar.

La forma limpia de hacer esto si sabe a qué contrato llamará es mantener todo junto e "importar" los otros contratos que está utilizando. No importa si ya se ha implementado; siempre que las firmas de funciones del contrato que incluya sean las mismas que las firmas de funciones del contrato que ya se implementó, funcionará.

Si incluir el código fuente original no es práctico, una forma fácil de evitarlo es simplemente hacer un contrato de código auxiliar sobre su propio contrato que contenga la firma de la función a la que desea llamar. Entonces, si su contrato se ve así:

contract coinCaller{
    function sendCoin(address coinContractAddress, address receiver, uint amount){
        metaCoin m = metaCoin(coinContractAddress);
        m.sendToken(receiver, amount);
    }
}

...necesita el constructor (que está ahí automáticamente ya que en este caso no toma ningún argumento) y el método sendToken. Así que simplemente agregue esto en la parte superior de su archivo de solidez:

contract metaCoin { 
    function sendToken(address receiver, uint amount) returns(bool successful){
        // Nothing goes here, just leave it empty
    }
}