Mit Oracles bringst du externe Daten in eine Blockchain
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.
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.
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 …..