Oracle (oraclize.it) mit Truffle und Testrpc

Wie ich in der Blockchain verstanden habe, ist es "nicht" möglich, mit Webservices außerhalb der Blockchain zu interagieren. Dies muss über Orakel erfolgen, um zu verifizieren, dass die Anfrage sicher ist, und die Statusänderung kann in der Blockchain durchgeführt werden. Bitte korrigiert mich, wenn ich falsch liege.

Ich arbeite derzeit mit Testrpc, Truffle und React, um meinen Smart Contract zu testen. Nun möchte ich oraclize.it in meine Umgebung integrieren. Was ist der beste Weg, dies zu tun?

Ich habe versucht, die Testbeispiele in meinen Vertragsordner zu kopieren, aber im Vertrag gibt es diesen Verweis:

import "github.com/oraclize/ethereum-api/oraclizeAPI.sol";

Wie kann ich diesen Verweis in meine Ordnerstruktur integrieren?

Ich habe versucht, folgende Dateien in meinen Vertragsordner zu kopieren:

https://github.com/oraclize/ethereum-api/

Aber ich habe ein paar Fehler.

Was ist der beste Weg, Oraclize mit Truffle und Testrpc/Ganache zu implementieren?

Antworten (2)

Es ist sehr gut möglich, den Oraclize-Dienst mit testrpc neben Truffle zu nutzen.

Zunächst müssen Sie die Namenskonvention für Vertragsdateinamen in Trüffel befolgen. Laut ihren Dokumenten:

Truffle erwartet, dass Ihre Vertragsdateien Verträge definieren, die genau mit ihren Dateinamen übereinstimmen

Daher sollten Sie die Oraclize-API aus dem Oraclize-Github-Repo herunterladen, hier ist ein spezieller Link zur Datei oraclizeAPI_0.4.sol . Laden Sie diese in den Truffle Contracts-Ordner Ihres Arbeitsverzeichnisses herunter und benennen Sie die Datei in usingOraclize.sol. Dies ist erforderlich, damit Truffle zum Zeitpunkt der Kompilierung weiß, welcher spezifische Vertrag aus der Datei kompiliert werden muss. Die andere Alternative besteht darin, die gesamte API direkt in den erforderlichen Vertrag einzufügen, aber das Hinzufügen und Umbenennen der API selbst ist wahrscheinlich die eleganteste Lösung, die mir im Moment bekannt ist.

Jetzt können Sie die API in Ihre anderen Verträge in diesem Ordner importieren, indem Sie import "usingOraclize.sol"sie am Anfang einfügen und dann ihre Vererbung für den richtigen Vertrag darin angeben, vorausgesetzt, der Name des Beispielvertrags, in dem Sie die API benötigen, heißt myContract, die Vererbungsmethode sollte aussehen

contract myContract is usingOraclize {
    // your code
}

Der nächste Schritt besteht darin, Ihre private testrpc-Kette in die Lage zu versetzen, mit dem Oraclize-Dienst zu kommunizieren, sodass sie Anfragen senden und die Ergebnisse zurückerhalten kann. Dazu benötigen Sie die Ethereum-Bridge . Git klonen Sie dieses Repository irgendwo in einen separaten Ordner. Was die Brücke tun wird, ist, wie der Name schon sagt, eine Brücke für Sie zwischen dem Oraclize-Dienst und Ihrer Blockchain einzurichten, während sie läuft.

Sobald die Ethereum-Bridge ordnungsgemäß eingerichtet ist, sollte testrpc so konfiguriert werden, dass sie einen statischen Satz von Adressen verwendet, da die Bridge von einer bestimmten Adresse abhängig ist, um ihre erforderlichen Verträge in Ihrer privaten testrpc-Kette bereitzustellen, also wenn Sie möchten, dass diese Adressen verwendet werden Bleiben Sie zwischen testrpc-Läufen konstant, sollten Sie testrpc mit einigen wiederverwendbaren Adressen ausführen. Sie können dies tun, indem Sie --mnemonicbeim Start das Flag hinzufügen und beim Neustart von testrpc dieselbe mnemonische Phrase verwenden, um sicherzustellen, dass dasselbe Oraclize OAR (OraclizeAddressResolver) generiert wird, das Sie im nächsten Schritt verwenden müssen.

Jetzt müssen wir das OAR herausfinden, das von der Brücke generiert wird.

  1. Starten Sie testrpc mit einer bestimmten mnemonischen Phrase und notieren Sie sich den Index des letzten verfügbaren Kontos (Sie können dafür jedes verwenden, aber ich empfehle das letzte, da es ein Konto ist, das nicht in Tests verwendet werden sollte, auch make sicher genug andere Konten generiert wurden, damit Sie Tests durchführen können). Hier ist ein Beispiel für einen Startparameter:

testrpc --mnemonic "my test example" --accounts 50

Da 50 Konten generiert werden, ist der Index der letzten Adresse 49.

  1. Führen Sie die eth-bridge aus und rufen Sie das OAR ab, das mit dieser testrpc-Kette generiert wird. Ich gehe davon aus, dass testrpc auf dem Standard-RPC-Host: Port von localhost: 8545 ausgeführt wird. Andernfalls benötigen Sie zusätzliche Parameter. Gehen Sie in das Stammverzeichnis, in dem sich ethereum-bridge befindet, und führen Sie den folgenden Befehl in einem Terminal aus.

node bridge -a 49

Der folgende Teil von Schritt 2 muss nur bei Ihrem ersten Lauf durchgeführt werden

Warten Sie nun, bis Sie die Zeile sehen:

Please add this line to your contract constructor:

OAR = OraclizeAddrResolverI(0x145437eac36aeacee0c135c9015fff316ba938ed);

Ihre Adresse sollte natürlich anders sein, da Sie eine andere mnemonische Phrase verwenden würden. Fügen Sie diese spezifische Zeile direkt am Anfang Ihres myContractKonstruktors hinzu, sodass sie so aussieht:

contract myContract is usingOraclize {
    function myContract() {
        OAR = OraclizeAddrResolverI(0x145437eac36aeacee0c135c9015fff316ba938ed);
        // rest of your constructor code
    }
    // your code
}
  1. Jetzt können Sie mit der Kompilierung von Truffle beginnen und alle erforderlichen Tests durchführen. Stellen Sie nur sicher, dass Sie die Schritte 1 und 2 immer mit denselben Parametern ausführen, und Sie müssen das OAR nicht innerhalb der Verträge ändern! (Denken Sie daran, die OAR-Variable vor der Produktion aus Ihrem Konstruktor zu entfernen, dies dient nur zu Testzwecken, in der Produktion wird es automatisch das OAR abrufen, abhängig von der Kette, in der Sie es ausführen, derzeit die Mainnet-, Ropsten- und Browser-Solidity-VM-Umgebung sind unterstützt.)
Darüber hinaus, sobald dies alles in Betrieb ist; Um eine Abfrage ohne eine ungültige Sprungausnahme (Throw) erfolgreich abzuschließen, muss der Vertrag, der die Orakelanforderung ausführt, einen ausreichenden positiven Ether-Saldo aufweisen. Dies ist sogar auf Testnetzen eine Voraussetzung, da die Ethereum-Brücke dies als Produktionsumgebung emuliert und daher erwartet, dass genügend Ether für die Rückrufadresse vorhanden ist, um den Rückruf tatsächlich abzudecken, sobald die Abfrage eintrifft!
Jedes Mal, wenn ich starte node -a 49, erhalte ich eine andere Adresse für das OAR, die ich in meinen Konstruktor einfügen kann. Wie kann ich auch Abfragen testen, die in Zukunft ausgeführt werden
Wenn Sie die neueste Ethereum-Bridge-Version verwenden, sollte es eigentlich immer das gleiche konstante OAR sein, auch ohne eine konstante mnemonische Phrase, die für testrpc verwendet wird. Beachten Sie, wenn Sie die Ethereum-Brücke aus irgendeinem Grund neu starten, sollten Sie testrpc parallel dazu neu starten oder sie auf einen sauberen Snapshot zurücksetzen.
HINWEIS : Es ist eine gute Idee, die Bridge mit dem --devFlag auszuführen, wenn Sie testrpc verwenden, wodurch der myid was triggered, but it was already seen before, skipping event...Fehler umgangen wird, im Fall von wiedergegebenen Protokollen, was bei einer testrpc-Instanz mit Snapshots usw. passieren kann ...
@DenisM muss ich die Ethereum-Bridge-Knotenanwendung am Laufen halten, nachdem der OAR-Vertrag in meinem Netzwerk bereitgestellt wurde?

Diese Anweisungen scheinen zu funktionieren (das Bridge-Skript läuft einwandfrei), aber wenn ich tatsächlich einen Anruf tätige, erhalte ich die Fehlermeldung „Schlüssel nicht in der Datenbank gefunden“.

Dieser Fehler war ein Nebeneffekt der testrpc/ganache-Reversion und wurde hier beantwortet: ethereum.stackexchange.com/a/42868/5819