Abrufen von "Daten" für JSON RPC eth_call

Gibt es eine bequemere Möglichkeit, den Wert datafür einen eth_callJSON-RPC-API-Aufruf zu erstellen, als die "normale" Methode der ersten 4 Bytes web3.sha3der kanonischen Funktionssignatur, gefolgt von codierten und aufgefüllten Argumenten? Ich weiß, dass die web3-JavaScript- getDataMethode verwendet werden kann, aber wenn der Zugriff über web3 verfügbar ist, könnte man die Funktion genauso gut direkt aufrufen, anstatt nur die dataJSON-RPC-API abzurufen und zu verwenden. Angenommen, in einigen Situationen ist nur JSON-RPC-API-Zugriff verfügbar. Ist das Konstruieren datavon Hand für einen Vertragsfunktionsaufruf die einzige Option?

BEARBEITEN (21.06.2017): Mir ist aufgefallen, dass Browser-Solidity möglicherweise das datafor an eth_calloder eth_sendTransactionanzeigt, da es den kompilierten Vertrags-Bytecode und die Schnittstelle anzeigt. Das hätte man kopieren können. Ich habe jedoch überprüft und sehe nicht, dass das datafür einen Funktionsaufruf erforderliche angezeigt wird, wenn ich eine Funktion im rechten Bereich aufrufe.

BEARBEITUNG Nr. 2 (21.06.2017): Vielleicht war meine Frage nicht so klar wie oben gepostet. Ich werde versuchen, es anders auszudrücken. Angenommen, wir haben den folgenden Solidity-Vertrag (mit dem Namen simple) an einer Adresse bereitgestellt, z. B. at0xfbb5fa2ea8c5fc6f492c0795564352f262f49f50

pragma solidity ^0.4.9;

contract owned {
    address owner;
    function owned() {
        owner = msg.sender;
    }
    function getOwner() constant returns(address) {
        return owner;
    }
}

contract simple is owned {
    function twice(int a) constant returns(int) {
        return 2*a;
    }
}

Die Funktion twicekann web3.jswie folgt aus dem Javascript-Code aufgerufen werden:

var simple = eth.contract(<ABI>).at(0xfbb5fa2ea8c5fc6f492c0795564352f262f49f50);
var result = simple.twice(7);

Um diese Funktion jedoch mit JSON-RPC aufzurufen, muss eine HTTP-Post-Anforderung mit dem folgenden Text an den RPC-Port eines Knotens gesendet werden:

{
    "jsonrpc": "2.0",
    "method": "eth_call",
    "params": [
        {
            "from": "0xccf9d7d2f8be1f821cb8d9ec9553ffa92aa8fc4d",
            "to": "0xfbb5fa2ea8c5fc6f492c0795564352f262f49f50",
            "data": "0x6ffa1caa0000000000000000000000000000000000000000000000000000000000000007"
        },
        "latest"
    ],
    "id": 1
}

Der Wert von dataelement wird berechnet als die ersten 4 Bytes von { dem Keccak-Hash von [ der ASCII-Codierung von ( einer kanonischen Form der Funktionssignatur ) ] } gefolgt von den Argumenten, die auf eine bestimmte Weise codiert sind, wie unter https://github angegeben .com/ethereum/wiki/wiki/Ethereum-Contract-ABI . HINWEIS: 3 Arten von Klammern hinzugefügt, um Mehrdeutigkeiten zu beseitigen :-) (Dies ist eine sehr einfache Funktion mit nur 1 int-Argument, aber dies kann bei komplexeren Argumenten schnell sehr unangenehm und fehleranfällig werden.

Es gibt eine Möglichkeit, den entsprechenden Wert datafür einen Funktionsaufruf mithilfe einer web3.jsFunktion wie folgt zu erhalten:

var callData = simple.twice.getData(7);

Angenommen, die Funktion soll von einem Remote-Computer aufgerufen werden und Javascript ist keine Option. Gibt es eine bequeme Möglichkeit (dh nicht manuell gemäß den komplexen Regeln im oben verlinkten Wiki), den korrekten Wert des dataElements der JSON-RPC-API-Anforderung zu berechnen?

Vielleicht könnte solc diese Funktionalität unterstützen, wobei die Funktionssignatur und die Argumentwerte in einer Datei im JSON-Format angegeben sind.
Ich habe dies als Erweiterung vorgeschlagen, solcaber jede andere Möglichkeit, diese Funktionalität in einem lokal ausgeführten Tool bereitzustellen, ist gut für mich. github.com/ethereum/ethereumj/issues/904

Antworten (2)

Ich habe genau das Tool gefunden, nach dem ich gesucht habe - Ethabi von Parity.

https://github.com/paritytech/ethabi

Ich habe jedoch überprüft und sehe nicht, dass die für einen Funktionsaufruf erforderlichen Daten angezeigt werden, wenn ich eine Funktion im rechten Bereich aufrufe.

Entfernen Sie einfach die constantDeklaration in Ihrer Funktion, die nur Daten zurückgibt, und führen Sie eine Scheintransaktion mit Browsersolidity durch. Im Bytecode finden Sie die Funktionssignatur, die Sie leider genau so verwenden müssen, wie Sie es beschrieben haben. Es gab zwar eine Web3-Funktion zum Reeding von Speicher direkt aus einem Vertrag, soweit ich mich erinnern kann, aber das erschien mir komplizierter als die von Ihnen beschriebene Oldschool-Methode.

Vielleicht haben Sie meine Frage falsch verstanden, vielleicht den Teil darüber, was ich mit dem Begriff meine data. Ich habe versucht, es in EDIT #2 klarer zu machen. Außerdem habe ich die Funktionssignatur nicht gefunden, nachdem ich die constantDeklaration aus einer Funktion entfernt hatte, die nur Daten zurückgibt und sie in Browser-Solidity aufruft.
"Gibt es eine bequeme Möglichkeit, den korrekten Wert des Datenelements der JSON-RPC-API-Anforderung zu berechnen?" Was genau meinst du hier mit "rechnen"? Sie haben beschrieben, wie die Funktionssignatur korrekt berechnet wird, und die Verwendung dieser Algorithmen in Javascript ist die bequemste Methode - natürlich hält Sie nichts davon ab, dies in verschiedenen Sprachen zu versuchen..?
Mit "berechnen" meine ich "ableiten" oder "erhalten". Ja, es kann einfach mit Javascript gemacht werden, aber dazu muss zumindest ein Code geschrieben und ein Knoten ausgeführt oder eine Remote-Verbindung mit einem Knoten hergestellt werden. Ich dachte, es gäbe ein Tool, um den dataWert lokal zu generieren. Schließlich hängt es nur von der Funktionssignatur und den Argumenttypen und -werten ab. Keines davon erfordert eine Verbindung zu einem Knoten.
Vielleicht sollte ich versuchen, selbst ein solches Tool zu schreiben. :-)
Oder vielleicht könnte solc diese Funktionalität unterstützen, wobei die Funktionssignatur und die Argumentwerte in einer Datei im JSON-Format angegeben sind.