Der Zugriff auf große Dateien und verschiedene externe dynamische Daten ist häufig ein sehr wichtiger Bestandteil einer dezentralen Anwendung. Gleichzeitig bietet Ethereum selbst keinen Mechanismus, um sich nach außen zu wenden - intelligente Verträge können nur innerhalb der Blockchain selbst gelesen und geschrieben werden. In diesem Artikel werden wir Oraclize betrachten, das es nur ermöglicht, mit der Außenwelt zu interagieren, indem fast alle Internetressourcen abgefragt werden. Ein verwandtes Thema ist IPFS, und erwähnen Sie es kurz.
IPFS
IPFS ist ein verteiltes Dateisystem mit Inhaltsadressierung. Dies bedeutet, dass für den Inhalt einer dort hinzugefügten Datei ein eindeutiger Hash berücksichtigt wird. Der gleiche Hash wird dann verwendet, um diesen Inhalt zu suchen und aus dem Netzwerk abzurufen.
Die grundlegenden Informationen wurden bereits in
diesem und mehreren anderen
Artikeln beschrieben, sodass wir keinen Grund sehen, sie zu wiederholen.
Warum IPFS in Verbindung mit Ethereum verwenden?
Das Speichern von Volumeninhalten in der Blockchain ist zu teuer und schädlich für das Netzwerk. Daher ist es am besten, eine Art Link zu der Datei zu speichern, die sich im Off-Chain-Speicher befindet, nicht unbedingt IPFS. IPFS bietet jedoch eine Reihe von Vorteilen:
- Ein Dateilink ist ein Hash, der für den spezifischen Inhalt der Datei eindeutig ist. Wenn wir diesen Hash also in die Blockchain einfügen, können wir sicher sein, dass die von ihm empfangene Datei die ursprünglich hinzugefügte ist und die Datei nicht ersetzt werden kann
- Das verteilte System versichert gegen die Nichtverfügbarkeit eines bestimmten Servers (aufgrund von Blockierungen oder anderen Gründen)
- Der Link zur Datei und die Hash-Bestätigung werden in einer Zeile zusammengefasst, was bedeutet, dass Sie weniger in die Blockchain schreiben und Gas sparen können
Unter den Mängeln kann man erwähnen, dass es für den Zugriff auf Dateien notwendig ist, dass mindestens eine Datei „verteilt“ ist, da es keinen zentralen Server gibt. Wenn Sie jedoch eine bestimmte Datei haben, ist die Verbindung zu den Distributoren einfach. Starten Sie Ihren ipfs-Daemon und fügen Sie die Datei über
ipfs add
.
Die Technologie eignet sich sehr gut für die Ideologie der Dezentralisierung. Wenn wir Oraclize jetzt betrachten, werden wir häufig auf die Verwendung von IPFS in verschiedenen Orakelmechanismen stoßen.
Oraclize
Um fast jede nützliche Arbeit ausführen zu können, muss ein intelligenter Vertrag neue Daten erhalten. Es gibt jedoch keine eingebaute Fähigkeit, eine Anfrage von der Blockchain an die Außenwelt zu erfüllen. Natürlich können Sie alles, was für Transaktionen erforderlich ist, manuell hinzufügen, aber es ist unmöglich zu überprüfen, woher diese Daten stammen und wie zuverlässig sie sind. Außerdem müssen Sie möglicherweise eine zusätzliche Infrastruktur organisieren, um dynamische Daten wie Wechselkurse schnell zu aktualisieren. Und Aktualisierungen mit einem festen Intervall führen zu Gasüberschreitungen.
Daher ist der von
Oraclize bereitgestellte Dienst praktisch: In einem Smart-Vertrag können Sie eine Anfrage an nahezu jede API oder Ressource im Internet senden, sicherstellen, dass die von der angegebenen Ressource empfangenen Daten unverändert sind, und das Ergebnis in demselben Smart-Vertrag verwenden.
Oraclize ist nicht nur ein Ethereum-Dienst, ähnliche Funktionen werden auch für andere Blockchains bereitgestellt, sondern wir werden nur das Bundle mit Ethereum beschreiben.
Erste Schritte
Um loszulegen, müssen Sie lediglich eine der oraclizeAPI-Dateien aus dem
Repository zum Projekt hinzufügen. Sie müssen nur die für Ihre Version des Compilers (solc) geeignete auswählen: oraclizeAPI_0.5.sol für Versionen ab 0.4.18, oraclizeAPI_0.4.sol für Versionen ab 0.4.1, oraclizeAPI_pre0.4.sol für alles Ältere, Unterstützung Diese Version wurde bereits eingestellt. Wenn Sie Trüffel verwenden, vergessen Sie nicht, die Datei in usingOraclize umzubenennen. Dazu müssen der Name der Datei und der Vertrag übereinstimmen.
Indem Sie die entsprechende Datei in Ihr Projekt aufnehmen, erben Sie den Vertrag von
usingOraclize
. Sie können Oracle verwenden, das sich auf zwei
oraclize_query
: Senden einer Anforderung mit dem Helfer
oraclize_query
und anschließendes Verarbeiten des Ergebnisses in der Funktion
__callback
. Der einfachste Smart-Vertrag (um den aktuellen Sendezeitpreis in US-Dollar zu erhalten) könnte folgendermaßen aussehen:
pragma solidity 0.4.23; import "./usingOraclize.sol"; contract ExampleContract is usingOraclize { string public ETHUSD; event updatedPrice(string price); event newOraclizeQuery(string description); function ExampleContract() payable { updatePrice(); } function __callback(bytes32 myid, string result) { require (msg.sender == oraclize_cbAddress()); ETHUSD = result; updatedPrice(result); } function updatePrice() payable { if (oraclize_getPrice("URL") > this.balance) { newOraclizeQuery("Oraclize query was NOT sent, please add some ETH to cover for the query fee"); } else { newOraclizeQuery("Oraclize query was sent, standing by for the answer.."); oraclize_query("URL", "json(https://api.coinmarketcap.com/v1/ticker/ethereum/?convert=USD).0.price_usd"); } } }
Die Funktion, die die Anfrage sendet, ist
updatePrice
. Sie können sehen, dass zuerst überprüft wird,
oraclize_getPrice(“URL”)
größer ist als der aktuelle Kontostand. Dies liegt daran, dass der Anruf
oraclize_query
bezahlt werden muss. Der Preis wird als Summe der festen Provision und der
oraclize_query
für den Rückruf berechnet.
“URL”
ist eine Bezeichnung für eine der Arten von Datenquellen. In diesem Fall handelt es sich um eine einfache Anfrage über https. Anschließend werden andere Optionen in Betracht gezogen. Antworten auf Anfrage können im Voraus als json (wie im Beispiel) und auf verschiedene andere Arten (wir werden weiter darauf eingehen) analysiert werden. Eine
__callback
wird in
__callback
. Zu Beginn wird überprüft, ob der Anruf von der vertrauenswürdigen Adresse oraclize weitergeleitet wurde
Alle Optionen für die Verwendung von oraclize basieren auf einem Schema. Nur Datenquellen und die Möglichkeit,
__callback
eine Authentifizierung
__callback
. Daher werden wir in zukünftigen Beispielen nur signifikante Unterschiede anführen.
Preis verwenden
Wie bereits erwähnt, wird für oraclize-Anfragen zusätzlicher Äther bezahlt und aus dem Kontostand und nicht aus der anrufenden Adresse entfernt. Eine Ausnahme ist nur die erste Anfrage aus jedem neuen Vertrag, sie wird kostenlos zur Verfügung gestellt. Es ist auch interessant, dass die gleiche Mechanik in Testnetzwerken erhalten bleibt, die Zahlung jedoch durch Senden des entsprechenden Netzwerks erfolgt, dh in Testnetzanforderungen sind sie praktisch kostenlos.
Es wurde bereits erwähnt, dass der Anforderungspreis aus zwei Werten besteht: einer festen Provision und der Zahlung für einen Gasrückruf. Eine feste Provision wird in Dollar definiert, und die Äthermenge wird aus dem aktuellen Satz berechnet. Die Provision hängt von der Datenquelle und zusätzlichen unterstützenden Mechanismen ab, auf die wir noch eingehen werden. Die aktuelle Preistabelle sieht folgendermaßen aus:
Wie Sie sehen können, beträgt der Preis pro URL-Anfrage mehrere Cent. Ist es viel oder wenig? Betrachten wir dazu, wie viel der zweite Teil kostet - die Rückrufgasgebühr.
Dies funktioniert nach folgendem Schema: Die Menge an Äther, die zur Zahlung einer festen Menge Gas zu einem festen Preis benötigt wird, wird im Voraus mit der Anfrage aus dem Vertrag übertragen. Dieser Betrag sollte ausreichen, um einen Rückruf zu tätigen, und der Preis sollte dem Markt angemessen sein, da sonst die Transaktion nicht durchgeführt wird oder sehr lange anhält. Gleichzeitig ist klar, dass es nicht immer möglich ist, die Gasmenge im Voraus zu kennen, daher muss die Tafel auch in Reserve sein (die Reserve wird nicht zurückgegeben). Die Standardwerte sind ein Limit von 200.000 Gas zu einem Preis von 20 gwei. Dies reicht für einen durchschnittlichen Rückruf mit mehreren Einträgen und einer Art Logik. Und der Preis von 20 Gwei mag zwar im Moment zu hoch erscheinen (zum Zeitpunkt des Schreibens liegt der Durchschnitt bei 4 Gwei), aber zum Zeitpunkt des Zuflusses von Transaktionen kann der Marktpreis plötzlich springen und sogar noch höher sein, sodass diese Werte im Allgemeinen nahe an den tatsächlich verwendeten Werten liegen. Bei solchen Werten und einem Luftpreis in der Größenordnung von 500 US-Dollar werden sich die Gaszahlungen 2 US-Dollar nähern, sodass wir sagen können, dass eine feste Provision einen kleinen Teil ausmacht.
Wenn Sie wissen, was Sie tun, besteht die Möglichkeit, das Limit und den Gaspreis zu ändern und so bei Anfragen erheblich zu sparen.
Der Gaspreis kann durch eine separate Funktion festgelegt werden -
oraclize_setCustomGasPrice(< wei>)
. Nach dem Anruf wird der Preis gespeichert und in allen nachfolgenden Anfragen verwendet.
Das Limit kann in der Abfrage
oraclize_query
, indem es mit dem letzten Argument angegeben wird, beispielsweise wie
oraclize_query
:
oraclize_query("URL", "<>", 50000);
Wenn Sie eine komplexe Logik in
__callback
und mehr als 200.000 Gas verbraucht werden, müssen Sie auf jeden Fall einen Grenzwert festlegen, der den schlimmsten Fall des Gasverbrauchs abdeckt. Andernfalls wird
__callback
einfach zurückgesetzt, wenn das Limit überschritten
__callback
.
Übrigens hat oraclize kürzlich Informationen erhalten, die Sie für Anfragen außerhalb der Blockchain bezahlen können, sodass Sie nicht das gesamte Limit ausgeben oder den Restbetrag zurückgeben können (und die Zahlung nicht aus dem Vertrag stammt). Wir mussten dies noch nicht verwenden, aber oraclize bietet an, sie unter info@oraclize.it zu kontaktieren, wenn diese Option interessant ist. Denken Sie deshalb daran.
Wie funktioniert es?
Warum erhalten wir nach dem Erben eines regulären Smart-Vertrags Funktionen, die ursprünglich nicht von Blockchain-Mechanismen unterstützt wurden? Tatsächlich besteht der Orakelservice nicht nur aus Verträgen mit Hilfsfunktionen. Die Hauptarbeit zum Abrufen von Daten wird von einem externen Dienst erledigt. Intelligente Verträge bilden Anwendungen für den Zugriff auf externe Daten und fügen sie in die Blockchain ein. Externer Dienst - überwacht neue Blöcke der Blockchain und führt sie aus, wenn sie eine Anwendung erkennt. Schematisch kann dies wie folgt dargestellt werden:
Datenquellen
Zusätzlich zu der berücksichtigten URL bietet oraclize 4 weitere Optionen (die Sie im Abschnitt über die Preisgestaltung gesehen haben):
WolframAlpha
,
IPFS
,
random
und
computation
. Betrachten wir jeden von ihnen.
1. URL
Das bereits besprochene Beispiel verwendet diese Datenquelle. Dies ist die Quelle für HTTP-Anforderungen an verschiedene APIs. Das Beispiel war wie folgt:
oraclize_query("URL", "json(https://api.coinmarketcap.com/v1/ticker/ethereum/?convert=USD).0.price_usd");
Dies ist der Preis für Ether, und da API eine JSON-Zeichenfolge mit einem Datensatz bereitstellt, wird die Anforderung in einen JSON-Parser eingeschlossen und gibt nur das Feld zurück, das wir benötigen. In diesem Fall ist es GET, aber die Quell-URL unterstützt auch POST-Anforderungen. Die Art der Anforderung wird automatisch durch ein zusätzliches Argument bestimmt. Wenn es einen gültigen JSON wie in diesem Beispiel gibt:
oraclize_query("URL", "json(https://shapeshift.io/sendamount).success.deposit", '{"pair":"eth_btc","amount":"1","withdrawal":"1AAcCo21EUc1jbocjssSQDzLna9Vem2UN5"}')
dann wird die Anfrage als POST verarbeitet (die verwendete API wird
hier bei Interesse beschrieben)
2. WolframAlpha
Über diese Datenquelle können Sie auf den
WolframAlpha- Dienst zugreifen, der beispielsweise Antworten auf verschiedene Anfragen nach Fakten oder Berechnungen bietet
oraclize_query(“WolframAlpha”, “president of Russia”)
wird
Vladimir Putin
und darum bitten
oraclize_query(“WolframAlpha”, “solve x^2-4”)
gibt
x = 2
.
Wie Sie sehen können, war das Ergebnis unvollständig, da das Symbol ± verloren ging. Bevor Sie diese Quelle verwenden, müssen Sie daher überprüfen, ob der Wert einer bestimmten Anforderung in einem Smart-Vertrag verwendet werden kann. Darüber hinaus wird die Authentifizierung für Antworten nicht unterstützt. Daher empfehlen oraclize selbst, diese Quelle nur zum Testen zu verwenden.
3. IPFS
Wie Sie vielleicht erraten haben, können Sie den Inhalt einer Datei in IPFS mithilfe eines Multi-Hash abrufen. Das Zeitlimit für den Empfang von Inhalten beträgt 20 Sekunden.
oraclize_query(“IPFS”, “QmTL5xNq9PPmwvM1RhxuhiYqoTJcmnaztMz6PQpGxmALkP”)
wird zurückkehren
Hello, Habr!
(wenn die Datei mit diesem Inhalt noch verfügbar ist)
4. zufällig
Die Generierung von Zufallszahlen funktioniert genauso wie andere Quellen. Wenn Sie jedoch
oraclize_query
, ist die Vorbereitung der Argumente zeitaufwändig. Um dies zu vermeiden, können Sie die
oraclize_newRandomDSQuery(delay, nbytes, customGasLimit)
und nur die Ausführungsverzögerung (in Sekunden), die Anzahl der generierten Bytes und das
__callback
für den Aufruf von
__callback
.
Die Verwendung von
random
hat einige Dinge zu beachten:
- Um zu bestätigen, dass die Zahl tatsächlich zufällig ist, wird eine spezielle Art der Überprüfung verwendet - Ledger, die in der Blockchain ausgeführt werden kann (im Gegensatz zu allen anderen, aber dazu später mehr). Dies bedeutet, dass Sie im Konstruktor des Smart-Vertrags diese Überprüfungsmethode durch die folgende Funktion festlegen müssen:
oraclize_setProof(proofType_Ledger);
Und zu Beginn des Rückrufs sollte es eine Überprüfung selbst geben:
function __callback(bytes32 _queryId, string _result, bytes _proof) { require (oraclize_randomDS_proofVerify__returnCode(_queryId, _result, _proof) == 0) ); <...>
Diese Überprüfung erfordert ein echtes Netzwerk und funktioniert nicht mit Ganache. Für lokale Tests können Sie diese Zeile vorübergehend entfernen. Das dritte Argument für __callback
ist _proof
der optionale Parameter _proof
. Es ist immer erforderlich, wenn einer der Bestätigungstypen verwendet wird. - Wenn Sie eine Zufallszahl für kritische Momente verwenden, um beispielsweise den Gewinner der Lotterie zu ermitteln, erfassen Sie Benutzereingaben, bevor Sie newRandomDSQuery senden. Andernfalls kann folgende Situation auftreten: oraclize ruft _callback auf und die Transaktion ist für alle in der ausstehenden Liste sichtbar. Gleichzeitig ist die Zufallszahl selbst sichtbar. Wenn Benutzer grob gesagt weiterhin Wetten abschließen können, können sie einen höheren Gaspreis angeben und ihre Rate verschieben, bevor _callback ausgeführt wird, wobei sie im Voraus wissen, dass sie gewinnen werden.
5. Berechnung
Dies ist die flexibelste der Quellen. Sie können damit Ihre eigenen Skripte schreiben und als Datenquelle verwenden. Die Berechnung erfolgt auf AWS. Zur Ausführung müssen Sie die Docker-Datei beschreiben, sie mit beliebigen zusätzlichen Dateien in einem Zip-Archiv zusammenstellen und das Archiv in IPFS herunterladen. Die Implementierung muss die folgenden Bedingungen erfüllen:
- Schreiben Sie die Antwort, die Sie zurückgeben möchten, mit der letzten Zeile in stdout
- Die Antwort darf nicht mehr als 2500 Zeichen umfassen
- Die Initialisierung und Ausführung sollte insgesamt nicht länger als 5 Minuten dauern
Als Beispiel dafür betrachten wir, wie die einfachste Vereinigung der übertragenen Zeilen durchgeführt und das Ergebnis zurückgegeben werden kann.
Dockerfile:
FROM ubuntu:16.04 MAINTAINER "info@rubyruby.ru" CMD echo "$ARG0 $ARG1 $ARG2 $ARG3"
Umgebungsvariablen
ARG0
,
ARG1
usw. - Dies sind die Parameter, die zusammen mit der Anfrage übergeben werden.
Fügen Sie die Docker-Datei zum Archiv hinzu, starten Sie den ipfs-Server und fügen Sie dieses Archiv dort hinzu
$ zip concatenation.zip Dockerfile $ ipfs daemon & $ ipfs add concatenation.zip QmWbnw4BBFDsh7yTXhZaTGQnPVCNY9ZDuPBoSwB9A4JNJD
Wir verwenden den resultierenden Hash, um die Anfrage über
oraclize_query
im Smart-Vertrag zu senden:
oraclize_query("computation", ["QmVAS9TNKGqV49WTEWv55aMCTNyfd4qcGFFfgyz7BYHLdD", "s1", "s2", "s3", "s4"]);
Als Argument wird ein Array verwendet, bei dem das erste Element der Archiv-Multihash ist und der Rest die Parameter sind, die in die Umgebungsvariablen fallen.
Wenn Sie auf den Abschluss der Anforderung warten, gibt
__callback
Ergebnis
s1 s2 s3 s4
.
Parser-Helfer und Unterabfragen
Aus der von einer beliebigen Quelle zurückgegebenen Antwort können Sie nur die erforderlichen Informationen mit einer Reihe von Hilfsprogrammen vorab auswählen, z.
1. JSON-Parser
Sie haben diese Methode im allerersten Beispiel gesehen, in dem nur der Preis aus dem Ergebnis von coinmarketcap zurückgegeben wurde:
json(https://api.coinmarketcap.com/v1/ticker/ethereum/?convert=USD).0.price_usd
Der Anwendungsfall ist ziemlich offensichtlich und kehrt zum Beispiel zurück:
[ { "id": "ethereum", "name": "Ethereum", "symbol": "ETH", "rank": "2", "price_usd": "462.857", "price_btc": "0.0621573", "24h_volume_usd": "1993200000.0", "market_cap_usd": "46656433775.0", "available_supply": "100800968.0", "total_supply": "100800968.0", "max_supply": null, "percent_change_1h": "-0.5", "percent_change_24h": "-3.02", "percent_change_7d": "5.93", "last_updated": "1532064934" } ]
Da dies ein Array ist, nehmen wir das Element
0
und daraus das Feld
price_usd
2. XML
Die Verwendung ähnelt JSON, zum Beispiel:
xml(https://informer.kovalut.ru/webmaster/getxml.php?kod=7701).Exchange_Rates.Central_Bank_RF.USD.New.Exch_Rate
3. HTML
Sie können XHTML mit XPath analysieren. Holen Sie sich zum Beispiel eine Marktkapitalisierung mit Etherscan:
html(https://etherscan.io/).xpath(string(//*[contains(@href, '/stat/supply')]/font))
MARKET CAP OF $46.148 BillionB
4. Binärer Helfer
Ermöglicht das Ausschneiden von Stücken aus Rohdaten mithilfe der Slice-Funktion (Versatz, Länge). Das heißt, wir haben zum Beispiel eine Datei mit dem Inhalt von "abc":
echo "abc" > example.bin
Stellen Sie es auf IPFS:
$ ipfs add example.bin added Qme4u9HfFqYUhH4i34ZFBKi1ZsW7z4MYHtLxScQGndhgKE
Schneiden Sie nun 1 Zeichen aus der Mitte:
binary(Qme4u9HfFqYUhH4i34ZFBKi1ZsW7z4MYHtLxScQGndhgKE).slice(1, 1)
In der Antwort erhalten wir
b
Wie Sie vielleicht bemerkt haben, wurde im Fall des binären Helfers nicht die IP-Quelle verwendet, sondern IPFS. In der Tat können Parser auf alle Quellen angewendet werden. Nehmen wir an, es ist nicht erforderlich, JSON auf das anzuwenden, was die URL zurückgibt. Sie können der Datei solchen Inhalt hinzufügen:
{ "one":"1", "two":"2" }
Fügen Sie es zu IPFS hinzu:
$ ipfs add test.json added QmZinLwAq5fy4imz8ZNgupWeNFTneUqHjPiTPX9tuR7Vxp
Und dann so zerlegen:
json(QmZinLwAq5fy4imz8ZNgupWeNFTneUqHjPiTPX9tuR7Vxp).one
Wir bekommen
1
Ein besonders interessanter Anwendungsfall ist die Kombination von Datenquellen und Parsern in einer Anfrage. Dies ist mithilfe einer separaten
nested
Datenquelle möglich. Wir verwenden die gerade erstellte Datei in einer komplexeren Anforderung (Hinzufügen von Werten in zwei Feldern):
[WolframAlpha] add ${[IPFS] json(QmZinLwAq5fy4imz8ZNgupWeNFTneUqHjPiTPX9tuR7Vxp).one} to ${[IPFS] json(QmZinLwAq5fy4imz8ZNgupWeNFTneUqHjPiTPX9tuR7Vxp).two}
Wir bekommen
3
Die Anforderung wird wie folgt gebildet: Geben Sie die
nested
Datenquelle an, fügen Sie dann für jede Anforderung den Namen der Quelle davor in eckigen Klammern hinzu und rahmen Sie zusätzlich alle Unterabfragen in
${..}
.
Testen
Oraclize bietet einen
nützlichen Service zur Validierung von Abfragen
, ohne dass intelligente Verträge erforderlich sind. Gehen Sie einfach hinein, wählen Sie eine Datenquelle, eine Überprüfungsmethode und Sie können sehen, dass sie zu __callback zurückkehrt, wenn Sie die entsprechenden Anforderungen senden
Für die lokale Überprüfung in Verbindung mit einem Smart-Vertrag können Sie eine
spezielle Version der Remix-IDE verwenden , die oraclize-Anforderungen unterstützt.
Und um lokal mit Ganache zu prüfen, benötigen Sie eine
Ethereum-Brücke , die intelligente Verträge für Ihr Testnetz bereitstellt oder aktiviert. Fügen Sie zum Testen zunächst die folgende Zeile zum Konstruktor Ihres Vertrags hinzu:
OAR = OraclizeAddrResolverI(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475);
laufen
ganache-cli
Dann
node bridge --dev
Warten Sie, bis die Verträge tot sind und Sie testen können. In der Ausgabe der
node bridge
sehen Sie die gesendeten Anforderungen und die empfangenen Antworten.
Eine weitere Hilfe nicht nur beim Testen, sondern auch beim tatsächlichen Gebrauch ist die Möglichkeit, Anfragen
hier zu überwachen. Wenn Sie in einem öffentlichen Netzwerk anfordern, können Sie den Hash der Transaktion verwenden, in der die Anforderung ausgeführt wird. Wenn Sie die Authentifizierung verwenden, beachten Sie, dass diese garantiert nur an das Hauptnetz gesendet werden. In anderen Netzwerken kann 0 zurückgegeben werden. Wenn sich die Anforderung im lokalen Netzwerk befand, können Sie die Anforderungs-ID verwenden, die
oraclize_query
. Übrigens wird empfohlen, diese ID immer in einer ähnlichen Zuordnung zu belassen:
mapping(bytes32=>bool) validIds;
Markieren Sie zum Zeitpunkt der Anforderung die gesendete ID als
true
:
bytes32 queryId = oraclize_query(<...>); validIds[queryId] = true;
Überprüfen Sie anschließend in
__callback
, ob die Anforderung mit dieser ID noch nicht verarbeitet wurde:
function __callback(bytes32 myid, string result) { require(validIds[myid] != bytes32(0)); require(msg.sender == oraclize_cbAddress()); validIds[myid] = bytes32(0); <...>
Dies ist erforderlich, da
__callback
bei einer Anforderung aufgrund der Besonderheiten der Oraclize-Mechanismen mehrmals aufgerufen werden kann.
Authentifizierung
In der Tabelle mit den Quellen konnten Sie sehen, dass verschiedene Quellen verschiedene Arten von Bestätigungen unterstützen können und unterschiedliche Gebühren erhoben werden können. Dies ist ein sehr wichtiger Teil von oraclize, aber eine detaillierte Beschreibung dieser Mechanismen ist ein separates Thema.
Der zumindest von uns am häufigsten verwendete Mechanismus ist
TLSNotary mit Speicher in IPFS. Die Speicherung in IPFS ist effizienter, da
__callback
die Beweise selbst nicht
__callback
(möglicherweise im Bereich von
__callback
5 Kilobyte), sondern einen viel kleineren Multi-Hash. Um diesen Typ anzugeben, fügen Sie im Konstruktor eine Zeile hinzu:
oraclize_setProof(proofType_TLSNotary | proofStorage_IPFS);
Wir können nur sagen, dass dieser Typ uns grob gesagt vor der Ungenauigkeit der von Oraclize empfangenen Daten schützt. Oraclize verwendet jedoch Amazon-Server, die als Prüfer fungieren, sodass sie nur vertrauen müssen.
Lesen Sie
hier mehr.
Fazit
Oraclize bietet Tools, die die Anzahl der Anwendungsfälle für intelligente Verträge erheblich erhöhen, sowie IPFS, das in mehreren Versionen von Oracle-Abfragen angezeigt wird. Das Hauptproblem besteht darin, dass wir wieder externe Daten verwenden, die den Bedrohungen ausgesetzt sind, vor denen die Blockchain geschützt sein sollte: Zentralisierung, Blockierungsfunktionen, Codeänderungen, Spoofing. Obwohl dies alles unvermeidlich ist und die Möglichkeit, Daten abzurufen, sehr nützlich und praktikabel ist, müssen Sie sich nur darüber im Klaren sein, warum die Verwendung von Blockchain in das Projekt eingeführt wurde und ob die Verwendung externer unzuverlässiger Quellen den Nutzen auf Null reduziert.
Wenn Sie an einigen Entwicklungsthemen zu Ethereum interessiert sind, die in diesen Artikeln noch nicht veröffentlicht wurden - schreiben Sie in die Kommentare, vielleicht werden wir sie im Folgenden behandeln.
Eintauchen in die Entwicklung von Ethereum:
Teil 1: EinführungTeil 2: Web3.js und GasTeil 3: BenutzeranwendungTeil 4: Bereitstellen und Debuggen in Trüffel, Ganache, Infura