Wie funktionieren Oracle-Dienste unter der Haube?

Ich habe viele Fragen zu Oracle-Diensten gelesen, aber ich verstehe nicht, wie sie funktionieren. Oft lese ich Antworten wie diese: https://ethereum.stackexchange.com/a/9825/5892

Smart Contract kann nicht auf eine externe Umgebung zugreifen ...

Aber wie funktionieren „Oraclize“ oder „RealityKeys“ und wie kann ich meinen eigenen Orakeldienst auf einer öffentlichen Blockchain aufbauen?

Antworten (4)

Edmund Edgar von Reality Keys hier.

Was im Grunde passieren muss, ist, dass jemand sagt, welche Daten er möchte, der vertrauenswürdige Dienst eine ID bereitstellt, die ihn identifiziert (in unserem Fall ein Hash der Daten) und einen Schlüssel, mit dem er das Ergebnis signiert, und jemand eine Transaktion an ihn sendet der Vertrag. Dann warten wir auf das Ergebnis. Sobald das Ergebnis bekannt ist, signiert der vertrauenswürdige Dienst es mit seinem Schlüssel, jemand sendet eine weitere Transaktion mit den signierten Daten an den Vertrag, und der Vertrag tut, was passieren soll.

Dies kann entweder on-chain oder off-chain erfolgen. Wir tun dies Off-Chain, also stellen wir nur signierte Daten und einen Schlüssel bereit, und die Benutzer holen sich diese Daten von unserer Website und senden sie selbst an ihre Verträge. Dies wäre normalerweise Teil einer DApp, also beispielsweise PredictionTokenhaben einen Bildschirm, der eine Transaktion erstellt, um die ID von unserer Website abzurufen und einen Vertrag abzuschließen, und einen anderen Bildschirm, um die signierten Daten von unserer Website abzurufen und eine Transaktion zur Abwicklung des Vertrags zu senden. Oraclize erledigt dies on-chain, sodass Ihr Vertrag eine Anfrage an ihren Vertrag sendet und ihr Vertrag ein Ereignis in das Ereignisprotokoll schreibt und eine Kennung zurückgibt. Sie haben einen Prozess, der das Ereignisprotokoll überwacht, und wenn die Daten fertig sind, senden sie sie als signierte Transaktion an Ihren Vertrag, der den Absender des Vertrags überprüft (dies ist eine andere Möglichkeit, zu überprüfen, wer die Daten signiert hat) und tut, was auch immer es soll machen.

Aus Sicht eines Entwicklers besteht der Vorteil der On-Chain darin, dass Sie nur Anfragen an eine Stelle (die RPC-Schnittstelle Ihres Knotens) bearbeiten müssen und wenn Sie genau wissen, wann die Antwort fällig ist, muss Ihr Benutzer nur senden eine Transaktion statt einer, um den Vertrag einzurichten und eine andere, um das Ergebnis zu senden. Der Nachteil ist, dass es umständlich ist, richtig zu testen (Sie müssen entweder ihren Dienst nachahmen oder ein Live-Testnetz verwenden) und es gibt unangenehme Randfälle im Zusammenhang mit dem Gasverbrauch. (Es gibt einige Möglichkeiten, dies richtig zu machen, aber wenn Sie sich tatsächliche Verträge mit Oraclize ansehen, würden sie Oraclize oft erlauben, das gesamte Geld aus dem Vertragssaldo abzuziehen.)

Beachten Sie, dass Sie dem Dienst niemals vollständig vertrauen können (Oraclize hat einen kryptografischen Beweis, um ihre Behauptung zu untermauern, dass die abgerufenen Daten wirklich von der angegebenen Website stammen, aber der Vertrag kann dies nicht überprüfen, sodass dies nicht wirklich hilft). Möglicherweise möchten Sie, dass mehrere Dienste dasselbe tun, und der Vertrag mehrere Unterschriften erfordert. Dies ist auch etwas, das Sie in einem genehmigten Blockchain-Kontext tun möchten, in dem Sie bereits mehrere bekannte Teilnehmer haben, die Knoten ausführen und Blöcke signieren, sodass es sinnvoll wäre, sie dazu zu bringen, die Daten zu signieren.

Danke für die ausführliche Antwort, ich glaube, ich verstehe. Zusammenfassung und sehr vereinfacht: 1. Wir haben "Magic-Contract" mit einer Funktion QueryFunc(someURI), die Benutzerabfragen zu externen API-URI führt. 2. Unser "Magic-Contract" löst Ereignisse aus, wenn QueryFunc(...) aufgerufen wird. Dieses Ereignis enthält die Benutzerabfrage-an-API-Zeichenfolge 3. Wir erfassen diese Ereignisse in unserem "Cool-Oracle-Service", holen dann die "Benutzerabfrage-an-API-Zeichenfolge" aus den Ereignisdaten, führen eine Webanforderung (in C# oder JS zB) und spezielle Funktion (RetriveData(data-from-external-api) zB) in unserem "Magic-Contract" aufrufen.
@Artem, ja, das wird funktionieren.
Beachten Sie nur, dass oraclize alle seine Beweise in der Kette überprüfbar macht. Im Moment ist ihre „zufällige Datenquelle“ in der Kette verifizierbar, weitere werden folgen.
Was ist das für ein Beweis dafür, dass Sie Website X besucht haben und das echte Ergebnis zurückgeben?

Ich werde einen sehr groben Überblick geben, indem ich ein allgemeines Ziel, die Einschränkungen von Smart Contracts und die Umrisse einer Lösung beschreibe. Dies wird hoffentlich einen Kontext für die Implementierungsdetails liefern.

1) Das Ziel . Ein Smart Contract, der auf ein beobachtbares Ereignis oder einen Datenpunkt im Universum reagieren kann. Bei so vielen Daten, die im Internet herumschwappen, ist es selbstverständlich, automatisierte Reaktionen auf Ereignisse in Betracht zu ziehen. Dies ist außerhalb von Blockchains so verbreitet, dass es überraschend erscheinen kann, dass es innerhalb von Blockchains so schwierig ist.

2) Das Problem . Ein Smart Contract kann nicht nach Daten greifen, wie es ein typischer Webserver an eine API oder einen RSS-Feed (oder Bildschirmschoner usw.) anhängen könnte. Auf einer ziemlich tiefen Ebene gibt es hier ein echtes Problem, weil alles in einer Blockchain muss von allen Minern überprüfbar sein. Eine solche externe Beschaffung von Inputs wäre auch eine Quelle der Unsicherheit, die die Überprüfung verwirren würde. Alles in der Kette muss nicht nur von einem Server, sondern von ALLEN Servern verifiziert werden können, und nicht nur heute. Bis in alle Ewigkeit.

Wie würde irgendein Knoten in Jahren bestätigen, dass heute genau zu dieser Zeit eine bestimmte URL einen bestimmten Datenstrom erzeugt? Wenn es das nicht kann, wie würde es dann die Wahrheit der Daten in der Kette bestätigen? Wenn das nicht zuverlässig ist (ist es nicht), dann werden die Dinge auseinanderfallen. Wenn die Blockchain nicht nur anhand der Daten in der Blockchain selbst objektiv überprüfbar ist, funktioniert sie nicht.

3) Die Oracle-Lösung . Wir können uns eine vertraute Person vorstellen, die in den Dienst gedrängt wird (der arme Kerl). Er hat ein privilegiertes Konto, das Daten einspeisen kann, die er von außerhalb der Blockchain erhält, und er ist darauf angewiesen, die Blockchain in regelmäßigen Abständen zu aktualisieren. Angenommen, er schläft nie und aktualisiert die Tickerdaten alle paar Minuten.

Wir können uns eine vereinfachte Funktion wie folgt vorstellen:

function recordTickerData(bytes8 symbol, uint high, uint low, uint close) 
  onlyOracle 
  returns(bool success) 
{
  // store the data
  // possibly react to the data
  return true;
}

Groß. Nur das Orakel darf Daten auf diese Weise einspeisen, aber sobald die Daten eingespeist sind, können wir anfangen, Dinge damit zu tun, was wir wollen.

Die Miner können die Blockchain verifizieren. Sie können nicht bestätigen, dass die Eingaben des Orakels mit irgendetwas im äußeren Universum übereinstimmen, aber sie können bestätigen, dass die Eingaben des Orakels zulässig sind und alle daraus resultierenden Transaktionen legitim sind.

Wir haben einige lose Enden zu lösen. Erstens muss das Orakel schlafen, und dies ist eindeutig eine Aufgabe für etwas Automatisiertes. Zweitens muss das Orakel jedes Mal, wenn es diese Funktion ausführt, Gas für die Transaktion zahlen. Das bedeutet, dass wir zuerst das Orakel bezahlen müssen, damit es etwas Geld hat, um das Gas zu bezahlen.

Sehen Sie, wohin das führt?

Ohne auf Implementierungsdetails einzugehen, muss das Oracle die eingehenden Daten aus einer Quelle auflösen und sie der Schnittstelle des Vertrags zuordnen. Es werden Details darüber angegeben, wie oft die Funktion aufgerufen werden soll usw. Und es wird die administrative Frage der Finanzierung geben, da das Orakel eine kontinuierliche Finanzierungsquelle benötigen wird, um das Gas für seine regelmäßigen Dateninjektionen zu bezahlen. Jeder mit ernsthafter Finanzierung wird überprüfen wollen, ob das Oracle-Arrangement vertrauenswürdig ist, da seine Eingaben nicht triviale Konsequenzen haben werden. Wir müssen also eine Datenquelle auswählen, die allgemein akzeptiert wird. Wir haben einige grobe Umrisse verallgemeinerter Oracle-Lösungen – lassen Sie uns einen vertrauenswürdigen externen Dienst haben, der externe Daten einer unserer Eingabefunktionen zuordnet und regelmäßig Aktualisierungstransaktionen sendet.

Meinungsmärkte wie Auger und Gnosis präsentieren Informationen aus der Außenwelt etwas anders. Angenommen, Ihr Vertrag hängt von einer einmaligen Wahr/Falsch-Bedingung ab, und es ist nicht offensichtlich, dass es eine externe Quelle gibt, von der Sie im Voraus wissen können, die Ihrem Vertrag eine einfache Wahrheit übermittelt.

Wird Trump zum Beispiel die Wahl 2017 gewinnen?

Meinungsmärkte bieten eine Möglichkeit, die Frage zu stellen und im Wesentlichen die Ermittlung der Wahrheit an eine menschliche Gemeinschaft auszulagern. Es handelt sich um einen Wettmarkt, der die Frage letztendlich so regelt, wie Sie es im Voraus konfigurieren können.

Im Pseudo-Code kann Ihr Vertrag Folgendes berücksichtigen:

if(AugurQuestion(123).isDecided and isTrue) then ... do stuff.

Ich hoffe, dass das Vorangegangene etwas die Bühne bereitet und einen Kontext zu den Implementierungsdetails dieser Bemühungen liefert.

Ich gebe zu, es ist eine lange Antwort, muss also viele Details enthalten, aber ich verstehe immer noch nicht genau, wie es funktioniert. Wie lösen Sie das Gebührenproblem? Wird der Datenabruf durch unseren Vertrag oder durch das Orakel planmäßig ausgelöst? Vielen Dank.
Ich würde mich an Edmund wenden, um die beste Erklärung dafür zu erhalten, wie sich die generalisierten Dienste im Detail vergleichen lassen.
@NicolasMassart Der ursprüngliche Auslöser für den Datenabruf erfolgt entweder dadurch, dass Ihr Vertrag eine Anfrage an den Vertrag des Oracle-Dienstes sendet, der ein Ereignisprotokoll schreibt (oraclize), oder indem Ihr Benutzer eine URL von seiner DApp (Reality Keys) aus anklickt. Oft ist für den Abruf auch ein Zeitauslöser festgelegt, also speichern wir die Anfrage und führen dann einen Cron aus, um nach Dingen zu suchen, die abgerufen werden müssen. Ein dritter Ansatz besteht darin, dass einige Daten oft nützlich sind, sodass ein Dienst sie proaktiv signieren/senden kann, ohne auf eine Anfrage zu warten. smartcontract.com betreibt einige Dienste wie diesen im Auftrag von Datenanbietern.

Sie haben selbst einen Vertrag, der mit der realen Welt verbunden ist.

  1. Sie registrieren sich mit ihrem Vertrag und definieren eine Funktion, die sie aufrufen sollen
  2. Ihr Vertrag wird von einer externen Entität gelesen, die Ihre "Anfrage" sieht
  3. die externe Entität führt die Abfrage aus (z. B. Aufruf von random.org)
  4. ruft Ihre Callback-Funktion entweder direkt oder über ihren Vertrag auf
  5. Gewinn ;-)
Danke für die schnelle Antwort. Ich habe eine Dokumentation für Oraklize gesehen, und es sieht einfach aus - rufen Sie einfach die Abfragefunktion aus ihrem "magischen Vertrag" auf. Wie kann ich meinen eigenen „Zaubervertrag“ schreiben? Ich bin Programmierer in der Bank. Meine Organisation vertraut keinen Drittanbietern, zB Oraclize, aber sie müssen externe Daten aus dem Internet abrufen. Sie müssen dies direkt tun, ohne Dienste von Drittanbietern.
Meine Antwort wurde bearbeitet, um etwas mehr darüber zu sagen, was Sie in einem genehmigten Blockchain-Kontext tun könnten
@Artem Thomas von Oraclize hier. Unser Konnektor ("Magic Contract") ist Open Source, sodass Sie selbst ausprobieren können, was er tut. Wir arbeiten bereits mit einer Reihe von Banken zusammen, und der eigentliche Grund, warum sie uns verwenden, ist, dass Sie uns nicht vertrauen müssen, dass wir uns ehrlich verhalten: Die Echtheitsnachweise können garantieren, dass wir die Daten nicht manipuliert haben. Natürlich können Sie das System neu erfinden und es unabhängig tun, aber in diesem Fall müssten Sie ein unternehmensfähiges HA-System von Grund auf neu erstellen (was Oraclize bereits ist), was viel Zeit und Geld kostet und sich bis zum 3. als zuverlässig erweisen müsste Parteien, mit denen Sie interagieren
"keine Notwendigkeit, uns zu vertrauen, dass wir uns ehrlich verhalten": Das ist nicht wahr. Bitte hör auf, das zu sagen.
@EdmundEdgar, es ist weitaus genauer und korrekter als einige Ihrer obigen Behauptungen (es ist nicht wahr, dass Oraclize häufig das Vertragsguthaben aufbrauchen kann, sehen Sie sich den Code oraclizeAPI.sol an). Die Echtheitsnachweise können verwendet werden, um festzustellen, ob eine bestimmte Behauptung von Oraclize manipuliert wurde oder nicht, und sind grundsätzlich überprüfbar. Das bedeutet, dass Sie mit Oraclize jederzeit überprüfen können, ob Oraclize sich ehrlich verhalten hat oder nicht - was keines der anderen Orakel bietet, was sie zum schwachen, nicht überprüfbaren Punkt des gesamten Systems macht (gebrochene Sicherheit).
@Artem Wenn sich Ihre Bank nicht auf Dritte verlassen möchte, um Daten abzurufen, aber dennoch eine Blockchain verwendet (wissen sie, dass sie Minern vertrauen müssen?), Ist Ethereum nicht rentabel, es sei denn, die Datenquelle, an der sie interessiert sind, passt sich an die Blockchain, um ecdsa-Signaturen bereitzustellen (oder tx selbst direkt an die Kette zu senden) - was sehr unwahrscheinlich ist, abgesehen von einigen bemerkenswerten Erwartungen wie dem Thomson Reuters Oracle (das Ihre Bank möglicherweise sehr interessieren könnte!).
@ThomasBertani Um sicherzustellen, dass ich verstehe, wie Orakel funktionieren: Sie müssen immer noch auf die Wahrhaftigkeit der Behauptungen von Oraclize vertrauen. Durch die Verifizierbarkeit kann nur sichergestellt werden, dass der Anspruch von Oraclize stammt und nicht nachträglich manipuliert wurde.
@silentser, das sind keine Echtheitsbeweise: Sie beweisen in der Tat, dass Daten authentisch sind (wie von der Datenquelle gemeldet) und dass der Orakelbetreiber (Oraclize) die Daten bei der Übermittlung nicht manipuliert hat

Die einfachste Erklärung, wie Orakel funktionieren, wäre ein Blick auf den Chainlink Runlog Initiator .

  1. Es wird ein Oracle-Vertrag bereitgestellt, der angibt, dass es sich um einen Oracle-Dienst handelt. Dies ist ein On-Chain-Vertrag.
  2. Ein Off-Chain-Service wird bereitgestellt. Dies wird in der ETH-Kette nicht sichtbar sein, aber es wird mit einer ETH-Wallet verbunden. Dies kann so etwas wie ein VM- oder Docker-Job sein , der API-Aufrufe durchführen kann.
  3. Diese VM/Off-Chain-Infrastruktur wird die ETH-Kette auf Transaktionen „überwachen“, die Daten enthalten, die sie identifizieren. Das „Orakel“ wird eine Kombination aus diesem On-Chain-Vertrag und diesem Off-Chain-Service sein.
  4. Ein weiterer Smart Contract erstellt eine Transaktion, die die spezifizierende ID dieses Orakels aufruft und beispielsweise Off-Chain-Daten über eine API anfordert.
  5. Unser Orakel sieht diese Transaktion und erstellt den API-Aufruf außerhalb der Kette. Wenn die Daten vom API-Aufruf zurückgegeben werden, erstellt das Orakel mit diesen Daten eine neue Transaktion in der Kette.
  6. Der Smart Contract, der die Daten ursprünglich angefordert hat, zieht nun Daten aus dieser neuen Transaktion.

Das ist es in einer sehr einfachen Nussschale. Sie werden feststellen, dass Sie Gas brauchen:

  1. Für Transaktionen (ETH)
  2. Für Orakel (LINK oder andere Krypto)