Acceder a contrato por domicilio, sin conocer ejecución

Quiero acceder e interactuar con un contrato implementado. Mi restricción: Conocer la API (funciones, campos), pero no la implementación.

Estaba mirando la documentación de Ethereum "Acceso a contratos y transacciones" ( http://ethdocs.org/en/latest/contracts-and-transactions/accessing-contracts-and-transactions.html ).

Tienen este Web3.js

var source = 'contract Multiply7 { event Print(uint); function multiply(uint input) returns (uint) { Print(input * 7); return input * 7; } }';
var compiled = web3.eth.compile.solidity(source);
var Multiply7 = web3.eth.contract(compiled.Multiply7.info.abiDefinition);
var multi = Multiply7.at("0x0ab60714033847ad7f0677cc7514db48313976e2")
multi.multiply.sendTransaction(6, {from: "0xeb85a5557e5bdc18ee1934a89d8bb402398ee26a"})

Sin embargo, esto requiere saber la ejecución del contrato, lo que no tiene sentido para mí.

Gracias por cualquier ayuda.

Respuestas (1)

Todo lo que necesita es la dirección del contrato y la representación JSON de la interfaz binaria de la aplicación.

Para obtener el ABI:

> var source = 'contract Multiply7 { event Print(uint); function multiply(uint input) returns (uint) { Print(input * 7); return input * 7; } }';
undefined
> var compiled = web3.eth.compile.solidity(source);
undefined
> compiled.Multiply7.info.abiDefinition
[{
    constant: false,
    inputs: [{
        name: "input",
        type: "uint256"
    }],
    name: "multiply",
    outputs: [{
        name: "",
        type: "uint256"
    }],
    payable: false,
    type: "function"
}, {
    anonymous: false,
    inputs: [{
        indexed: false,
        name: "",
        type: "uint256"
    }],
    name: "Print",
    type: "event"
}]

Entonces, sin conocer la implementación pero solo la dirección y el ABI, debería poder ejecutar el siguiente comando:

var Multiply7 = web3.eth.contract([{constant: false, inputs: [{name: "input", type: "uint256"}], name: "multiply", outputs: [{name: "", type: "uint256"}], payable: false, type: "function"}, {anonymous: false, inputs: [{indexed: false, name: "", type: "uint256"}], name: "Print", type: "event"}]);
var multi = Multiply7.at("0x0ab60714033847ad7f0677cc7514db48313976e2")
multi.multiply.sendTransaction(6, {from: "0xeb85a5557e5bdc18ee1934a89d8bb402398ee26a"})