Single Page Applications

am 26 Nov 2017 in Tech, WebDesign von
Bisher unkommentiert »

Wer ständig mit dem Internet zu tun hat und etwas aufmerksamer durch die
verschiedenen Internetseiten surft, wird etwas feststellen: Immer mehr Internetseiten sind
nicht mehr wie früher Aufgebaut als eine Ansammlung von Seiten, die miteinander
verlinkt sind, sondern es gibt nur noch eine einzelne Seite auf der alle gewünschten
Informationen zu sehen sind, oder nachgeladen werden.

Dass dies nicht nur ein Trend ist, dem nur wenige innovative Startups folgen, wird
durch die vielen Giganten im Internet deutlich. So ist zum Beispiel die komplette Seite von
Facebook zum Großteil eine Single Page Application, auch SPA genannt. Doch auch Gmail,
Google Maps, Twitter und dir fallen bestimmt noch mehr Seiten ein, sind alles SPA’s.

Doch warum wird diese Technik so häufig und gerne eingesetzt? Dies lässt sich leicht
durch die vielen Vorteile, die eine SPA mit sich bringt nachvollziehen. Denn unter anderem
verringert eine solche Internetseite die Serverlast des Betreibers enorm. Die eigentliche Seite
wird nur einmal heruntergeladen und anschließend müssen nur noch Informationen, Texte
und Bilder nachgeladen werden. Es müssen nicht bei jeder Navigation alle Skripte, Header
und Stylesheets der Seite neu geladen werden. Dies bringt einen großen Vorteil für Seiten, die
sehr große Benutzerzahlen zu verzeichnen haben. Ein weiterer Nutzen bringt das SPA-Paradigma bei Seiten die hohe Interaktivität zwischen dem Benutzer und der Anwendung
benötigen. Hier kann eine solche Seite wie eine typische Desktopanwendung auftreten, sodass
man garnicht mehr das Gefühl hat, im Internet unterwegs zu sein. Dies ist zum Beispiel bei
Google Docs der Fall.

Wenn wir jetzt die Vorteile einer SPA wissen, müssen wir jetzt nur noch mehr über die
technische Realisierung einer solchen Web-App erfahren. Ermöglicht werden diese Art von
Internetseiten nur durch JavaScript oder andere auf clientseitig laufende Skripte.
Hierbei ist der Begriff AJAX der Kern einer jeden SPA. Denn nur durch AJAX
(Asynchronous JavaScript and XML) ist es möglich, Inhalte dynamisch nachzuladen,
nachdem die Seite fertig geladen wurde. Dazu gibt es auch immer mehr mächtige
Frameworks, die eigens dafür entwickelt wurden. So sind AngularJS, React oder Backbone.js
nur die Bekanntesten unter den vielen Verfügbaren.

Da wir jetzt auch die Technik dahinter verstehen, sollten wir uns aber noch über die
Nachteile einer SPA im Klaren sein. Denn ein großes und nicht zu vernachlässigendes Manko
ist die Suchmaschinenoptimierung einer Single Page Application. Da der komplette Inhalt
der Seite nicht sofort beim aufrufen der Seite verfügbar ist, können die meisten Crawler nicht
alle Inhalte erfassen, die die Seite zur Verfügung stellt. Außerdem wird beim Klick auf einen
Link keine neue Seite geladen, da alle Inhalte nur nachgeladen werden und es im
wesentlichen nur eine Seite gibt. Daher sollte bei Firmenseiten oder ähnlichem auf eine SPA
verzichtet werden. Denn eine solche Seite ist im Normalfall nicht bei den obersten
Suchergebnissen gelistet.

Folglich sollte genauestens überlegt werden, was die Ziele einer Seite sind, bevor die
eigene Seite als Single Page Application gebaut wird. Kann der SEO-Faktor vernachlässigt
werden, oder ist viel Interaktion gefragt, so kann getrost auf bekannte Frameworks wie
AngularJS gesetzt werden. Ist jedoch ein gutes SEO-Ranking erforderlich, so sollte von dieser
Technologie abgeraten werden und eher eine Seite im klassischen Stil entwickelt
werden.

Quellen

http://www.dtelepathy.com/blog/design/8-reasons-why-pageless-design-is-the-future-of-the-web
http://t3n.de/news/single-page-webdesign-beispiele-323225/
http://singlepageappbook.com/goal.html
https://de.wikipedia.org/wiki/Single-Page-Webanwendung
https://blog.secu-ring.de/software/single-page-applications-loesung-fuer-probleme/
http://www.flyacts.com/blog/seo-und-spa-single-page-applications-unvereinbar-oder-unzertrennlich/

FloNET – evolutionäres Lernen

am 26 Nov 2017 in Aktuelles, Tech von
Bisher unkommentiert »

Vor ca. Einem Jahr beschloss ich, herauszufinden wie man Neurale Netzwerke benutzt um Intelligente Programme programmieren zu können. Das Thema künstliche Intelligenz ist ein Thema, das in Zukunft immer mehr Teil unseres täglichen Lebens wird, daher ist es sicher kein Fehler, etwas Wissen in diesem Gebiet zu haben. Umso erfreuter war ich, als ich ein Video mit dem Titel “Deep Learning without an PhD” fand, anscheinend eine einfache Anleitung als Videoform. Als ich jedoch bereits nach wenigen Minuten gar nichts mehr verstand, stellte ich das Thema Neurale Netzwerke ersteinmal hinten an. Etwas später fand ich diesen Artikel (Den Blog kann ich übrigens nur wärmstens empfehlen!). Dort wird auch unter anderem beschrieben, wie ein Gehirn grundsätzlich funktioniert. Auf Basis von diesem Wissen konnte ich dann eine eigene Version eines Neuralen Netzwerks programmieren.

Funktionsweise

Die Funktionsweise meiner Version ähnelt teilweise verbreiteten Methoden, jedoch gibt es auch einige Unterschiede. Ich werde im Folgenden meine Version beschreiben, doch der Grundgedanke eines Neuralen Netzwerks ist überall der selbe.

Das Neuron

Ein Neuron ist der kleinste Teil eines Neuralen Netzwerks, und damit auch von unserem Gehirn. Ob ein Neuron ein Signal weitergibt, das es erhalten hat, hängt davon ab wie stark es aktiviert wurde. Wurde das Neuron oft genug und mit genug Energie aktiviert, gibt es irgendwann einen Impuls an weitere Neuronen weiter.

In diesem Bild ist ein Neuron dargestellt, wie ich es in meiner Implementierung benutze. Von der vorherigen Schicht übergibt ein Neuron in diesem Beispiel einen Wert von 1.3 an das Neuron. Dieses würde nun null weitergeben, da der Threshold-Wert von 2.1 nicht überschritten wurde. Jedoch übergibt ein zweites vorheriges Neuron zusätzlich noch den Wert 1.8. Das Neuron addiert alle Werte, die es bekommt, und vergleicht es mit seinem Threshold Wert. In diesem Fall wurde er überschritten, weshalb das Neuron seinen festgelegten Outputwert weiterreicht. Dieser ist für jedes Neuron individuell, genau wie sein Threshold-Wert. Durch diese parametergesteuerte Interaktion können einfache Logikoperationen ausgeführt werden.

Das Netz

Das Netz besteht aus vielen verbundenen Neuronen, wie es oben beschrieben wurde. In diesem Beispiel besitzt das Netz 3 Inputfelder/Neuronen. Diese Werte werden von dort an die erste Reihe an Neuronen weitergeleitet. Dieses Netz besitzt 3 sogenannte “hidden layers”. Diese sind für die Berechnung der Outputwerte zuständig, in diesem Fall sind es 2. Alle Parameter können frei gewählt werden, und an das jeweilige Szenario angepasst werden.

Wie geeignet, oder “intelligent”, ein Netz ist, hängt davon ab, wie die Parameter der einzelnen Neuronen gewählt werden. Dann sind gängige Machine Learning Aufgaben wie Bild- oder Spracherkennung möglich. Auch wenn diese modellhaften Netze nicht exakt dem eines Gehirns nachempfunden sind, sind sie doch recht ähnlich. Das heißt, mit den richtigen Parametern müssen sehr intelligente Systeme möglich sein, da uns das biologische Vorbild beweist, was mit einfacher Signalübergabe möglich ist.
Doch diese Parameter des Netzes müssen erst einmal bestimmt werden. Mit zufälligen Parametern wird das Netz nur zufällige Ausgaben machen, die niemandem etwas Nützen. Die größten Unterschiede zwischen verschiedenen Machine Learning Methoden liegen genau hier, bei dem kritischen Teil. Komplexe Methoden, versuchen zum Beispiel, zu analysieren, welche Parameter besser zum Ziel verholfen haben, und welche nicht, und passt diese entsprechend an. Dies ist jedoch mathematisch sehr komplex, weshalb ich mich für eine andere Methode entschied:

Evolution

Ich verwende Auslese und Mutation, wie sie aus der Darwinistischen Evolutionstheorie stammt, um die Fitness meiner Netze zu steigern. Zu Beginn generiere ich eine festgelegte Anzahl an Netzen. Die Netze sind in ihren Netzeigenschaften gleich, jedoch werden alle Parameter der Neuronen zufällig bestimmt. Dazu gehören die Parameter maxX, outX und welche Neuronen miteinander verbunden sind. Zu diesem Zeitpunkt wird mit sehr hoher Wahrscheinlichkeit kein Netz ansatzweise einen Zweck erfüllen. Jedoch teste ich trotzdem jedes Netz, und bestimme einen Fitness-Wert. Dieser sagt aus, wie gut das Netz abgeschnitten hat. Habe ich zu jedem Netz eine Bewertung, kann ich beginnen, die nächste Generation vorzubereiten. Dafür sind 3 Schritte notwendig:

  1. Auslese
    Die Netze, die in der Rangliste in der unteren hälfte sind, werden gelöscht. (Das Gegenstück in der Realität wäre einen Darwin-Award zu gewinnen)
  2. Mutation
    Die Plätze, die durch die Auslese frei geworden sind, werden ersetzt durch neue Netze. Diese sind mutierte Versionen der Netze, die in der Rangliste die obere Hälfte besetzen. Bei einem Mutationsvorgang werden die Parameter der Neuronen leicht abgewandelt. So entsteht ein Netz, das teilweise neue Eigenschaften besitzt, zum Größten Teil jedoch noch dem Vorfahren-Netz entspricht. Die Mutation findet unter bestimmten Parametern statt, die angeben wie wahrscheinlich eine Mutation ist, und wie stark sich diese Auswirkt.
  3. Frisches Genmaterial
    Da die Netze mit jeder Generation ähnlicher werden, kann es sein dass sie sich in eine bestimmte Richtung entwickeln, von wo keine Möglichkeit zu einer Lösungsfindung vorhanden ist. Deshalb werden mit jeder Generation wenige Verlierer ersetzt durch komplett neu zufällig generierte Netze.

Löst ein Netz eine Aufgabe besonders gut, wird es auch in der nächsten Generation vorhanden sein. Es wird erst aussortiert werden, wenn es von vielen anderen Netzen in der Fitness überholt wurde, Zum Beispiel durch Mutationen von sich selbst, die kleine Verbesserungen aufweisen. Auf diese Weise werden die Parameter immer besser gewählt. Dieser Evolutionäre Lernvorgang wird dann beendet, wenn die Ergebnisse zufriedenstellend sind. Das Gewinner Netz der letzten Generation kann nun alleine verwendet werden, um Aufgaben zu lösen. Da die Rechnung, die in einem Netzwerk passiert auf einfachen Rechnungen basiert, ist die Endlösung auch relativ performant.

Diese Art des Lernens ist im Vergleich mit anderen Lernmethoden nicht sehr elegant, da es zum Großteil auf Zufall und “trial and error” basiert.

Implementierung: Autonomes Fahren

Um FloNET zu testen habe ich in Unity eine Umgebung gebaut, in der Fahrzeuge durch Hindernisparcours navigieren können. Jedes Fahrzeug besitzt fünf Sensoren, die in Unterschiedlichen Winkeln den Abstand zu einer Wand angeben. Diese fünf Abstände werden an das Neurale Netz weitergegeben, das dem Fahrzeug zugeordnet ist. Das Netz bestimmt basierend darauf den Wert, der das Fahrzeug steuert (Lenkung) Dafür wählte ich Netze mit drei hidden layers, sechs Neuronen in einem layer, fünf Inputs und einem Output. Jede Generation besteht aus 20 Fahrzeugen, die gleichzeitig Gegeneinander antreten. Kollidiert ein Fahrzeug mit einer Absperrung, bleibt es stehen. Ist die Zeit des Testlaufs um, wird die nächste Generation generiert. Als Fitnesswert wird die gefahrene Distanz der Fahrzeuge benutzt.

In dem Video ist ein Lernvorgang zu sehen, wie diese Fahrzeuge über mehrere Generationen immer weniger kollidieren, bis sie irgendwann die Teststrecke komplett durchqueren können.
Leider ist das Interface sehr unübersichtlich, doch manche Bezeichnungen solltest du aus dem vorherigen Text wiedererkennen können. Ab 1:20 sind die fühlerartigen Abstandssensoren als rote Linien zu erkennen.
In diesem Versuch ist es bereits nach zwölf Generationen gelungen, ein paar Netze zu erzeugen, die die Teststrecke durchqueren können. In diesem Fall war sehr früh ein Netz dabei, das bereits in den Grundzügen die Fähigkeit besaß, Hindernissen auszuweichen. Dies bringt die Evolution schneller voran. Doch auch mit weniger Glück sind die Netze spätestens nach 20 Generationen in der Lage, sicher zu navigieren.

Fazit

Der Ansatz über Evolution intelligente Systeme zu schaffen, halte ich für sehr vielversprechend, da wir Menschen auch ein Produkt der Evolution sind. FloNET ist in seiner Funktionalität sehr eingeschränkt, außerdem ist es mit PHP als Sprache nicht sehr performant. Ein großer Teil der außerdem noch zum biologischen Vorbild fehlt, ist die Fähigkeit, dass sich das Netz selbst anpassen kann. Die hier generierten Netze lernen nicht mehr, sobald sie eingesetzt werden.

Das Konzept von evolutionärem Lernen ist nicht neu, wie ich später feststellen musste. Es gibt bereits viele Beispiele im Internet. Dort habe ich mir dann auch die Idee abgeschaut, Fahrzeuge selbstständig fahren zu lassen.
Ich denke jedoch, dass es eine gute Demonstration ist, wie mächtig evolutionäre Algorithmen sein können. Ich denke dass es nicht die Lösung für Künstliche Intelligenz ist, jedoch glaube ich, dass es als Werkzeug sehr nützlich sein kann. So könnte man zum Beispiel spezielle Netze, die eigene Neuronenverbindungen herstellen können, nach ihrer Lernfähigkeit bewerten und evolutionär verbessern.

Falls du Interesse hast, FloNET zu benutzen, kannst du das gerne tun. Alle PHP Scripte findest du in dem Repository.

Kollaboration über Microsoft Sharepoint

am 26 Nov 2017 in Aktuelles, Tech von
Bisher unkommentiert »

Sharepoint ist eine “Enterprise-Platform” von Microsoft, welche für Geschäftsanwendungen entwickelt wurde. Es bietet ein breites Portfolio an nützlichen und produktivitätssteigernden Funktionen für große und kleine Unternehmen.

Die Vorzüge von Sharepoint

Verbesserung der Teamproduktivität

Sharepoint beinhaltet viele Anwendungen innerhalb eines Systems, darunter zählen unter anderem Teamsites für die Kollaboration innerhalb eines Teams, eine umfangreiche Funktion zur Dokumentenablage und -organisation, sowie Benachrichtigungsfunktionen für Inhalte etc.

Umfangreiche Berechtigungsstruktur

Innerhalb von Sharepoint gibt es die Möglichkeit, die Berechtigungen nach Belieben anzupassen. So beschränken sich die Berechtigungsstufen nicht nur auf das Lesen, Schreiben und Löschen, sondern es sind sogar komplett eigene Berechtigungen einstellbar. Hierbei können die Berechtigungen vom Elternobjekt auf alle Subsites vererbt werden, oder, je nach Bedarf, auf einzelne Listen und Dokumenten spezifizierte Berechtigungen vergeben werden. Es ist auch möglich User-Gruppen zu erstellen (z. B. Abteilung, Team, Projektverantwortliche etc.).

Projektmanagement ohne Umwege

Durch sog. “Project Sites” hat man bereits wichtige Tools für das Projektmanagement auf einem Blick. Durch Features wie die Timeline, die einem die wichtigen Termine im Projektverlauf grafisch darstellt, kann es den Benutzern vereinfacht werden, das ganze Projekt im Überblick zu behalten. Die benutzerdefinierten Listen besitzen ein quasi unbegrenztes Potential für mögliche Projektmanagement-Maßnahmen.

Firmenweite Suchfunktion

Gerade bei großen Unternehmen ist es oft schwierig, bestimmte Dokumente zu finden, was zum Teil mit einem recht großen Zeitaufwand in Verbindung steht. Sharepoint bietet eine umfassende Suchfunktion, die – wenn sie richtig kalibriert ist – die Suchzeit auf ein Minimum reduziert.

Exzellente Dokumentenablage

Sharepoint ist eine hervorragende Plattform um Dokumente abzulegen und ist Netzwerklaufwerken überlegen. So kann man innerhalb einer Sharepoint Teamsite Dokumente jeglicher Art ablegen und kategorisieren. Ein besonderes Augenmerk wird hierbei auf Dateien aus Microsoft-Programmen gelegt (Word, Excel etc.). Diese sind direkt bearbeitbar und es besteht sogar die Möglichkeit Dokumente auszuchecken und zu versionieren, was die Kollaboration vereinfacht.

Möglichkeiten für ein Social Intranet

Da Sharepoint ein Web Content Management System ist, ist es damit ohne Weiteres möglich, ein Intranet innerhalb des Systems zu erstellen. Es gibt bei Sharepoint keinen vorgegebenen Seitenaufbau, denn das Layout aller Sites ist frei anpassbar. Durch einige soziale Funktionen, wie einer eigenen Profilseite (sog. “MySite”), sowie Likes und Kommentarfunktionen bietet Sharepoint eine optimale Basis für Firmenintranets. Durch die Anbindung an das Microsoft Active Directory, einem Nutzer-Verwaltungssystem, das mit Windows zu einem System mit einem Single-Sign-On kombiniert werden kann, werden Zugriffsprobleme ausgeschlossen.

Einfache Handhabung für Anwender

Microsoft Sharepoint hält sich an das Microsoft-typische Oberflächendesign, welches man bereits von Software wie Microsoft Word oder Microsoft PowerPoint kennt. Selbst für User, die mit Microsoft-Software nicht vertraut sind, bietet Sharepoint durch das minimalistische Design für den Endanwender dennoch eine hohe Benutzerfreundlichkeit. Nachdem eine Teamsite in Sharepoint angelegt wurde, besteht kaum Verwaltungsaufwand, was der Produktivität zugute kommt.

Anwendung von Geschäftsprozessen

Über Sharepoint ist es möglich, Geschäftsprozessen eine Form zu geben. Es gibt z. B. Möglichkeiten, Mitarbeiterbefragungen durchzuführen, was nur eine von vielen Anwendungen ist. Auch Aufgaben wie das Darstellen der Urlaubsplanung sind in Sharepoint mit Listen oder Zeitleisten durchführbar. Durch individuelle Workflows und Freigabeprozesse sind auch zusammenhängende Tätigkeiten standardisiert anlegbar. Ein Beispiel hierfür wäre die Anlage von neuen Mitarbeitern, welches mehrere Schritte beinhaltet (Mitarbeiter im HR anlegen, Hardware-Ausstattung, Zugänge anlegen etc.) und sich deshalb über mehrere Abteilungen erstreckt.

Automatisiertes Software Testing

am 24 Nov 2017 in Tech von
Bisher unkommentiert »

An allen Ecken und Enden wird derzeit über automatisiertes Software Testing gesprochen, vor allem wenn es um die Steigerung von Qualität von Software geht, führt wenig an diesem Thema vorbei.
Als angehender Entwickler weißt du bereits wie wichtig Tests für deine Software sind! Richtig? Wenn nicht lass dir gesagt sein, solltest du keine Tests schreiben wirst du in Schwierigkeiten bekommen. Vielleicht nicht zum Zeitpunkt der Fertigstellung des Projektes, aber spätestens, wenn das Stück Software, dass du geschrieben hast, gewartet oder erweitert werden muss. Die Wahrscheinlichkeit für Probleme steigt noch stärker, wenn mehrere Entwickler an dem Projekt arbeiten. Musst du dann Änderungen vornehmen funktionieren andere Teile der Software vielleicht nicht mehr, ohne dass du es merkst. Im schlimmsten Fall merkt es jemand anderes. Und das sind Situationen, die wohl keiner gerne durchlebt.
Wie kann man diese Situationen nun vermeiden? Durch Tests. Genauer: durch automatisierte Tests, die nach jeder Änderung am Code gestartet werden und alles neu hinzugekommene und bereits vorhandene in den verschiedenen Klassen testen.
Einen guten Anfang für automatisierte Tests bilden Unittests. Dies sind Tests die genau eine Funktion einer Klasse testen. Ziel ist die Sicherstellung, dass diese alleine funktionieren und in verschiedenen Fällen das jeweils korrekte, erwartete, Ergebnis liefern.
Unittests erfüllen deshalb die folgenden Eigenschaften:

  • Mit Unittests wird Code isoliert getestet von anderem Code in der Applikation sowie von externen Abhängigkeiten und Events.
  • Unittests sind wiederholbar und vorhersehbar. Das bedeutet ändert sich nichts am Code oder dem Test selbst wird das Ergebnis auch immer gleichbleiben.
  • Unittests sind unabhängig, sie funktionieren egal in welcher Reihenfolge sie Aufgerufen werden. Muss eine Reihenfolge eingehalten werden, ist bei der Implementierung etwas falsch gelaufen.

Neben Unittests gibt es auch andere Tests die automatisiert werden können. Dazu gehören unter anderem Integrationstest und UI-Tests.
Welche Tests sind nun am wichtigsten? Alle sind wichtig. Ein guter Anfang sind Unittests und wichtig beim automatisierten Testen ist es einfach anzufangen. Mit der Zeit wird das Formulieren und Schreiben von Test immer einfacher und schneller gehen. Die Qualität eures Codes wird steigen und die Projekte insgesamt etwas besser laufen.

Test Driven Development

am 24 Nov 2017 in Tech von
Bisher unkommentiert »

Das Testen seines geschriebenen Codes ist wichtig. Aber wie kann man das Testen effektiv und effizient in die täglich anfallenden Entwicklungsarbeiten einbinden? Eine Methode die dies ermöglicht ist die Testgetriebene Entwicklung (Test Driven Development – TDD).

Bevor eine Zeile Funktionaler Code geschrieben wird, muss bereits ein Test für diesen Code, vorhanden sein. Der Test wird voll ausformuliert, wird jedoch zu Beginn fehlschlagen, da der zu testende Code noch nicht geschrieben wurde. Steht der Test kann mit dem eigentlichen Code angefangen werden. Es wird mit so wenig wie möglich Code versucht die Anforderungen umzusetzen und den Testfall damit zu bestehen. Anschließend wird versucht den Code weiter zu verbessern und Code Smells zu beseitigen.

Beim ersten Lesen der Beschreibung und betrachten des Schaubildes sieht das nach mehr Arbeit aus. Einfacher und Zeit schonender wäre es doch wie gewohnt den Code einfach runter zu schreiben? Das ist aber nur auf den ersten Blick der Fall und wenn überhaupt auf die initiale Entwicklung bezogen. Durch TDD entsteht von Beginn an vollständig getesteter Code, der qualitativ hochwertiger ist und nur das macht was in den Anforderungen beschrieben wurde. Müssen nun Änderungen am Code vorgenommen werden, können diese über die bereits bestehenden Tests direkt und ohne zusätzlichen Aufwand verifiziert werden. Das spart auf lange Sicht Zeit in der Entwicklung von zusätzlichen Features oder dem finden und beseitigen von Bugs.

Fazit

TDD sollte nicht als testen von Software verstanden werden. Es sollte als Methode bzw. als Werkzeug gesehen werden um in kleinen Schritten soliden Code zu produzieren. Fehler in der Entwicklung können dadurch vermieden bzw. früh erkannt werden.

Es einfach mal versuchen wird auf jeden Fall nicht schaden, also viel Spaß dabei.

Einstieg in die Blockchain Technologie

am 28 Okt 2017 in Aktuelles, Tech von
Bisher unkommentiert »

Spätestens seit ihrem Höhenflug im Sommer 2017 ist die Kryptowährung „Bitcoin“ wieder in aller Munde. Im Windschatten des Hypes gewinnt jedoch auch ein anderer Begriff an Bekanntheit: die „Blockchain“. Was die Blockchain ist und welche Probleme sie löst, das soll dieser Beitrag möglichst anschaulich erläutern (das TL;DR findet ihr am Ende des Beitrags).
Bevor wir uns der Blockchain-Technologie selbst widmen, müssen wir zunächst verstehen, welche Probleme sie lösen soll. Ein einfach zu verstehendes Beispiel dafür sind Systeme, die Besitzrechte abbilden (z.B. Hausbesitzer). Systeme, die Besitzrechte speichern, können als sog. Transitionssystem modelliert werden. Ein Transitionssystem besteht aus Zuständen und Übergängen zwischen diesen Zuständen, den Transitionen.

 

Transition

 

System Grundbesitz

Betrachten wir das System „Grundbesitz” genauer. Ein Zustand umfasst hier die Information darüber, welche Grundstücke im System (bspw. einem Neubaugebiet) existieren und wem sie gehören. Wechselt ein Grundstück den Eigentümer (in der Regel durch Verkauf), ist das eine Transition, die wiederum einem neuen Zustand zur Folge hat.

Damit dieses System funktioniert, müssen sich jedoch vor jeder Transition alle Parteien über den aktuellen Zustand einig sein. Sprich: Bevor ein Grundstück verkauft wird, müssen sich alle einig sein, wem es gerade gehört. Sonst ist es möglich, dasselbe Grundstück mehrfach zu verkaufen – das sog. “Double-Spend-Problem”.

Das “Double-Spend-Problem”

Stellen wir uns folgendes Szenario vor: Mallorys Grundstück mit der Nr. 42 steht zum Verkauf (Zustand A). Alice möchte das Grundstück kaufen und bezahlt Mallory dafür den geforderten Preis (Transition). Damit ist Alice die neue Eigentümerin von Grundstück Nr. 42 (Zustand B). Oder?

 

Transition

 

Bob hat ebenfalls ein Auge auf Grundstück Nr. 42 geworfen. Davon, dass Mallory es gerade an Alice verkauft hat, weiß er jedoch nichts – es gehört seines Wissens immer noch Mallory. Die nutzt dieses Missverständnis aus und verkauft Bob ebenfalls Grundstrück Nr. 42.

 

Transition

 

Die Konflikte, die sich daraus ergeben, sind ersichtlich:

  1. Mallory hat dasselbe Grundstück zweimal verkauft.
  2. Alice und Bob sind sich nicht einig darüber, wem Grundstück Nr. 42 jetzt gehört.

Man könnte auch sagen: Ihre jeweiligen Systemzustände sind nicht kompatibel.

 

Konflikt Systemzustände

 

Dieses System funktioniert also ganz offensichtlich nicht. Solange die Möglichkeit besteht, dasselbe Grundstück mehrmals zu verkaufen, wird sich niemand auf einen Handel einlassen.
Damit unser einfaches Grundbesitz-System funktioniert, müssen nämlich folgende
Voraussetzungen erfüllt sein:

  1. Alle Parteien müssen sich über den aktuellen Systemzustand einig sein
  2. Alle Parteien müssen sich über die Validität einer Transition einig sein

Wir brauchen also jemanden (oder etwas), das dafür sorgt, dass diese Bedingungen gegeben sind.

Zentrale Autoritäten (und warum sie keine gute Lösung sind)

In der Realität kümmert sich darum das Grundbuchamt. Das Grundbuchamt kontrolliert als zentrale Autorität den Zustand des Systems (das Grundbuch) und überprüft jede Transition (Kauf bzw. Verkauf eines Grundstücks) auf seine Validität. Auch in der Finanzwirtschaft gibt es eine zentrale Autorität: Banken kontrollieren Konten und ihre Kontostände (Zustand) sowie die Validität jeder einzelnen Kontobewegung (Transition).

Die Existenz einer zentralen Autorität im System bringt aber neue Probleme mit sich.

So bieten sie durch ihre mächtige Rolle im System grundsätzlich Möglichkeiten für Manipulation und Zensur. Der Online-Bezahldienst PayPal etwa sah sich in der Vergangenheit immer wieder Zensur Vorwürfen ausgesetzt, besonders nach der kontroversen Sperrung des Kontos der Wau-Holland-Stiftung, über die ein Großteil der Spenden an die Enthüllungsplattform WikiLeaks geflossen war. Zentrale Autoritäten machen das System zudem angreifbar, denn sie sind per definitionem ein “Single Point of Failure”. Im Risikomanagement bezeichnet man so den Systembestandteil, dessen Ausfall den Ausfall des ganzen Systems nach sich zieht.

Wir suchen also nach einer Lösung, die

  • Konsens über den aktuellen Systemzustand herstellt,
  • die Validität einer Transition überprüft,
  • eine dezentrale Struktur hat und
  • im Internet funktioniert (duh).

Ein solches System existiert – die Blockchain.

Blockchain – The General Idea

Blockchain wurde 2008 als integraler Bestandteil der Referenzimplementierung von Bitcoin von der Person oder Gruppe hinter dem Pseudonym “Satoshi Nakamoto” entwickelt (dessen geheime Identität einen eigenen Beitrag füllen könnte).

Die Blockchain ist ein öffentliches, dezentrales Register (vgl. Datenbank), in dem sämtliche jemals vorgenommenen Transaktionen protokolliert werden. Öffentlich und dezentral deshalb, weil jeder Netzwerkteilnehmer eine vollständige Kopie der Blockchain besitzt. Wenn eine der Kopien verändert wird, werden diese Änderungen an alle anderen Kopien im Netzwerk weitergegeben. Damit ergibt sich ein dynamisches Protokoll aller Transaktionen, das auf den Computern aller Netzwerkteilnehmer redundant gespeichert wird.

 

dezentrales Blockchain Netzwerk

 

Stellen wir uns erneut vor, Mallory verkauft Alice ihr Grundstück Nr. 42. Der Verkauf ist eine neue Transaktion und Mallorys Rechner teilt sie dem Blockchain-Netzwerk mit. Jeder Rechner, der die neue Transaktion erhält, prüft sie auf Validität und gibt sie dann im Netzwerk weiter. So verbreitet sich die Transaktion im gesamten Netzwerk, bis sie jeden Teilnehmer erreicht hat.

Als Miner bezeichnet man einen Netzwerkteilnehmer, der neue Transaktionen sammelt und sie zu einem Block zusammenfasst. Dabei darf ein Block nur valide Transaktionen enthalten, die früheren Transaktionen nicht widersprechen. Der fertige Block wird erneut dem gesamten Netzwerk mitgeteilt und jeder Teilnehmer prüft, ob der neue Block mit der bisherigen Blockchain zusammenpasst. Wenn der Block als valide anerkannt wird, wird er Bestandteil der kollektiven Blockchain und die Transaktionen darin gelten als bestätigt.

Die Blockchain

 

Sollte Mallory nun versuchen, Grundstück Nr. 42 zweimal zu verkaufen, würde diese Transaktion zwar den anderen Netzwerkteilnehmern mitgeteilt, aber von ihnen als invalide abgelehnt und nicht in einen neuen Block aufgenommen.

Doch was hindert Mallory (oder jeden anderen Netzwerkteilnehmer) daran, selbst als Miner zu fungieren, ihre eigenen (invaliden) Blöcke in Umlauf zu bringen und damit verschiedene, widersprüchliche Versionen der Blockchain zu erzeugen?

Schutz vor Manipulation: der “Proof of Work”

Grundsätzlich kann tatsächlich jeder im Netzwerk als Miner fungieren und neue Blöcke berechnen. Das Protokoll schreibt jedoch vor, dass ein Miner nachweisen muss, dabei ein bestimmtes Maß an Rechenleitung (und damit Zeit) aufgewendet zu haben, damit sein produzierter Block als valide gilt.. Dieses Konzept nennt man “Proof of Work”, zu deutsch etwa “Arbeitsnachweis” und es verhindert, dass ein einzelner Miner in kurzer Zeit viele neue Blöcke erzeugen und an die Blockchain anknüpfen kann.

In der Praxis muss ein Miner ein mathematisches Problem lösen, indem er in unzähligen Versuchen zufällige Zahlen in eine Formel einsetzt, bis er auf ein vorgegebenes Ergebnis kommt. Die Schwierigkeit dieses Problems wird vom System so geregelt, dass im Schnitt alle zehn Minuten ein zufälliger Miner im Netzwerk das korrekte Ergebnis errät und einen neuen Block erzeugt.

Dieses Konzept ist jedoch nicht nur stupide Beschäftigung. Es führt nämlich dazu, dass neue Blöcke viel schneller gemeinsam erzeugt werden können als allein.

Um die Blockchain erfolgreich zu manipulieren, müsste ein Angreifer sehr schnell sehr viele seiner manipulierten Blöcke in die Blockchain integrieren (vereinfacht gesprochen). Die Wahrscheinlichkeit, dass derselbe Miner mehrfach hintereinander als erster die richtige Lösung errät, ist jedoch extrem gering. Um sicher zu sein, jede Aufgabe als schnellster zu lösen, müsste ein Miner mindestens 51% der gesamten Rechenleistung im Netzwerk besitzen. Das ist praktisch unmöglich, denn das Bitcoin-Netzwerk besitzt in Summe mehr Rechenleistung als die 500 schnellsten Supercomputer der Welt zusammen … mal 10.000.

Zusammengefasst ist die Erfolgswahrscheinlichkeit für eine Manipulation der Blockchain durch einen Angreifer so gering, dass sich der Aufwand schlicht nicht lohnt.

Die Blockchain ist also sicher — und sie basiert auf vier Grundprinzipien:

  • Dezentraler Datenspeicher: Jeder Teilnehmer des Blockchain-Netzwerks hat Zugang zur gesamten Datenbank und deren kompletter Historie. Keine singuläre Institution kontrolliert die Daten.
  • Peer-to-Peer Kommunikation: Kommunikation findet zwischen zwei Netzwerkteilnehmern direkt statt, statt über einen zentralen Knotenpunkt. Jeder Teilnehmer speichert jedoch Informationen und leitet sie an alle anderen Teilnehmer weiter.
  • Transparenz durch Pseudonyme: Jede Transaktion und die damit verbundenen Daten sind für alle im Netzwerk sichtbar. Dafür besitzt jeder Teilnehmer eine einzigartige Adresse, die ihn identifiziert. Transaktionen finden zwischen Blockchain-Adressen statt.
  • Irreversibilität der Daten: Sobald eine Transaktion der Blockchain hinzugefügt wird (in die Datenbank aufgenommen wird), kann der Eintrag nicht mehr verändert werden, weil eine Verbindung zu jedem zuvor angelegten Eintrag besteht (daher die Bezeichnung “Kette”).

Der Themenkomplex rund um Blockchain, Smart Contracts, Kryptowährungen usw. ist spannend, hochaktuell und vor allem: umfangreich. Dieser Beitrag möchte eine Einführung sein, die Lust auf mehr macht. Deshalb im Folgenden das obligatorische TL;DR und ein paar weiterführende Links für diejenigen, die bis hierhin gelesen haben.

TL;DR

Blockchain ist die Technologie hinter Bitcoin und Ethereum. In der Blockchain wird eine Transaktionshistorie gespeichert – wie in einer ewigen Logdatei. Jeder im Netzwerk besitzt eine Kopie der Blockchain. Neue Transaktionen werden von allen geprüft und der Blockchain in Blöcken hinzugefügt – das macht sie sicher vor Manipulation und daher stammt auch ihr Name.

Weiterführende Links: