Blockchain kurz & gut - Kai Brünnler - E-Book

Blockchain kurz & gut E-Book

Kai Brünnler

0,0

Beschreibung

Der Begriff Blockchain steht für einen technologischen Durchbruch auf dem Gebiet digitaler Währungen. Das Konzept hinter diesem Begriff ist allerdings nicht einfach zu verstehen. Eine Blockchain ist eine Datenstruktur, die in kryptografischen Protokollen eingesetzt wird, um Sicherheit gegen bestimmte Angriffe zu gewährleisten. Ihr Sinn erschließt sich nur dann, wenn man diese Angriffe durchdacht hat. Nach einer kurzen Erläuterung der kryptografischen Grundlagen wird in diesem Buch deshalb der Aufbau eines Blockchainbasierten Protokolls von Grund auf nachvollzogen. Ausgehend von einem Protokoll, das jeder kennt, der schon einmal E-Banking benutzt hat, werden Schritt für Schritt Probleme aufgezeigt und gelöst und dabei neue Protokolle entwickelt – bis hin zu einer Blockchain. Abschließend werden mit dem gewonnenen Verständnis Anwendungsfälle von Blockchains identifiziert und auch ausgeschlossen. Sie lernen ausgewählte Blockchain-Anwendungen wie z.B. Zeitstempel für Dokumente, fälschungssichere Logs und verifizierbare Zufallszahlen kennen.

Sie lesen das E-Book in den Legimi-Apps auf:

Android
iOS
von Legimi
zertifizierten E-Readern

Seitenzahl: 83

Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:

Android
iOS
Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



Zu diesem Buch – sowie zu vielen weiteren O’Reilly-Büchern – können Sie auch das entsprechende E-Book im PDF-Format herunterladen. Werden Sie dazu einfach Mitglied bei oreilly.plus+:

www.oreilly.plus

Blockchain

kurz & gut

Kai Brünnler

Kai Brünnler

Lektorat: Ariane Hesse

Korrektorat: Sibylle Feldmann, www.richtiger-text.de

Fachgutachter: Peter Klicman, Martin Schönert

Satz: III-satz, www.drei-satz.de

Herstellung: Stefanie Weidner

Umschlaggestaltung: Michael Oréal, www.oreal.de

Bibliografische Information Der Deutschen Nationalbibliothek

Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.

ISBN:

Print978-3-96009-070-0

PDF978-3-96010-168-0

ePub978-3-96010-169-7

mobi978-3-96010-170-3

Dieses Buch erscheint in Kooperation mit O’Reilly Media, Inc. unter dem Imprint »O’REILLY«. O’REILLY ist ein Markenzeichen und eine eingetragene Marke von O’Reilly Media, Inc. und wird mit Einwilligung des Eigentümers verwendet.

1. Auflage

Copyright © 2018 dpunkt.verlag GmbH

Wieblinger Weg 17

69123 Heidelberg

Die vorliegende Publikation ist urheberrechtlich geschützt. Alle Rechte vorbehalten. Die Verwendung der Texte und Abbildungen, auch auszugsweise, ist ohne die schriftliche Zustimmung des Verlags urheberrechtswidrig und daher strafbar. Dies gilt insbesondere für die Vervielfältigung, Übersetzung oder die Verwendung in elektronischen Systemen.

Es wird darauf hingewiesen, dass die im Buch verwendeten Soft- und Hardware-Bezeichnungen sowie Markennamen und Produktbezeichnungen der jeweiligen Firmen im Allgemeinen warenzeichen-, marken- oder patentrechtlichem Schutz unterliegen.

Die Informationen in diesem Buch wurden mit größter Sorgfalt erarbeitet. Dennoch können Fehler nicht vollständig ausgeschlossen werden. Verlag, Autoren und Übersetzer übernehmen keine juristische Verantwortung oder irgendeine Haftung für eventuell verbliebene Fehler und deren Folgen.

5 4 3 2 1 0

Inhalt

Codebeispiele

1Grundlagen

Hashfunktionen

Digitale Signaturen

Digitales Bargeld

Digitale Zeitstempel

Proof-of-Work

2Die Blockchain

BankCoin

NaiveCoin

TransactionCoin

PublicAnnouncementCoin

ElectionCoin

Proof-of-Work-Coin

BlockchainCoin

IncentiveCoin

Bitcoin

3Anwendungen

Private Blockchains

Ein fälschungssicheres Speichermedium

Ein Zeitstempelmechanismus

Eine Quelle verifizierbarer Zufallszahlen

Ein nicht zu stoppender Computer

4Literatur

Index

Danksagung

Für hilfreiche Rückmeldungen zu Vorversionen dieses Buchs danke ich herzlich: Thomas Luder, Patrick Liniger, Regine Brünnler, Benjamin Fankhauser, Stephan Fischli, Pascal Mainini, Philipp Locher, Reto König.

Codebeispiele

Python 3. Dieses Buch nutzt gelegentlich Codebeispiele in Python 3. Sie dienen vor allem der Illustration und müssen nicht ausgeführt werden. Falls daran aber Interesse besteht: Für Windows kann Python auf https://www.python.org/downloads/ heruntergeladen werden. Für Linux installiert man es per Package Manager, z. B. bei Ubuntu 16.4 mit

sudo apt install python3

NaCl Library. Im Abschnitt über digitale Signaturen stellen wir eine konkrete Implementation eines Signaturschemas vor, nämlich aus der NaCl-Bibliothek mit ihren Python-Bindings [11, 15].

Für Windows installieren Sie die Bibliothek mit

C:\>pip install pynacl

Auf Ubuntu 16.4 installieren Sie sie wie folgt:

pip3 install --user pynacl

Gegebenenfalls müssen Sie vorher noch den Python-Paketmanager pip installieren:

sudo apt install python3-pip

Damit steht die Bibliothek zur Verfügung.

Hashcash. Im Abschnitt über Proof-of-Work nutzen wir das Hashcash Kommandozeilentool [3]. Auch dies dient vor allem der Illustration, und das Tool muss nicht selbst installiert werden. Falls daran aber Interesse besteht, kann es für verschiedene Plattformen von http://www.hashcash.org heruntergeladen werden.

Auf Ubuntu 16.4 kann es per Package Manager installiert werden:

$ sudo apt install hashcash

Reading package lists… Done

Setting up hashcash (1.21-1.1) …

KAPITEL 1

Grundlagen

Blockchains setzen zwei kryptografische Grundbausteine voraus, die wir am Anfang dieses Kapitels kennenlernen: kryptografische Hashfunktionen und digitale Signaturen. Beide sind verhältnismäßig einfach und gut erforscht. Leser mit entsprechendem Vorwissen sind eingeladen, die entsprechenden Abschnitte zu überspringen.

Dann werden wir sehen, wie man auf das berühmte Double-Spending-Problem stößt, wenn man versucht, mithilfe digitaler Signaturen digitales Bargeld zu schaffen. Das Double-Spending-Problem besteht darin, dass ein dezentrales Netzwerk bei zwei widersprüchlichen Transaktionen nicht ohne Weiteres zu einem Konsens darüber kommen kann, welche der beiden Transaktionen gelten soll. Die Blockchain ist in erster Linie eine Lösung dieses Problems.

Danach betrachten wir digitale Zeitstempel oder Timestamping. Zeitstempel sind zum einen eine gute Illustration der Sicherheitseigenschaften von Hashfunktionen und digitalen Signaturen. Zum anderen ist eine Blockchain im Kern eben eine dezentrale Timestamping-Methode: Wenn das Netzwerk die zeitliche Reihenfolge der beiden widersprüchlichen Transaktionen kennen würde, dann könnte es einfach die erste gelten lassen und die zweite verwerfen. Dann wäre das Double-Spending-Problem gelöst.

Dieser dezentrale Timestamping-Mechanismus beruht auf einem weiteren kryptografischen Konzept: Proof-of-Work. Proof-of-Work ist integraler Bestandteil einer Blockchain und bezeichnet eine Methode, mit der man beweisen kann, dass man eine bestimmte Rechenarbeit geleistet hat.

Proof-of-Work wurde schon vor der Erfindung einer Blockchain genutzt, zum Beispiel im sogenannten Hashcash-Protokoll, das dazu dient, Spam zu bekämpfen. Eine Einführung von Proof-of-Work beendet das Kapitel zu den kryptografischen Grundlagen.

Hashfunktionen

Eine Hashfunktion bildet eine Bitfolge beliebiger Länge auf eine Bitfolge fester Länge ab und ist effizient berechenbar.

Eine vielfach verwendete Hashfunktion ist SHA-256. Eine Implementation finden wir zum Beispiel in der Python-Standardbibliothek.

$ python3

Python 3.5.2 (default, Nov 17 2016, 17:05:23)

[GCC 5.4.0 20160609] on linux

Type "help", "copyright", "credits" or "license" for more

information.

>>>

>>> import hashlib

>>> print(hashlib.sha256(b"Satoshi Nakamoto").hexdigest())

a0dc65ffca799873cbea0ac274015b9526505daaaed385155425f7337704883e

>>>

Im gegebenen Beispiel wird der Hash der zugrunde liegenden Bitfolge des Strings SatoshiNakamoto berechnet. Die Funktion sha256() gibt ein Objekt zurück, das den 256-bittigen binären Ausgabewert der Hashfunktion enthält. Auf diesem wird dann die Funktion hexdigest() aufgerufen, die diesen Ausgabewert in Hexadezimaldarstellung zurückgibt.

Änderungen am Eingabewert führen mit an Sicherheit grenzender Wahrscheinlichkeit zu Änderungen am Ausgabewert. Wenn wir zum Beispiel das letzte Zeichen unseres Eingabestrings ändern, erhalten wir einen völlig anderen Hashwert:

>>> print(hashlib.sha256(b"Satoshi Nakamot0").hexdigest())

73d607aab917435d5e79857769996c95027d4e42172698e0776e1295e285730e

Eine mögliche Anwendung von Hashfunktionen ist das Erkennen von Übertragungsfehlern. Alice hat wenig Platz auf ihrem Laptop, sie will deshalb eine große Datei auf dem Server von Bob speichern und sie lokal löschen. Bevor sie die Datei auf den Server von Bob hochlädt, berechnet sie den Hashwert der Datei und speichert ihn lokal. So kann sie bei späterem Herunterladen der Datei erkennen, ob es zu Übertragungsfehlern gekommen ist: Alice berechnet den Hash der heruntergeladenen Datei und vergleicht ihn mit ihrem lokal gespeicherten Hash. Wenn beide gleich sind, kann Alice davon ausgehen, dass die Datei korrekt übertragen wurde.

Kryptografische Hashfunktionen. Eine kryptografische Hashfunktion ist eine Hashfunktion, die gewisse Sicherheitseigenschaften hat. Die beiden wichtigsten typischerweise geforderten Sicherheitseigenschaften sind die Einwegfunktionseigenschaft (englisch: preimage-resistance) und die Kollisionsresistenz (englisch: collisionresistance). Die Hashfunktion SHA-256 ist eine Einwegfunktion und auch kollisionsresistent.

Diese Definition lässt offen, was mit »praktisch unmöglich« gemeint ist. Eine mathematisch exakte Definition ist für unsere Zwecke zu aufwendig, aber wir bemerken Folgendes:

Es ist nicht unmöglich, einen Eingabewert zu finden, der auf einen gegebenen Ausgabewert abgebildet wird. Eingabewerte sind Bitfolgen. Wir können also wie folgt alle Eingabewerte aufzählen:

(leere Bitfolge), 0, 1, 00, 01, 10, 11, 000, … und so weiter.

Für jeden Eingabewert berechnen wir dabei seinen Hash und vergleichen diesen mit dem gegebenen Ausgabewert. Auf diese Weise finden wir mit Sicherheit irgendwann den passenden Eingabewert.

Aber wie praktikabel ist diese Methode? Für jeden Versuch liegt die Wahrscheinlichkeit, den richtigen Ausgabewert zu treffen, bei 2–256 ≈ 10–77. Selbst wenn eine GPU1 1010 Hashwerte pro Sekunde berechnet und alle 1010 GPUs der Welt 100 Jahre lang rechnen (rund 1010 Sekunden), ist die Wahrscheinlichkeit, dass sie diesen Ausgabewert treffen, immer noch praktisch gleich null (10–47).

»Praktisch unmöglich« in der obigen Definition heißt nun, dass kein wesentlich besseres Verfahren zum Finden eines passenden Eingabewerts bekannt ist als das soeben beschriebene.

Sofern Alice in unserem Beispiel eine Einwegfunktion benutzt, um den lokal gespeicherten Hashwert zu berechnen, kann sie sicher sein, dass niemand aus dem Hashwert den Dateiinhalt rekonstruieren kann. Wenn also zum Beispiel Charlie durch Zugriff auf Alice’ Laptop Kenntnis dieses Hashwerts erlangt, kann Alice sicher sein, dass der Dateiinhalt trotzdem vor ihm geheim bleibt.

Achtung!

Wenn der Raum der möglichen Eingabewerte klein ist, dann ist es auch bei einer Einwegfunktion trivial, den entsprechenden Eingabewert zu finden! Bei dem Eingabewert »Satoshi Nakamoto« aus unserem Beispiel ist das leider der Fall, er besteht lediglich aus zwei Wörtern. Die Anzahl möglicher Wörter liegt nur in der Größenordnung von etwa 106, bei zwei Wörtern haben wir also 1012 Möglichkeiten. Eine einzelne GPU durchsucht diesen Raum vollständig in nur etwa 100 Sekunden! Einwegfunktionen sind also nur dann sinnvoll anwendbar, wenn ihre Eingabewerte aus einem genügend großen Raum stammen. In der Praxis werden deshalb meist Zufallswerte an die Eingabewerte angefügt, bevor Hashfunktionen darauf angewendet werden.

Ähnlich wie bei der Einwegfunktionseigenschaft ist es auch hier zwar einfach, einen Algorithmus anzugeben, der eine Kollision finden kann, aber es ist kein Algorithmus bekannt, der bei sinnvoller Begrenzung der Rechenkapazität auch tatsächlich in nützlicher Zeit eine Kollision findet.

Kollisionsresistente Hashfunktionen sind im Allgemeinen auch Einwegfunktionen, aber nicht umgekehrt. Kollisionsresistent zu sein, ist also eine stärkere Anforderung an eine Hashfunktion, als eine Einwegfunktion zu sein. In wiederum anderen Worten: Die Kollisionsresistenz einer Hashfunktion zu brechen, ist einfacher, als ihre Einwegfunktionseigenschaft zu brechen. Intuitiv liegt das daran, dass ein Angreifer beim Finden einer Kollision mehr Freiheit hat als beim Finden eines zum Ausgabewert passenden Eingabewerts: Er kann beide Eingabewerte frei wählen.

Eine kollisionsresistente Hashfunktion lässt sich genau so zum Erkennen von Übertragungsfehlern anwenden wie eine beliebige Hashfunktion. Zusätzlich schützt eine kollisionsresistente Hashfunktion aber auch vor gezielten bösartigen Manipulationen. Wenn Bob Alice anstelle ihrer Datei eine Fälschung unterschieben will, muss die Fälschung ja denselben Hashwert haben wie Alice’ Datei, sonst erkennt Alice die Fälschung. Dazu muss Bob also eine Kollision in der Hashfunktion finden – was aufgrund ihrer Kollisionsresistenz praktisch unmöglich ist.

Es ist eine spannende Frage, wie denn nun Hashfunktionen designt werden, damit sie die genannten Sicherheitseigenschaften erfüllen. Interessierte Leser seien dazu an [14] verwiesen. Wir gehen darauf hier nicht ein, denn wir brauchen nur den Fakt, dass sie diese Eigenschaften erfüllen.

Digitale Signaturen

Digitale Signaturen sollen die Eigenschaften von physischen Unterschriften auf Papier für digitale Dokumente nachbilden. Eine digitale Signatur ist grundsätzlich einfach eine Bitfolge, die vom Absender mithilfe eines Signaturschemas für eine Nachricht erzeugt wurde. Typischerweise wird diese Signatur an die Nachricht angehängt