Доступ к контракту по адресу, не зная реализации

Я хочу получить доступ к развернутому контракту и взаимодействовать с ним. Мое ограничение: Знание API (функций, полей), но не реализации.

Я просматривал документацию Ethereum «Доступ к контрактам и транзакциям» ( http://ethdocs.org/en/latest/contracts-and-transactions/accessing-contracts-and-transactions.html ).

У них есть этот 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"})

Однако для этого требуется знать реализацию контракта, что для меня не имеет смысла.

Спасибо за любую помощь.

Ответы (1)

Все, что вам нужно, это адрес контракта и JSON-представление двоичного интерфейса приложения.

Чтобы получить АБИ:

> 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"
}]

Итак, не зная реализации, а только адрес и ABI, вы сможете выполнить следующую команду:

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"})