Die gesamte Geschichte der Menschheit ist ein kontinuierliches Streben nach Befreiung von Ketten und der Schaffung neuer, noch festerer. (Anonymer Autor)
Wenn ich die zahlreichen Blockchain-Projekte (Bitshares, Hyperledger, Exonum, Ethereum, Bitcoin u.a.) analysiere, wird mir klar, dass sie alle auf denselben technischen Prinzipien basieren. Blockchains sind wie Häuser, die trotz ihrer unterschiedlichen Bauarten, Dekorationen und Bestimmungen einen Fundament, Wände, ein Dach, Fenster und Türen haben, die auf bestimmte Weise miteinander verbunden sind. Wenn man die grundsätzlichen Prinzipien des Hausbaus versteht und die Eigenschaften der verwendeten Materialien kennt, kann man den Zweck eines bestimmten Hauses bestimmen. Aktuell ist die Situation mit Blockchain so, dass zwar jeder davon gehört hat, aber nur wenige die Architektur und die Funktionsweise verstehen. Daher entsteht Unklarheit darüber, wofür und auf welche Weise die Blockchain-Technologie sinnvoll eingesetzt werden kann.
In diesem Artikel werden wir die allgemeinen Eigenschaften und Prinzipien von Blockchains untersuchen. Anschließend betrachten wir die Herausforderungen, die mit Blockchain-Technologie gelöst werden können, und zur Vertiefung des Themas erstellen wir unsere eigene kleine, aber echte Blockchain auf unserem virtuellen Grundstück!
Also, erinnern wir uns daran, welche Probleme ursprünglich mit Blockchain gelöst wurden.
Ich bin mir sicher, dass viele von einer verteilten, dezentralen, öffentlichen und unveränderlichen Datenbank sprechen werden. Aber warum war das alles notwendig?
Ich ziehe es vor, das Studium jeder Technologie mit der Lektüre von Standards zu beginnen, da sich alle Artikel und Bücher zu diesem Thema darauf stützen. Im Moment gibt es jedoch keine Blockchain-Standards, es wurden nur zu ihrer Entwicklung im ISO eingerichtet. Derzeit hat jedes öffentliche Blockchain-Projekt sein eigenes Dokument, das White Paper, das im Wesentlichen als technische Spezifikation fungiert. Das erste bekannteste Blockchain-Projekt ist das Bitcoin-Netzwerk. Gehen wir auf die offizielle Website des Netzwerks und wo alles begann.
Die Aufgabe der Blockchain
Die Aufgabe, die die Blockchain im Pionier-Netzwerk Bitcoin gelöst hat, besteht darin, eine vertrauensvolle Übertragung von Eigentum an digitalen Vermögenswerten in einem vertrauenslosen Umfeld ohne Intermediäre zu ermöglichen. Ein Beispiel dafür sind digitale Münzen wie Bitcoin. Alle technischen Lösungen von Bitcoin und anderen Blockchains zielen darauf ab, dieses Problem zu lösen.
Die Probleme, die die Blockchain löst
Stellen Sie sich vor, eine Finanzorganisation behauptet, sie habe ein Netzwerk aufgebaut, mit dem man Geld an jede Person weltweit überweisen kann. Würden Sie ihr glauben? Wenn diese Organisation Visa oder MasterCard wäre, würden Sie wahrscheinlich ja sagen. Bei einer hypothetischen Organisation wie AnonymousWorldMoney würden Sie wahrscheinlich skeptisch sein. Warum ist das so? Weil wir sehr gut wissen, wie verteilte Systeme von privaten Unternehmen erstellt werden, mit welchen Zielen und welche Konsequenzen das nach sich ziehen kann. Lassen Sie uns die Probleme solcher Systeme genauer betrachten und sehen, wie Blockchain-Technologien diese lösen können.
Stellen Sie sich vor, dass in einer fiktiven AnonymousWorldMoney Server mit Datenbanken stehen und es idealerweise mehrere an verschiedenen Rechenzentren gibt. Wenn ein Absender Geld überweist, wird eine Transaktion registriert, die auf alle Server repliziert wird, und das Geld erreicht den Empfänger.

In einer idealen Welt funktioniert ein solches System wunderbar, doch in unserer Realität treten folgende Probleme auf:
- Das Problem der Identifikation der Teilnehmer auf der einen Seite und die Notwendigkeit der Anonymität von Transaktionen auf der anderen. Das bedeutet, dass Geld an einen bestimmten Empfänger überwiesen werden muss, ohne dass jemand außer den beteiligten Parteien von dieser Transaktion Kenntnis hat. Banken haben Kontonummern und Kreditkartennummern, die mit einer bestimmten natürlichen oder juristischen Person verknüpft sind, und das Bankgeheimnis schützt Informationen über Transaktionen. Wer garantiert, dass die fiktive AnonymousWorldMoney keine persönlichen Daten und Informationen über Transaktionen zu eigenen Zwecken verwendet?
- Wie kann man sicherstellen, dass der Empfänger genau den Betrag erhalten hat, der ihm überwiesen wurde? Angenommen, der Sender hat $100 überwiesen, und der Empfänger hat nur $10 erhalten. Wenn der Sender mit seinem Beleg zu den AnonymousWorldMoney-Büros kommt, zeigt der Mitarbeiter seine Version, in der vermerkt ist, dass der Sender nur $10 überwiesen hat.
- Das Problem einer vertrauensunwürdigen Umgebung, wie zum Beispiel Betrug, der als Double-Spending bekannt ist. Ein unredlicher Teilnehmer könnte sein Guthaben mehrfach ausgeben, bevor die Zahlung auf allen Servern repliziert wurde. , natürlich bleibt es bestehen, und zuletzt wird Konsistenz erreicht, aber jemand wird kein Geld für erbrachte Dienstleistungen oder Waren erhalten. Deshalb, wenn kein volles Vertrauen in die Zahlungsorganisation oder die Teilnehmer an den Transaktionen besteht, sollte ein Netzwerk aufgebaut werden, das nicht auf Vertrauen, sondern auf Kryptografie basiert.
- Das hypothetische AnonymousWorldMoney hat eine endliche Anzahl an Servern, die unbeabsichtigt oder böswillig ausfallen können.
- AnonymousWorldMoney wird eine spürbare Gebühr erheben.
- Verwaltungsmöglichkeiten. Während der Nutzung von Bitcoin wurde deutlich, dass Menschen nicht nur Münzen untereinander transferieren wollen, sondern auch verschiedene Bedingungen von Transaktionen überprüfen, Arbeitsabläufe programmieren und automatisch Aktionen basierend auf diesen Bedingungen ausführen möchten.
Wie Blockchain diese Probleme löst
- Die Identifizierung der Teilnehmer erfolgt mithilfe eines Schlüsselpaares: einem privaten und einem öffentlichen Schlüssel, während der Algorithmus der digitalen Signatur den Absender und den Empfänger eindeutig identifiziert und ihre Identitäten anonym lässt.
- Transaktionen werden in Blöcke gesammelt, der Blockhash wird berechnet und in den nächsten Block geschrieben. Diese Abfolge von Hashes in den Blöcken hat der Technologie den Namen Blockchain gegeben und macht es unmöglich, Blöcke oder einzelne Transaktionen aus ihnen heimlich zu ändern oder zu löschen. Daher kann man sich darauf verlassen, dass die Daten einer Transaktion, die in die Blockchain eingefügt wurde, unverändert bleiben.
- Doppelter Betrug (double-spending) wird verhindert, indem ein Konsens im Netzwerk darüber erzielt wird, welche Daten als gültig angesehen werden und welche verworfen werden. Im Bitcoin-Netzwerk wird der Konsens durch den Proof-of-Work (PoW) erreicht.
- Die Zuverlässigkeit des Netzwerks ergibt sich daraus, dass die Blockchain öffentlich ist, sodass jeder Teilnehmer seinen eigenen Node betreiben, eine vollständige Kopie der Blockchain erhalten und Transaktionen eigenständig auf ihre Richtigkeit überprüfen kann. Es ist wichtig zu beachten, dass moderne Blockchains nicht nur öffentliche (offene), sondern auch private (geschlossene) Blockchains ermöglichen und auch hybride Modelle verwendet werden können.
- Eine vollständige Beseitigung der Gebühren in der Blockchain ist nicht möglich, da man die Personen bezahlen muss, die das Netzwerk unterstützen. Allerdings wird die Notwendigkeit von Gebühren in der Blockchain so überzeugend nachgewiesen, dass keine Zweifel an ihrer Unentbehrlichkeit bestehen bleibt.
- Moderne Blockchains haben die Fähigkeit, Geschäftslogiken zu implementieren, die in der Blockchain als Smart Contracts bezeichnet werden. Die Logik der Smart Contracts wird in verschiedenen Programmiersprachen hoher Ebene umgesetzt.
Im Folgenden betrachten wir diese Lösungen genauer.
Die Architektur der Blockchain
Bestandteile der Blockchain
Jeder Teilnehmer kann seinen eigenen Knoten mit einer vollständigen Kopie der Blockchain (Full Node) starten. Vollständige Knoten, die Transaktionen in die Blockchain eintragen können, werden Konsensknoten oder Miner genannt. Vollständige Knoten, die nur die Richtigkeit der Transaktionen überprüfen, werden Auditknoten genannt. Leichte Clients speichern keine vollständigen Kopien der Blockchain, sondern interagieren mit dem Netzwerk über vollständige Knoten.
Die meisten Benutzer führen Transaktionen tatsächlich mit leichten Clients oder Web-Wallets durch. Alle Knoten sind miteinander verbunden. Mit diesem Elementensatz wird die Netzwerkarchitektur stabiler:

Lebenszyklus einer Transaktion
Lassen Sie uns den Lebenszyklus einer Transaktion betrachten und ihn in Teile zerlegen:

Blockchain-Technologien
Lassen Sie uns näher auf die technischen Lösungen und deren Zusammenhänge eingehen.
Identifikation
Jede Blockchain-Transaktion muss mit einer digitalen Signatur versehen werden. Daher muss jeder Teilnehmer zur Durchführung einer Transaktion ein Schlüsselpaar besitzen: privat / öffentlich. Manchmal wird das Schlüsselpaar als Wallet bezeichnet, da die Schlüssel eindeutig mit einer einzigartigen digitalen Adresse und dem Guthaben des Teilnehmers verknüpft sind. In der Realität sind Schlüssel und Adressen einfach nur Zahlenfolgen in verschiedenen Zahlensystemen. Beispiele für Schlüssel und Wallet-Adressen:
Privater Schlüssel: 0a78194a8a893b8baac7c09b6a4a4b4b161b2f80a126cbb79bde231a4567420f
Öffentlicher Schlüssel: 0579b478952214d7cddac32ac9dc522c821a4489bc10aac3a81b9d1cd7a92e57ba
Adresse: 0x3814JnJpGnt5tB2GD1qfKP709W3KbRdfb27VZur Erstellung einer digitalen Signatur in Blockchain wird ein Algorithmus verwendet, der auf elliptischen Kurven basiert: Elliptic Curve Digital Signature Algorithm (ECDSA). Für seine Funktion wird der private Schlüssel (ein 256-Bit-Zahl) normalerweise zufällig gewählt. Die Anzahl der möglichen Schlüssel beträgt 2 hoch 256, sodass man von einer praktischen Unmöglichkeit sprechen kann, dass private Schlüssel übereinstimmen.
Zunächst wird der öffentliche Schlüssel aus dem privaten Schlüssel erzeugt, indem dessen Wert mit den Koordinaten eines Punktes multipliziert wird, der sich auf der elliptischen Kurve befindet. Dadurch entstehen die Koordinaten eines neuen Punktes auf derselben Kurve. Diese Vorgehensweise sichert die Erzeugung eines Schlüsselpaars, das für digitale Signaturen von Transaktionen geeignet ist. Schließlich wird die Wallet-Adresse eindeutig aus dem öffentlichen Schlüssel abgeleitet.
Es gibt zahlreiche Artikel mit Details zur in der Blockchain verwendeten Kryptographie, zum Beispiel:
Der private Schlüssel muss streng geheim gehalten und sicher verwahrt werden. Der öffentliche Schlüssel ist für alle bekannt. Bei Verlust des privaten Schlüssels kann der Zugriff auf das Vermögen (Münzen) nicht wiederhergestellt werden, und das Geld geht für immer verloren. Daher ist die sichere Aufbewahrung privater Schlüssel von zentraler Bedeutung, denn es ist nicht wie bei einer Bank, zu der man jederzeit mit einem Ausweis gehen und sein Konto wiederherstellen kann. Es gibt eine ganze Industrie von sogenannten Cold Wallets, die ähnlich wie USB-Sticks funktionieren:

oder man kann sicherere Methoden verwenden, wie zum Beispiel das Gravieren des privaten Schlüssels auf Tokens:

Transaktionen
Weitere Informationen zur Transaktionsstruktur finden Sie im Artikel . Es ist wichtig zu verstehen, dass jede Transaktion mindestens die folgenden Daten enthält:
Von: 0x48C89c341C5960Ca2Bf3732D6D8a0F4f89Cc4368 - digitale Adresse des Absenders
An: 0x367adb7894334678b90аfe7882a5b06f7fbc783a - digitale Adresse des Empfängers
Wert: 0.0001 - Transaktionsbetrag
Transaktions-Hash: 0x617ede331e8a99f46a363b32b239542bb4006e4fa9a2727a6636ffe3eb095cef - Hash der TransaktionDanach wird die Transaktion mit dem privaten Schlüssel signiert und verteilt (siehe Details zum Protokoll ) an alle Knoten im Blockchain, die die Transaktionen auf Gültigkeit überprüfen. Der Algorithmus zur Überprüfung der Transaktion ist komplex und beinhaltet .
Transaktionsblöcke
Nachdem die Gültigkeit der Transaktionen überprüft wurde, bilden die Nodes Blöcke aus ihnen. Neben den Transaktionen wird im Block der Hash des vorherigen Blocks, eine Zahl (Nonce-Zähler) gespeichert, und der Hash des aktuellen Blocks wird mithilfe des SHA-256-Algorithmus berechnet. Der Hash muss bestimmten Schwierigkeitsbedingungen genügen. Zum Beispiel ändert sich im Bitcoin-Netzwerk die Schwierigkeit des Hashs automatisch alle 2 Wochen, je nach Rechenleistung des Netzwerks, sodass ein Block ungefähr alle 10 Minuten generiert wird. Die Schwierigkeit wird durch die Bedingung bestimmt, dass der gefundene Hash kleiner sein muss als eine vorher festgelegte Zahl. Wenn diese Bedingung nicht erfüllt ist, wird 1 zur Nonce addiert, und die Berechnung des Hashs wird wiederholt. Zur Ermittlung des Hashs wird das Feld Nonce verwendet, da dies die einzigen Daten im Block sind, die geändert werden können; die anderen müssen unverändert bleiben. Der korrekte Hash muss eine bestimmte Anzahl von Nullen am Anfang haben, zum Beispiel einer der realen Hashes:
000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91Das erfolgreiche Finden eines Hashes gilt als Nachweis der geleisteten Arbeit (Proof-of-Work, PoW) für Netzwerke wie Bitcoin oder Ethereum. Der Prozess des Hash-Findens wird als Mining bezeichnet, analog zur Goldsuche. Der Name beschreibt den Prozess ziemlich genau, da es sich um einfaches Ausprobieren von Varianten handelt, und wenn jemand einen passenden Hash findet, ist das tatsächlich ein Glücksfall. Es ist wie das Finden eines echten Goldklumpens in Tonnen von Erzmüll. Die Belohnung für einen Block beträgt derzeit 12,5 BTC und multipliziert man dies mit dem aktuellen Bitcoin-Kurs von 3.900 $, erhält man mehr als ein Kilogramm reinen Goldes. Es gibt viel zu gewinnen!
Nach dem erfolgreichen Finden eines Hashes werden der Block und der gefundene Hash im nächsten Block der Blockchain aufgezeichnet. Weitere Informationen zur Struktur der Blöcke finden Sie im Artikel , und hier ist ein vereinfachtes Schema:

Die Blockchain beginnt mit einem Block, der noch keinen Hash des vorherigen Blocks hat. Dieser Block in der Blockchain wird als Genesis-Block bezeichnet. Die anderen Blöcke haben eine einheitliche Struktur und unterscheiden sich lediglich in der Anzahl der Transaktionen. Echtzeit-Transaktionen und derzeit erstellte Blöcke in Bitcoin oder Ethereum können Sie bei .
Die Größe der Blöcke in Bitcoin ist auf 1 MB begrenzt und bei einem minimalen Informationsgehalt von etwa 200 Byte pro Transaktion können maximal etwa 6000 Transaktionen in einem Block untergebracht werden. Daher stammt auch die vermeintliche Leistung von Bitcoin, über die viele lachen: Ein Block wird ungefähr alle 10 Minuten * 60 Sekunden = 600 Sekunden generiert, was eine formale Leistung von etwa 10 TPS ergibt. In Wirklichkeit ist dies jedoch keine Leistung, sondern ein absichtlich implementierter Arbeitsalgorithmus. Bei Ethereum wurde zur Konkurrenz einfach die Blockgenerierungszeit auf 15 Sekunden gesetzt, wodurch die Leistung formell in die Höhe schoss. Daher macht es in Blockchains, die PoW als Konsensmechanismus verwenden, überhaupt keinen Sinn, die Leistung zu vergleichen, da sie direkt von der Schwierigkeit der Berechnung des Hashes abhängt, die beliebig festgelegt werden kann.
Forks
Was passiert, wenn zum Beispiel mehrere Knoten Hashes finden, die die Schwierigkeitsbedingungen erfüllen, aber unterschiedliche Werte haben (mit anderen Worten, zu unterschiedlichen Konsensen gelangen) und Blöcke in die Blockchain aufzeichnen? Lassen Sie uns sehen, wie die Blockchain sich gegen diese Situation absichert. In diesem Fall kommt es zu einem sogenannten Fork, und die Blockchain hat zwei Versionen der Kette:

Was passiert als Nächstes? Danach beginnt ein Teil des Netzwerks, an Block N+2 von einer Kette zu arbeiten, während ein anderer Teil an der anderen arbeitet:

Einer dieser Blöcke wird früher gefunden und in die Blockchain gesendet, und dann muss die Blockchain gemäß den Regeln auf die längere Kette umschalten und alle Transaktionen aus dem alternativen Block zurücksetzen:

Es kann jedoch vorkommen, dass eine Transaktion eines Teilnehmers nur in einem der Fork-Blöcke war, der dann abgebrochen wurde. Daher gibt es eine allgemeine Empfehlung, um sicherzustellen, dass die gewünschte Transaktion im Blockchain aufgezeichnet wurde: Bevor man der Transaktion vertraut, sollte man warten, bis die nächsten paar Blöcke in die Blockchain hinzugefügt wurden. Die Empfehlungen, wie viele Blöcke man für verschiedene Blockchains warten sollte, variieren. Zum Beispiel sind es für das Bitcoin-Netzwerk mindestens 2 Blöcke und höchstens 6.
Das gleiche Bild wird bei einem sogenannten 51%-Angriff zu beobachten sein, bei dem eine Gruppe von Minern versucht, eine alternative Blockkette aufzubauen und die ursprüngliche Kette mit ihren betrügerischen Transaktionen zurückzusetzen. Obwohl es derzeit profitabler ist, die Ressourcen für ehrliches Mining zu nutzen, anstatt zu betrügen.
Konsens
Um einen Block in die Blockchain aufzunehmen, muss das Netzwerk einen Konsens erreichen. Lassen Sie uns an die Aufgabe der Konsensbildung in rechnerischen Kommunikationsnetzwerken erinnern. Das Problem wird als das Problem der byzantinischen Generäle BFT formuliert (). Ohne das eindrucksvolle Bild der Probleme der byzantinischen Armee zu zeichnen, kann die Aufgabe so formuliert werden: Wie erreichen die Knoten eines Netzwerks ein gemeinsames Ergebnis, wenn einige Knoten des Netzwerks absichtlich fehlerhafte Informationen verbreiten? Aktuelle Algorithmen zur Lösung des BFT-Problems zeigen, dass das Netzwerk korrekt funktionieren kann, solange die Zahl der Betrüger weniger als ein Drittel beträgt. Warum wurde im Bitcoin-Netzwerk kein BFT-Konsens angewendet? Warum war es notwendig, PoW zu verwenden? Es gibt mehrere Gründe:
- BFT funktioniert gut mit einer kleinen, festen Anzahl von Knoten, während die Zahl der Knoten in einer öffentlichen Blockchain unvorhersehbar ist und zudem Knoten jederzeit ein- und ausgeschaltet werden können.
- Es ist notwendig, die Menschen zu motivieren, Blockchain-Knoten zu betreiben. Dazu müssen die Menschen eine Belohnung erhalten. Im BFT gibt es formal keinen Grund für Belohnungen, während die Gründe für die Belohnungen im PoW allen intuitiv verständlich sind: für den Strom, den der Prozessor während der Suche nach dem Block-Hash verbraucht.
Neben PoW gibt es noch mehrere weitere Konsensmodelle, die in modernen Blockchains verwendet werden, beispielsweise:
- PoS (Proof-of-Stake) — in der Blockchain
- DPoS (Delegated Proof-of-Stake) — in der Blockchain
- BFT-Varianten: SBFT (Simplified BFT) und PBFT (Practical BFT), zum Beispiel in der Blockchain
Lassen Sie uns kurz über den PoS-Konsens sprechen, da gerade PoS und seine Varianten in privaten Blockchains am weitesten verbreitet sind. Warum speziell in privaten? Einerseits sind die Eigenschaften von PoS im Vergleich zu PoW vorteilhaft, da für die Erreichung des Konsenses weniger Rechenressourcen benötigt werden, was die Geschwindigkeit der Datenspeicherung in der Blockchain erhöht. Andererseits gibt es bei PoS mehr Möglichkeiten für Betrug, weshalb alle Teilnehmer der Blockchain bekannt sein müssen, um dies zu neutralisieren.
Der PoS-Konsens basiert auf der Auswahl eines Knotens, der einen Block mit Transaktionen in die Blockchain schreiben kann, abhängig von der Anzahl der Mittel auf dem Konto, genauer gesagt, nicht auf dem Konto, sondern im Einsatz. Je mehr Mittel Sie im Einsatz haben, desto wahrscheinlicher wird Ihr Knoten von der Netzwerk als Blockschreiber gewählt. Die Hinterlegung wird nicht zurückerstattet, wenn der Block ungültig ist. So wird Betrugsprävention realisiert. Es gibt folgende Varianten von PoS:
- Der Delegated PoS (DPoS) Konsens umfasst Teilnehmer, die in „Wähler“ und „Validierer“ unterteilt werden. Die Münzinhaber (Wähler) delegieren ihr Recht, Transaktionen in der Blockchain zu überprüfen und aufzuzeichnen, an andere Teilnehmer. So führen die Validierer die gesamte Rechenarbeit aus und erhalten dafür eine Belohnung, während das Vorhandensein von Wählern die Integrität der Validierer gewährleistet, da diese jederzeit gewechselt werden können.
- Der LPoS (Leased Proof-of-Stake) Konsens ermöglicht es, Mittel an andere Knoten zu verleihen, sodass diese mehr Chancen haben, Blöcke zu validieren. So kann man Transaktionsgebühren verdienen, ohne aktiv an der Überprüfung der Transaktionen und dem Mining von Blöcken teilzunehmen.
Es gibt noch eine Reihe weiterer Konsensmechanismen, die bisher nicht weit verbreitet sind. Hier sind sie zur Information aufgezählt, während eine Übersicht über die Konsensalgorithmen beispielsweise in folgendem Artikel zu finden ist: .
- PoET (Proof-of-Elapsed Time)
- PoC (Proof-of-Capacity)
- PoB (Proof-of-Burn)
- PoWeight (Proof-of-Weight)
- PoA (Proof-of-Activity) — PoW + PoS
- PoI (Proof-of-Importance)
Zuverlässigkeit und Bereitstellungsmodelle für Blockchains
Öffentliche Blockchain
Widerstandsfähigkeit Öffentlich oder eine andere Bezeichnung Genehmigungsfreier Blockchain wird erreicht, indem sich jeder verbinden und Informationen einsehen oder sogar seinen eigenen Knoten anschließen kann, wobei das Vertrauen auf dem PoW-Konsens basiert.
Privater Blockchain
Privat или Privater genehmigter Blockchain. In diesen Blockchains haben nur bestimmte Gruppen von Teilnehmern (Organisationen oder Einzelpersonen) Zugang zu den Informationen. Solche Blockchains werden von Organisationen aufgebaut, um den Gesamtvorteil oder die Effizienz zu steigern. Ihre Zuverlässigkeit basiert auf den gemeinsamen Zielen der Teilnehmer und den Konsens-Algorithmen PoS und BFT.
Blockchain-Konsortium
Es gibt Konsortium или Öffentlicher genehmigter Blockchain. Dies sind Blockchains, zu denen sich jeder verbinden kann, um sie anzusehen, aber Informationen hinzuzufügen oder seinen eigenen Knoten anzuschließen, kann ein Teilnehmer nur mit Erlaubnis anderer Teilnehmer. Solche Blockchains werden von Organisationen geschaffen, um das Vertrauen von Auftraggebern oder Verbrauchern von Produkten oder der Gesellschaft insgesamt zu erhöhen. Auch hier wird die Zuverlässigkeit durch das Vertrauen zwischen den Teilnehmern und denselben Konsens-Algorithmen PoS und BFT erreicht.
Smart Contracts
In Blockchains, which have been developed after Bitcoin, the ability to execute smart contracts has been added to some extent. Essentially, a smart contract is a transaction that includes program code for execution. Smart contracts on the Ethereum network run in the EVM (Ethereum Virtual Machine). To initiate the execution of a smart contract, it must be explicitly triggered by another transaction, or certain preconditions must be met. The results of the smart contract execution are also recorded in the blockchain. While obtaining data from outside the blockchain is possible, it is highly limited.
Welche Geschäftslogik kann mithilfe von Smart Contracts umgesetzt werden? Tatsächlich gibt es nicht allzu viele Möglichkeiten, zum Beispiel die Überprüfung von Bedingungen basierend auf Daten aus der Blockchain, die Änderung der Eigentümer digitaler Vermögenswerte je nach diesen Bedingungen und das Speichern von Daten in einem permanenten Speicher innerhalb der Blockchain. Die Logik wird in einer speziellen Hochsprache, Solidity, umgesetzt.
Ein klassisches Beispiel für Funktionen, die mit Smart Contracts umgesetzt werden, ist die Ausgabe von Tokens für die Durchführung von ICOs. Zum Beispiel habe ich einen Smart Contract für die Ausgabe von bescheidenen 500.000.000 AlexToken realisiert. Über befindet sich
der Quellcode des Smart Contracts in Solidity
pragma solidity ^0.4.23;
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
**/
function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
if (a == 0) {
return 0;
}
c = a * b;
assert(c / a == b);
return c;
}
/**
* @dev Integer division of two numbers, truncating the quotient.
**/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
// uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return a / b;
}
/**
* @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
**/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
/**
* @dev Adds two numbers, throws on overflow.
**/
function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a + b;
assert(c >= a);
return c;
}
}
/**
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
**/
contract Ownable {
address public owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender account.
**/
constructor() public {
owner = msg.sender;
}
/**
* @dev Throws if called by any account other than the owner.
**/
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
**/
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0));
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
/**
* @title ERC20Basic interface
* @dev Basic ERC20 interface
**/
contract ERC20Basic {
function totalSupply() public view returns (uint256);
function balanceOf(address who) public view returns (uint256);
function transfer(address to, uint256 value) public returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
}
/**
* @title ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20
**/
contract ERC20 is ERC20Basic {
function allowance(address owner, address spender) public view returns (uint256);
function transferFrom(address from, address to, uint256 value) public returns (bool);
function approve(address spender, uint256 value) public returns (bool);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
* @title Basic token
* @dev Basic version of StandardToken, with no allowances.
**/
contract BasicToken is ERC20Basic {
using SafeMath for uint256;
mapping(address => uint256) balances;
uint256 totalSupply_;
/**
* @dev total number of tokens in existence
**/
function totalSupply() public view returns (uint256) {
return totalSupply_;
}
/**
* @dev transfer token for a specified address
* @param _to The address to transfer to.
* @param _value The amount to be transferred.
**/
function transfer(address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[msg.sender]);
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
emit Transfer(msg.sender, _to, _value);
return true;
}
/**
* @dev Gets the balance of the specified address.
* @param _owner The address to query the the balance of.
* @return An uint256 representing the amount owned by the passed address.
**/
function balanceOf(address _owner) public view returns (uint256) {
return balances[_owner];
}
}
contract StandardToken is ERC20, BasicToken {
mapping (address => mapping (address => uint256)) internal allowed;
/**
* @dev Transfer tokens from one address to another
* @param _from address The address which you want to send tokens from
* @param _to address The address which you want to transfer to
* @param _value uint256 the amount of tokens to be transferred
**/
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[_from]);
require(_value <= allowed[_from][msg.sender]);
balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(_value);
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
emit Transfer(_from, _to, _value);
return true;
}
/**
* @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
*
* Beware that changing an allowance with this method brings the risk that someone may use both the old
* and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
* race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
* @param _spender The address which will spend the funds.
* @param _value The amount of tokens to be spent.
**/
function approve(address _spender, uint256 _value) public returns (bool) {
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
/**
* @dev Function to check the amount of tokens that an owner allowed to a spender.
* @param _owner address The address which owns the funds.
* @param _spender address The address which will spend the funds.
* @return A uint256 specifying the amount of tokens still available for the spender.
**/
function allowance(address _owner, address _spender) public view returns (uint256) {
return allowed[_owner][_spender];
}
/**
* @dev Increase the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To increment
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _addedValue The amount of tokens to increase the allowance by.
**/
function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
/**
* @dev Decrease the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To decrement
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _subtractedValue The amount of tokens to decrease the allowance by.
**/
function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
uint oldValue = allowed[msg.sender][_spender];
if (_subtractedValue > oldValue) {
allowed[msg.sender][_spender] = 0;
} else {
allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
}
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
}
/**
* @title Configurable
* @dev Configurable varriables of the contract
**/
contract Configurable {
uint256 public constant cap = 1000000000*10**18;
uint256 public constant basePrice = 100*10**18; // tokens per 1 ether
uint256 public tokensSold = 0;
uint256 public constant tokenReserve = 500000000*10**18;
uint256 public remainingTokens = 0;
}
/**
* @title CrowdsaleToken
* @dev Contract to preform crowd sale with token
**/
contract CrowdsaleToken is StandardToken, Configurable, Ownable {
/**
* @dev enum of current crowd sale state
**/
enum Stages {
none,
icoStart,
icoEnd
}
Stages currentStage;
/**
* @dev constructor of CrowdsaleToken
**/
constructor() public {
currentStage = Stages.none;
balances[owner] = balances[owner].add(tokenReserve);
totalSupply_ = totalSupply_.add(tokenReserve);
remainingTokens = cap;
emit Transfer(address(this), owner, tokenReserve);
}
/**
* @dev fallback function to send ether to for Crowd sale
**/
function () public payable {
require(currentStage == Stages.icoStart);
require(msg.value > 0);
require(remainingTokens > 0);
uint256 weiAmount = msg.value; // Calculate tokens to sell
uint256 tokens = weiAmount.mul(basePrice).div(1 ether);
uint256 returnWei = 0;
if(tokensSold.add(tokens) > cap){
uint256 newTokens = cap.sub(tokensSold);
uint256 newWei = newTokens.div(basePrice).mul(1 ether);
returnWei = weiAmount.sub(newWei);
weiAmount = newWei;
tokens = newTokens;
}
tokensSold = tokensSold.add(tokens); // Increment raised amount
remainingTokens = cap.sub(tokensSold);
if(returnWei > 0){
msg.sender.transfer(returnWei);
emit Transfer(address(this), msg.sender, returnWei);
}
balances[msg.sender] = balances[msg.sender].add(tokens);
emit Transfer(address(this), msg.sender, tokens);
totalSupply_ = totalSupply_.add(tokens);
owner.transfer(weiAmount);// Send money to owner
}
/**
* @dev startIco starts the public ICO
**/
function startIco() public onlyOwner {
require(currentStage != Stages.icoEnd);
currentStage = Stages.icoStart;
}
/**
* @dev endIco closes down the ICO
**/
function endIco() internal {
currentStage = Stages.icoEnd;
// Transfer any remaining tokens
if(remainingTokens > 0)
balances[owner] = balances[owner].add(remainingTokens);
// transfer any remaining ETH balance in the contract to the owner
owner.transfer(address(this).balance);
}
/**
* @dev finalizeIco closes down the ICO and sets needed varriables
**/
function finalizeIco() public onlyOwner {
require(currentStage != Stages.icoEnd);
endIco();
}
}
/**
* @title LavevelToken
* @dev Contract to create the Lavevel Token
**/
contract AlexToken is CrowdsaleToken {
string public constant name = "AlexToken";
string public constant symbol = "ALT";
uint32 public constant decimals = 18;
}und die binäre Darstellung, wie sie im Netzwerk sichtbar ist
60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029Weitere Informationen zu Smart Contracts finden Sie in dem Artikel: .
Fazit
Wir haben die Technologien aufgelistet, auf denen moderne Blockchains basieren, und wie sie miteinander verbunden sind. Lassen Sie uns nun klären, welche Aufgaben mit Blockchain gelöst werden können und für welche sie, im besten Fall, nicht effektiv sein werden. Also, der Einsatz von Blockchain ist nicht unbedingt erforderlich, wenn:
- Transaktionen in einer vertrauensvollen Umgebung stattfinden;
- Die Gebühren von Vermittlern das Leben der Teilnehmer nicht verschlechtern;
- Die Teilnehmer kein Eigentum besitzen, das als digitale Vermögenswerte dargestellt werden kann;
- Es keine Dezentralisierung bei den digitalen Vermögenswerten gibt, d.h. der Wert wird nur von einem Teilnehmer besessen oder bereitgestellt.
Welche Zukunft erwartet Blockchain? Momentan können wir nur mögliche Entwicklungswege der Blockchain-Technologien vermuten:
- Blockchain wird eine ebenso gewöhnliche Datenbanktechnologie wie z.B. SQL oder NoSQL für ihren bestimmten Anwendungsbereich werden;
- Blockchain wird ein weit verbreiteter Protokoll wie HTTP für das Internet sein;
- Blockchain wird die Grundlage für ein neues Finanz- und politisches System der Erde werden!
In der nächsten Teil werden wir uns die aktuellen Blockchain-Technologien ansehen und deren Anwendungen in verschiedenen Branchen kennenlernen.
Das ist erst der Anfang!
Quelle: habr.com
