Zugangsvertrag nach Adresse, ohne Kenntnis der Umsetzung

Ich möchte auf einen bereitgestellten Vertrag zugreifen und mit ihm interagieren. Meine Einschränkung: Ich kenne die API (Funktionen, Felder), aber nicht die Implementierung.

Ich habe mir die Ethereum-Dokumentation "Zugriff auf Verträge und Transaktionen" angesehen ( http://ethdocs.org/en/latest/contracts-and-transactions/accessing-contracts-and-transactions.html ).

Sie haben diese 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"})

Dazu muss man aber die Vertragsdurchführung kennen, was für mich nicht nachvollziehbar ist.

Danke für jede Hilfe.

Antworten (1)

Sie benötigen lediglich die Vertragsadresse und die JSON-Darstellung des Application Binary Interface.

Um das ABI zu bekommen:

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

Ohne die Implementierung zu kennen, aber nur die Adresse und die ABI, sollten Sie in der Lage sein, den folgenden Befehl auszuführen:

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