Der Smartcontract-Funktionsaufruf wird nicht in Dapp ausgeführt, das mit dem „Truffle“-Framework entwickelt wurde

Ich entwickle eine Dapp mit 'testrpc' und 'truffle'. Ich habe auch Ethereum-Bridge für Oraclize verwendet. Ich habe eine intelligente Vertragsfunktion geschrieben, die eine URL mit 'OraclizeQuery' aufruft. Ich habe den Code in der Datei app.js hinzugefügt , aber die Abfrage wird nicht ausgeführt. Ich habe versucht, die Funktionen mit der Truffle-Konsole auszuführen, und es hat gut funktioniert.
Das Folgende ist der Vertragscode:-

pragma solidity ^0.4.0;

import "./usingOraclize.sol";

contract WeatherApiCall is usingOraclize {

   string public weathercondition;
   function WeatherApiCall() {

           OAR = OraclizeAddrResolverI(0x3df0db5bda9d685e41cb4a8834c44f8028957417);
   }

   function __callback(bytes32 myid, string result) {
           if (msg.sender != oraclize_cbAddress()) throw;
           weathercondition=result;
   }
   function update(string to,string datetime) payable returns(bool sufficient) {
          oraclize_query("URL", strConcat("json(http://api.openweathermap.org/data/2.5/forecast?q='", to ,"'&mode=json&APPID=d2e8279188c8649c17540f798c9cc972).list[?(@.dt_txt='", datetime, "')].weather[0].main"));
          return true;
   } 
}

Das Folgende ist die index.html-Datei:-

<!DOCTYPE html>
<html>
<head>
     <title>Sample Truffle App</title>
     <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700' rel='stylesheet' type='text/css'>
     <link href="./app.css" rel='stylesheet' type='text/css'>
     <script src="./app.js"></script>
  </head>
 <body>
     <h1>Airline</h1>
     <h2>Example Truffle Dapp</h2>
     <br>
     <h1>FORM</h1>
                <br><label for="from">From:</label><input type="text" id="from" placeholder="--Residing Place--"></input>
                <br><label for="to">To:</label><input type="text" id="to" placeholder="--Travelling Place--"></input>
                <br><label for="persons">No. of Persons:</label><input type="text" id="persons" placeholder="--No. of Persons--"></input>
                <br><label for="date">Travel Date:</label><input type="text" id="date" placeholder="--Date of travel yyyy-MM-dd--"></input>
                <br><label for="time">Destination Time:</label><input type="text" id="time" placeholder="--HH:mm:ss--"></input>
                <br><br><button id="send" onclick="sendRequest()">Generate Quote</button> 
                <br><br>
 </body>
 </html>

Das Folgende ist die app.js-Datei für den entsprechenden Smartcontract-Code:-

var accounts;
var account;
function sendRequest() {
    var weatherapicall = WeatherApiCall.deployed();
    var fromdata = document.getElementById("from").value;
    var to = document.getElementById("to").value;
    var persons = parseInt(document.getElementById("persons").value);
    var date = document.getElementById("date").value;
    var time = document.getElementById("time").value;
    //verifying at javascript console
    console.log(fromdata);
    console.log(to);
    console.log(persons);
    console.log(date);
    console.log(time);
    var timeperiod; 
    if ((time >= '00:00:00') && (time < '03:00:00')) {
            timeperiod = '00:00:00';
    } else if ((time >= '03:00:00') && (time < '06:00:00')) {
           timeperiod = '03:00:00';
    } else if ((time >= '06:00:00') && (time < '09:00:00')) {
           timeperiod = '06:00:00';[![enter image description here][1]][1]
    } else if ((time >= '09:00:00') && (time < '12:00:00')) {
           timeperiod = '09:00:00';
    } else if ((time >= '12:00:00') && (time < '15:00:00')) {
           timeperiod = '12:00:00';
    } else if ((time >= '15:00:00') && (time < '18:00:00')) {
           timeperiod = '15:00:00';
    } else if ((time >= '18:00:00') && (time < '21:00:00')) {
           timeperiod = '18:00:00';
    } else if ((time >= '21:00:00') && (time < '24:00:00')) {
           timeperiod = '21:00:00';
    }
    datetime = date + ' ' + timeperiod;
    console.log(datetime);  
    weatherapicall.update(to ,datetime, {from: account}).then(function(value) {
         console.log("Testing");
         console.log(value);
         console.log(value.valueOf());
   }).catch(function(e) {
           console.log(e); 
   });
  };
  window.onload = function() {
       web3.eth.getAccounts(function(err, accs) {
       if (err != null) {
           alert("There was an error fetching your accounts.");
           return;
       }
       if (accs.length == 0) {
            alert("Couldn't get any accounts! Make sure your Ethereum client is configured correctly.");
            return;
       }
       accounts = accs;
       account = accounts[0];
  });
}

Ich habe die Dapp geladen und die Eingaben bereitgestellt und die Werte korrekt in der Javascript-Konsole gedruckt. Aber der Aufruf zur Aktualisierungsfunktion wird nicht ausgeführt.Geben Sie hier die Bildbeschreibung ein

Antworten (1)

Ich kann nicht zu Ihrem Anwendungsfall sprechen, aber ich glaube, ich sehe einen fehlenden Schritt.

Diese alles entscheidende Zeile:

weatherapicall.update(to ,datetime, {from: account}).then(function(value) {

Sie erhalten einen Transaktions-Hash, der angibt, dass die Transaktion an die Blockchain übermittelt wurde. Wenn ich mich nicht irre, steht das im Konsolenprotokoll. Es enthält nicht das Ergebnis der Transaktion, da dieses Ergebnis nicht bekannt ist, bis die Transaktion abgebaut ist.

Sollte ungefähr so ​​aussehen:

weatherapicall.update(to ,datetime, {from: account}).then(function(txn) {
    console.log("transaction submited", txn);
    return getTransactionReceiptMined(txn); // wait for mined result
})
.then(function(receipt) {
    console.log("transaction mined", receipt);
    // explore the receipt to find your data, or return a call() to get it

Ich hatte viel Glück mit getTransactionReceiptMined() hier:

https://gist.github.com/xavierlepretre/88682e871f4ad07be4534ae560692ee6

Ich hoffe es hilft.

@ Rob Hitchens Ich habe meine app.js-Datei aktualisiert, aber sie gibt das Ergebnis von „transaction mined“ als „undefined“ zurück. Ich habe in meiner solidity-Funktion einen Aufruf an oraclize hinzugefügt. Er wird nicht ausgeführt (weil die Ethereum-Brücke keine Abfrageanforderung erhält). Ist dies nicht der Grund für "undefiniert"?
@criss Ich würde 'undefined' als 'weatherapicall.update()' interpretieren, das aus irgendeinem Grund einen JUMP oder Gas-out ausgelöst hat. Probleme mit der Bridge klingen nach einem Kandidaten für Probleme mit dem update(). :-) Was den Anruf danach angeht , sehe ich die Callback-Sets Weathercondition (String public). Wenn Ihre update()-Transaktion verifiziert (abgebaut) ist, sollte sie aktualisiert werden, und Sie können sie nach .then(function(receipt) { ...
Ich habe versucht, die Update-Funktion im Solidity-Vertrag mithilfe der Truffle-Konsole aufzurufen. "" contract.update('chennai','2017-02-08 18:00:00').then(console.log) "" Es hat den Transaktions-Hash zurückgegeben und ethereum-bridge gibt das Ergebnis korrekt für die gegebene Oraclize-Abfrage zurück .Aber der Update-Aufruf wird nicht über app.js ausgeführt.
@ Rob Hitchens Irgendeine Idee bezüglich des Problems???
Nichts Offensichtliches, und ich sehe nicht, dass Sie Dinge übersehen, die ich vorschlagen würde. Wenn ich die Handlung richtig verstehe, wird das ursprüngliche Problem angesprochen, aber dies hat ein weiteres Rätsel aufgedeckt. Frage, warum etwas in der Konsole funktioniert, aber nicht in der App (was ist der Unterschied?); könnte Kenntnisse über Oraclize/Ethereum-Bridge erfordern, um eine Art Versehen zu erkennen. Ich würde erwägen, eine neue Frage mit dem Code und ein Bild Ihrer Schritte in der Truffle-Konsole zu posten, um zu beweisen, dass die Seite wie erwartet funktioniert. Kann sogar einen Hinweis darauf geben, dass etwas in der App fehlt. Warum funktioniert A und B nicht? Ich bin neugierig!
Ok, ich werde eine neue Frage mit dem Code und den Bildern posten.