Oraclize + Testrpc + Trüffel. Die Ergebnisse werden im Vertrag nicht aktualisiert

In meinem Vertrag mache ich nur eine einfache Abfrage an WolframAlpha

 function testOracle(){
       oraclize_query("WolframAlpha", "random number between 0 and 100");}

Ich habe auch die __callback-Funktion:

 function __callback(bytes32 myid, uint256 result) {
    if (msg.sender != oraclize_cbAddress()) {throw;}
    randomNum = result;

Ich habe auch mein localhost OAR gewonnen

 OAR = OraclizeAddrResolverI(.......);

Wenn ich das mache:

 testrpc
 node bridge
 truffle migrate --reset

Ich bekomme die Ergebnisse der Orakelabfrage in der Bridge-Konsole:

{"myid":"..................",
"result":"12","proof":null}

Aber immer wenn ich in der Truffle-Konsole bin und mache: (randomNum is public)

 var contract = contract.deployed()
 contract.randomNum.call()

Ich bekomme 0 als Ergebnis, obwohl ich weiß, dass das Ergebnis 12 in der Bridge-Konsole ist, wie ich es gesehen habe. Wie kann ich die Ergebnisse aus dem Vertrag mit Truffle abrufen?

Antworten (1)

Marco von Oraclize hier. Es gibt einen Fehler in der Deklaration der __callback-Funktion. Der richtige Weg ist folgender:

function __callback(bytes32 myid, string result) {
  if (msg.sender != oraclize_cbAddress()) {throw;}
    randomNum = parseInt(result);

Ich habe auch angegeben, wie Sie den String in int parsen können, was eine Funktion ist, die bereits in oraclizeApi.sol enthalten ist.

Wenn Sie eine detailliertere technische Erklärung wünschen, können Sie weiterlesen :)

Wenn Sie eine Transaktion an einen Vertrag senden, um mit einer Funktion zu interagieren, werden die Funktionsargumente codiert und als Daten im Transaktionsdatenfeld gesendet. Aber vorher müssen Sie die Funktion angeben, die Sie verwenden werden, und das geschieht, indem Sie der Funktionssignatur, auch bekannt als Methoden-ID, voranstellen. Die Funktionssignatur besteht aus den hexadezimal codierten ersten 4 Bytes des Keccak-256-Hashes des Funktionsnamens und der Liste seiner Argumenttypen. Das Ändern eines Argumenttyps führt zu einer anderen Funktionssignatur.

Sie können hier mehr darüber lesen: https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI