Eth_call durch oraclize

Ich habe also einen Vertrag auf Ropsten bereitgestellt und versuche jetzt, mit einem JSON-RPC-Aufruf über Infura und Oraclize auf die öffentliche Variable zuzugreifen.

Hier ist mein Vertrag: contract test_contract { uint public last_a;

function double(uint a) public returns(uint) { 
  last_a = a;
  return 2*a;   
 }

 function getLastA() public constant returns(uint){
     return last_a;
 }

 function getMethod() public constant returns(bytes4){
     return bytes4(keccak256("getLastA())"));
 }
}

OK. Also bekomme ich die Methode getLastA mit der getMethod, fülle sie auf 32 auf, bekomme die Vertragsadresse auf Ropsten ... und jetzt ist dies mein Aufruf:

url post - json(https://ropsten.infura.io/).result
 params -  {"jsonrpc":"2.0","id":3,"method":"eth_call","params":[{"to":"0x76a83b371ab7232706eac16edf2b726f3a2dbe82","data":"4b9a1598000000000000000000000000000000000000000000000000000000000000000"], "latest"}

Sie können meine Oraclize-Abfrage hier sehen

Ich frage mich nur, ob ich etwas falsch mache oder ob dies überhaupt möglich ist. Der Wert, den es zurückgeben sollte, ist 17, wenn jemand anderes glaubt, eine Antwort zu haben.

Antworten (1)

Bei Ihrer HTTP-Anfrage sind einige Fehler aufgetreten:

  1. Der JSON wurde aufgrund einer fehlenden geschweiften Klammer und einer falsch platzierten eckigen Klammer falsch formatiert.
  2. Das dataFeld enthielt den falschen Funktionsselektor.
  3. Dem dataFeld fehlte die Führung 0x.
  4. Das dataFeld hatte die falsche Länge. Obwohl es nicht notwendig ist, mit Nullen aufzufüllen, können Sie dies tun, solange Sie die richtige Länge haben. Sie hatten eine ungerade Anzahl von Ziffern (71).

Hier ist eine gültige JSON-Nutzlast:

{
    "id": 3,
    "jsonrpc": "2.0",
    "method": "eth_call",
    "params": [
        {
            "data": "0xad3b80a8",
            "to": "0x76a83b371ab7232706eac16edf2b726f3a2dbe82"
        },
        "latest"
    ]
}

POSTDies ergibt https://ropsten.infura.ioa resultvon 0x0000000000000000000000000000000000000000000000000000000000000011(17 in Dezimalzahl).

Here's a working Oraclize query: http://app.oraclize.it/home/test_query#VVJMKFBPU1Qp:anNvbihodHRwczovL3JvcHN0ZW4uaW5mdXJhLmlvLykucmVzdWx0:IHsianNvbnJwYyI6IjIuMCIsImlkIjozLCJtZXRob2QiOiJldGhfY2FsbCIsInBhcmFtcyI6W3sidG8iOiIweDc2YTgzYjM3MWFiNzIzMjcwNmVhYzE2ZWRmMmI3MjZmM2EyZGJlODIiLCJkYXRhIjoiMHhhZDNiODBhOCJ9LCAibGF0ZXN0Il19 .

Aus Neugier, was ist der Grund dafür, Oraclize zu verwenden, anstatt nur den Vertrag direkt aufzurufen? Führen Sie eine kettenübergreifende Kommunikation zwischen Verträgen durch?

Wow ... du Rocker. Und gute Arbeit mit der Vermutung. Spielen Sie einfach mit Oraclize herum, um zwei Ketten zu überbrücken
Und nur aus Neugier, bekomme ich mit meiner 'getMethod' nicht den richtigen Funktionsselektor?
Habe das Problem gerade entdeckt. Sie haben eine zusätzliche Klammer in der Zeichenfolge, die Sie hashen. Übrigens, ich denke, Sie können einfach tun return this.getLastA.selector.
Zahlen ... und das ist ein viel einfacherer Weg. Danke für die Hilfe!