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?
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 --mnemonic
beim 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.
testrpc --mnemonic "my test example" --accounts 50
Da 50 Konten generiert werden, ist der Index der letzten Adresse 49.
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 myContract
Konstruktors hinzu, sodass sie so aussieht:
contract myContract is usingOraclize {
function myContract() {
OAR = OraclizeAddrResolverI(0x145437eac36aeacee0c135c9015fff316ba938ed);
// rest of your constructor code
}
// your code
}
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“.
DenisM
Daniel Köbe
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 werdenDenisM
DenisM
--dev
Flag auszuführen, wenn Sie testrpc verwenden, wodurch dermyid 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 ...amitKumar