Ratgeber

Mit Oracles bringst du externe Daten in eine Blockchain

(Foto: DearKrisada/Shutterstock)

Will man für eine Blockchain-Anwendung Schnittstellen von externen Systemen einbinden, ist dies nicht ohne weiteres möglich. Hinter sogenannten Oracles verbirgt sich eine Technik, durch die externe Schnittstellen in die Blockchain eingebunden werden können. Dieser Artikel gibt euch einen Einblick in die Welt der Oracles und wie sie umgesetzt werden.

Eine Blockchain an sich ist ein geschlossenes System. Es kann nur auf Daten zugegriffen werden, die dem System in einer Transaktion mitgeteilt werden, oder die sich bereits auf der Blockchain befinden. Das liegt daran, dass jeder Knoten im Netzwerk eine Transaktion validiert. Wenn sich nun zwischen den einzelnen Validierungen die Daten ändern könnten, wäre es nicht mehr möglich, eine Transaktion als gültig anzusehen. Es gibt jedoch Anwendungsfälle, bei denen man explizit auf externe Daten zugreifen will. Um diese externen Daten an die Blockchain anzubinden, gibt es eine Technik, die sich Oracle nennt. Ein Oracle fungiert dabei als eine Art Schnittstelle, die zwischen dem Anbieter der externen Daten und der Blockchain sitzt.

Wofür werden Oracles benötigt?

Es gibt verschiedene Anwendungsfälle, bei denen ein Oracle sinnvoll ist. Zum Beispiel eine Versicherung auf Flugausfälle auf der Blockchain. Will man im Schadensfall die Versicherungssumme automatisch ausbezahlen, so kann ein Oracle für Flugdaten verwendet werden, um diese Zahlung auszulösen. Ein weiteres wäre das Auslösen einer Lieferung über die Blockchain. Wenn ein Kunde seine Bestellung über einen Smart Contract abgeschlossen hat, kann automatisch ein Oracle ausgelöst werden, das den Paketdienstleister benachrichtigt, dass eine Lieferung abgeholt werden kann.

Wie werden Oracles umgesetzt?

Um näher zu erläutern, wie Oracles technisch umgesetzt werden, verwenden wir als Beispiel ein Glücksspiel. Zwei Teilnehmer raten unabhängig voneinander eine Zahl zwischen 1 und 10. Im Anschluss wird eine Zufallszahl erzeugt. Derjenige, der näher an dieser Zahl liegt, gewinnt. Aus Vereinfachungsgründen betrachten wir lediglich den Prozess, wie die Zufallszahl angefragt und der Blockchain-Anwendung mitgeteilt wird.

Technisch setzen wir dieses Beispiel auf der Ethereum-Blockchain um. Grundsätzlich ist ein Oracle aber nicht technologiespezifisch. Das Konzept selbst kann auf viele verschiedene Blockchainsysteme angewendet werden.

Ein Oracle in Ethereum besteht aus zwei Teilen. Zum einen dem Smart Contract, der in der Ethereum Virtual Machine (EVM) ausgeführt wird und – in diesem Beispiel – einem Nodejs-Service, der sich mit dem Smart Contract verbindet.

Widmen wir uns zuerst unserem Smart Contract. Der folgende Solidity-Code stellt vereinfacht das Oracle dar.

contract RandomNumberOracle {  
   
    event RequestRandom();
    
    function requestRandom() public {
        emit RequestRandom();
    }
    
    function randomResponse(uint r) public {
        // do something
     } 
}

Schauen wir uns die einzelnen Teile genauer an. Zuerst wird der Contract mit dem Namen RandomNumberOracle angelegt. Er enthält die Definition für ein Event und zwei Funktionen. Die erste Funktion heißt requestRandom(). Dort wird das Event RequestRandom ausgelöst. Es ist wichtig für unseren Nodejs-Service, da wir dort darauf reagieren. Dazu gibt es noch die Funktion randomResponse(), die als Parameter eine Zahl entgegennehmen kann. Diese Funktion wird von unserem Nodejs-Service aufgerufen, sobald die Zufallszahl erzeugt wurde. Danach kann eine beliebige Aktion auf Basis der Daten ausgelöst werden.

Das entsprechende Gegenstück zu dem Smart Contract bildet der Nodejs-Service:

const Web3 = require('web3');
const path = require('path');
const RandomNumberOracleArtifact = require(path.join(__dirname,
'../build/contracts/RandomNumberOracle.json'));

const web3 = new Web3('ws://[ethereum node address]:[etherem node websocket rpc port]');

const account = [your account];
const address = [your oracle contract address];

const RandomNumberOracle = new web3.eth.Contract(RandomNumberOracleArtifact.abi, address);

RandomNumberOracle.events.RequestRandom()
  .on('data', () => {
    const random = Math.round(Math.random() * 10 + 1);
    RandomNumberOracle.methods.randomResponse(random)
      .send({
        from: account
      });
  });

Hier werden zuerst die grundlegenden Abhängigkeiten wie Web3 für die Verbindung auf den Ethereum-Knoten sowie Spezifikation und Bytecode für den Smart Contract geladen. Das eigentliche Oracle verbirgt sich hinter dem Ereignis RequestRandom. Dieses Ereignis wird von unserem Service gefangen und verarbeitet. Wir erzeugen daraufhin eine Zufallszahl und senden das Ergebnis an unseren Smart Contract zurück. Er kann dann im Anschluss die Information beliebig verarbeiten.

Fazit

Die beiden oben genannten Komponenten – der Smart Contract und der Nodejs-Service – bilden zusammen das Oracle für Zufallszahlen. Auf dieser Basis könnt ihr den Nodejs-Service beliebig erweitern, um jegliche Art von Daten in eurer Blockchain-Anwendung zu verarbeiten. Es gibt zusätzlich noch weitere Dienste, die bei der Anwendung von Oracles unterstützen. Der Service Oraclize stellt beispielsweise fertige Implementierungen für verschiedene Anwendungsfälle bereit und kann sehr einfach eingebunden werden. Darüber hinaus gibt es spezielle Blockchain-Systeme wie Aeternity, in denen Oracles bereits ein zentraler Bestandteil des Protokolls sind.

Bitte beachte unsere Community-Richtlinien

Wir freuen uns über kontroverse Diskussionen, die gerne auch mal hitzig geführt werden dürfen. Beleidigende, grob anstößige, rassistische und strafrechtlich relevante Äußerungen und Beiträge tolerieren wir nicht. Bitte achte darauf, dass du keine Texte veröffentlichst, für die du keine ausdrückliche Erlaubnis des Urhebers hast. Ebenfalls nicht erlaubt ist der Missbrauch der Webangebote unter t3n.de als Werbeplattform. Die Nennung von Produktnamen, Herstellern, Dienstleistern und Websites ist nur dann zulässig, wenn damit nicht vorrangig der Zweck der Werbung verfolgt wird. Wir behalten uns vor, Beiträge, die diese Regeln verletzen, zu löschen und Accounts zeitweilig oder auf Dauer zu sperren.

Trotz all dieser notwendigen Regeln: Diskutiere kontrovers, sage anderen deine Meinung, trage mit weiterführenden Informationen zum Wissensaustausch bei, aber bleibe dabei fair und respektiere die Meinung anderer. Wir wünschen Dir viel Spaß mit den Webangeboten von t3n und freuen uns auf spannende Beiträge.

Dein t3n-Team

2 Kommentare
Nils Bott
Nils Bott

Hallo,

Flugdaten abrufen, ja okay. Aber bei Zufallszahlen drängt sich da mir eine Frage an: Anknüpfend an oberen Beispiel: Wer näher an der Zufallszahl ist Gewinnt. Und natürlich unter Annahme mehrere unabhängiger Knoten. Würde das denn tatsächlich funktionieren: Jeder Knoten im Netzwerk führt die Transaktion erneut aus. Sei N die Anzahl der Knoten, so wird das Oracle N-mal angefragt/ausgelöst, und es sollten dann auch N-viele Zufallszahlen zurückkommen. Somit würden die Knoten kein eindeutigen Datenbestand mehr haben bzw. die Transaktion ungültig, da mal der eine und mal der andere Teilnehmer Ether (oder was auch immer) bekommen würde.

Oder verstehe ich an diesem Beispiel etwas falsch? Kann mir das nur so vorstellen, das für jede Transaktion/Spielrunde eine Id generiert wird, so dass das Oracle für eine Runde immer mit der gleichen Zufallszahl antwortet (So dass die Knoten die Transaktion validieren können und ein gemeinsames Datenmodell haben). Dies könnte jedoch dann ausgenutzt werden. Ich würde da gerne noch ein paar Erläuterungen haben, wie solche Sachen ausgeschlossen werden. Bzw. im Detail wissen, wie man sowas wie eine Zufallszahl mit Smart-Contract vereinbaren kann.

Antworten
Nils Bott
Nils Bott

Und noch ein Frage: Um das Event zu Empfangen muss ich lokal die Blockchain mitbetreiben. So das mein lokaler JS-Oracle auch das Event-Mitbekommet. Nun haben alle anderen Knoten in diesem Netzwerk dieses ZufallsOracle nicht. Sprich das Evnt wird zwar geworfen, aber folglich von den anderen Knoten ignoriert, da dort kein Oracle läuft. Müsste ich nicht das Oracle dann irgendwie fest ansprechen können (uuuhhhh Böse was zentrales in nem BC-Netz) …. mmhhh also so ganz hat sich mir das konzept dahinter nicht ergeben.

Andersrum kann ich mir das besser vorstellen (ist dann aber kein oracle mehr) – Flugbetreiber gibt im Vorraus seine Flugdaten in einem Smart-Contract an. Kunde Bestellt über den Smart-Contract – Nach ankunft wird ein Check aufgerufen, der prüft, ob alle Bedingungen eingehalten worden sind. Folgeleistungen werden ausgelöst etc …..

Antworten

Melde dich mit deinem t3n Account an oder fülle die unteren Felder aus.