Die Quelle: https://jysperm.me/2016/05/blockchain-slides/
Dieser Artikel basiert auf einem Tech-Sharing, das ich Ende März auf LeanCloud durchgeführt habe, und setzt voraus, dass der Leser bereits über grundlegende Kryptologie und eine erste Vorstellung von der Implementierung von Bitcoin verfügt.
Die Blockchain, auch Blockchain genannt, kann als eine Art HashTree betrachtet werden und hat daher einige der gleichen Eigenschaften wie der HashTree:

Das Bild stammt von<http://happypeter.github.io/bitcoin_basics/book/017_merkle_tree.html
In einer Baumstruktur hat jeder Endknot einen Assay, während der Assay eines Nicht-Endknotes von den Assays aller seiner direkten Unterknoten abhängt, so dass jeder Knoten direkt oder indirekt Informationen über alle seine Unterknoten enthält. Wenn sich der Assay eines Endknotes ändert, ändern sich die Assays aller seiner Elternknoten, und die Wurzeln müssen sich auch ändern.
Ich kann Ihnen eine HashTree-App nennen: “100% Reserve-Proofs”, die zur Kategorie der “Zero-Knowledge-Proofs” gehören. Man kann sich ein Szenario vorstellen, in dem Bitcion-Inhaber Bitcoin an eine Börse hinterlegen müssen, um zu handeln, und die Börse kann theoretisch das Geld (das Konto-Guthaben aller Benutzer, die auf dem Konto stehen) für sie verwenden, was die Benutzer nicht sehen wollen, aber die Börse will sich selbst bestätigen: Die Börse veröffentlicht zuerst eine Bitcoin-Adresse, die sie hält, und wir bestätigen, dass die Börse tatsächlich so viel Bitcoin als Reserve hält, aber wie kann man beweisen, dass das Geld tatsächlich größer ist als die Summe aller Benutzer-Guthaben?

Das Bild stammt von<http://blog.bifubao.com/2014/03/16/proof-of-reserves
Wir können einen HashTree erstellen, in dem alle Endknoten einen Benutzer repräsentieren, der den Benutzersaldo enthält.Σ) und der Hashtag ((wie z.B. Postanschrift))hDer Vater-Node enthält die Summe der Salden seiner Kinder-Nodes.sum) und eine Sortation aller Unternoteninformationen ((hashFür jeden Benutzer reicht es aus, ihm seine eigenen End- und Schwesterknoten, die von allen seinen Vaterknoten und deren Bruderknoten, zu zeigen, denn dieser Benutzer kann durch eine schrittweise Rückverfolgung der Vaterknoten bestätigen, dass sein Saldo in den Vaterknoten und schließlich in den Wurzeln enthalten ist.
Auf diese Weise wird jedem Benutzer nur seine eigene Information und einige zusammengefasste Informationen angezeigt, sodass jeder Benutzer seine eigene Balance in den Root-Knoten enthalten bestätigen kann, ohne dass er von anderen Salden erfahren wird.hWarum?e4df9d12Der Knoten des Endgerätes sollte nicht der Endgerät des Benutzers sein, sondern ein aggregierter Informationsknoten (der einen Benutzer mit 3333 Saldo und einen virtuellen Benutzer mit 0 Saldo enthalten kann), um die Privatsphäre eines Benutzers zu vermeiden.
Wir werden uns nun mit Git beschäftigen, einer typischen Blockchain-Anwendung:

Das Bild stammt vonhttp://gitbook.liuhui998.com/1_2.html (GPL v2)
In Git gibt es ein Hash, das von seinem Inhalt bestimmt wird, wenn zwei Objekte denselben Inhalt haben. In Git ist die gesamte Geschichte des Repositories eine Blockchain. Jeder Commit entspricht einem Block, der den Hash des vorherigen Commit enthält und den Hash des Objekts, das diesmal modifiziert wurde.
Mit Hilfe der Blockchain definiert Git einen einzigartigen Historiker für das Repository. Wenn ein Commit geändert wird, ändern sich alle Hashs der Commits danach. Natürlich, da Git nur ein Versionskontrollwerkzeug ist, verhindert es nicht, dass Sie den Historiker ändern können.push --forceDie Änderungen werden jedoch von allen Mitverfassern wahrgenommen.
Eine weitere klassische Anwendung der Blockchain ist Bitcoin, das das Wort “Blockchain” verbreitet hat (und das Konzept existiert seit jeher):

Das Bild stammt vonhttps://commons.wikimedia.org/wiki/File:Bitcoin_Block_Data.png(CC-BY-SA-3.0)
In Bitcoin enthält jeder Block eine Reihe von Transaktionen und Hashs des vorherigen Blocks, während die gesamte Blockchain eine dezentrale, einzigartige Buchhaltung bildet. Da alle zehn Minuten ein neuer Block erzeugt wird, bleibt der Block nach der Erstellung für immer auf der Blockchain.
Der erste Teil dieses Teils ist ein kurzer Rückblick auf Bitcoin.
Die Erzeugung von Blöcken in Bitcoin erfolgt durch “Proof of Work”, d.h. alle “Miner”, die an der “Mining” teilnehmen, müssen eine rechenkräftige, zufällige, randomisierte Berechnung durchführen, bis eine zufällige Zahl berechnet wird, die bestimmte Bedingungen erfüllt, um das Recht zu erhalten, einen Block zu veröffentlichen.
Es ist so eingerichtet, dass jeder Miner immer auf die “längste Kette” vertraut und den nächsten Block auf der Grundlage der längsten bekannten Kette berechnet, die die Regeln erfüllt, sonst wird Ihre Rechenleistung vergeudet. Oh, weil andere Miner immer die längste Kette anerkennen, und wenn Sie nicht auf der Grundlage der längsten Kette arbeiten, dann ist es, dass Sie mit der Rechenleistung aller anderen Miner konkurrieren.
Bitcoin wurde so konzipiert, dass alle 10 Minuten ein neuer Block erzeugt wird. Diese Zeit wird durch die gemeinsame Betrachtung der Intervalle der letzten Blöcke erreicht, um die Schwierigkeit der Erstellung der nächsten Blockbedingungen anzupassen. Wenn die Geschwindigkeit der Erstellung der letzten Blöcke höher ist als erwartet, wird die Erstellung des nächsten Blocks als schwieriger angesehen.
Normalerweise muss jeder Bitcoin-Knoten die vollständige Blockchain-Daten speichern, um zu bestätigen, ob eine Transaktion legal ist. Die vollständige Blockchain ist jedoch jetzt 66G und wächst mit einer Geschwindigkeit von etwa 0.1G pro Tag. Es ist nicht unerheblich, dass jeder Benutzer von Bitcoin die vollständige Blockchain speichern muss.

Das Bild stammt von<https://github.com/ethereum/wiki/wiki/White-Paper
In der Tat können wir uns die Blockchain von Bitcoin als eine “Statusmaschine” vorstellen, die gesamte Blockchain ist ein “Lader”, in dem jedes Transaktionsprotokoll gespeichert ist, anhand dessen ausgerechnet werden kann, wie viel Saldo jedes Konto im Bitcoin-Netzwerk zu jeder Zeit auf dem gesamten Ledger hat. Jede Transaktion ist eine Änderung des Zustands, und jeder Block ist ein “Konsens” über den aktuellen Zustand der Miner im gesamten Bitcoin-Netzwerk, da Bitcoin alle 10 Minuten einen neuen Block erzeugt, was bedeutet, dass alle 10 Minuten ein Konsens über die Salden aller Konten erzielt wird, während der Zustand des Ledgers in diesen zehn Minuten ein “chaotischer” Zustand ist.
Auf der Basis von Bitcoin wurden auch viele andere Kryptowährungen entwickelt, die oft als “Alt-Coins” bezeichnet werden. In der Regel gibt es zwei Implementierungsmöglichkeiten:
Der Vorteil ist, dass Coins sehr flexibel ihre eigenen Protokolle und Regeln entwerfen können, aber da es schwierig ist, die Anzahl der Benutzer auf die gleiche Stufe wie Bitcoin zu bringen, ist die Abwehr von bösartigen Angriffen sehr schwach.
Der Vorteil ist, dass man die Rechenleistung von Bitcoin nutzen kann, um Angriffe abzuwehren, aber auch, dass nicht alle Miner die Regeln der Kryptowährung befolgen, da sie auf dem Bitcoin-Netzwerk angebunden sind. Daher kann man nicht verhindern, dass Block-Blockcheins, die nicht den Regeln entsprechen, in die Blockchain gelangen, sondern kann nur auf dem Client Transaktionen filtern, die nicht den Regeln entsprechen.
Bitcoin bietet eine Blockchain mit einer großen Anzahl von Minern, die gegen massive Angriffe abwehren können, und Bitcoin kann auch mit einer eigenen Datenbank für Transaktionen ausgestattet werden, was die Implementierung von Counterfeits erlaubt.
Bitocin bietet auch eineBitcoin ScriptDa dies jedoch keine Kernfunktion von Bitcoin ist, können nur relativ einfache Operationen durchgeführt werden, die Daten auf der Blockchain nur sehr begrenzt gelesen werden können, und es ist schwierig, eine allgemeine, turingische Logik zu schreiben, da es keine Kreislaufmechanismen gibt.

Das Bild stammt vonhttps://www.ethereum.org/assets (CC 3.0)
Ethereum ist eine Blockchain-basierte, dezentrale Anwendungsplattform, die die Infrastruktur von Bitcoin, die auf kryptologischen Blockchain-Technologien basiert, zu einer universellen Plattform baut und einige der fehlenden Funktionen des Bitcoin-Netzwerks ergänzt, damit Entwickler ihre eigenen dezentralen Anwendungen auf der Blockchain betreiben können.
Bevor ich Ethereum näher beschreibe, möchte ich zunächst die zwei Grundlagen eines dezentralen Netzwerks erläutern: Kryptographie und Gaming. Kryptographie ist natürlich nichts weiter als die mathematische Gewährleistung der Sicherheit durch Public-Key-Verschlüsselung, digitale Signaturen, Scaling und Abstracting-Algorithmen. Gaming bedeutet, dass in einem dezentralen Netzwerk jeder teilnehmen kann, einschließlich derjenigen, die absichtlich versuchen, das Netzwerk anzugreifen.
In der digitalen Welt gibt es jedoch keine Kosten für die Veröffentlichung eines Datensatzes, es gibt keine “Gewinne” und “Verluste”, und es muss daher eine Art Verbindung zur physischen Welt hergestellt werden, um “Gewinne” zu definieren. Zum Beispiel im Bitocin-Netzwerk, wenn ein Angreifer den Kurs von Blcokchain künstlich verändern möchte, muss er über mehr Rechenleistung verfügen als alle anderen Bergleute, während in der physischen Welt die Rechenleistung von einer Rechenvorrichtung zur Verfügung gestellt wird, die von der physischen Welt gekauft werden muss.
In einem dezentralen Netzwerk werden also nicht alle Probleme durch “Technologie” gelöst. Was die Technologie nicht erreicht, muss durch Profit und wirtschaftliche Anreize gelöst werden. Auch aufgrund der Notwendigkeit von “wirtschaftlichen Anreize” hat Ethereum ein Wallet-System (die Währungseinheit heißt “Ether”) und jeder Benutzer hat eine Wallet-Adresse als seine einzige Identität, in diesem Punkt ähnlich wie Bitcion.
“Contract” ist das wichtigste Konzept, das von Ethereum eingeführt wurde. In Bitcoin gehören alle Adressen einem Benutzer. Wenn wir “Benutzer” sagen, meinen wir eigentlich einen öffentlichen Schlüssel und einen privaten Schlüssel. Aber in Ethereum gibt es neben der Adresse, die von einem Schlüsselpaar gehalten wird, eine Adresse, die vom “Code” gehalten wird, nämlich der Contract.
Als erstes Beispiel für eine “multi-shared wallet” gibt es im offiziellen Ethereum-Client eine Funktion zum Erstellen einer Multi-Wallet:

Wie in der Abbildung zu sehen ist, kann mit dieser Funktion eine Wallet-Adresse erstellt werden, die gemeinsam mit 2 anderen Personen gehalten wird und von der jeder maximal 100 Ether pro Tag verwendet, wenn diese Grenze überschritten wird, muss dies mit der Zustimmung einer anderen Person erfolgen.
Diese Funktion erzeugt tatsächlich einen Contract, und diese Logik wird durch den Code in dem Contract beschrieben. Wenn Sie aus dieser gemeinsamen Brieftasche eine Zahlung ausführen möchten, müssen Sie eine Nachricht an diese gemeinsame Brieftasche senden ((Transaktionen sind Nachrichten, der Transaktionsbetrag kann null sein, nur Daten tragen), und der Code in der gemeinsamen Brieftasche wird ausgeführt, und wenn diese Zahlungsanfrage der obigen Logik entspricht, wird eine echte Zahlungstransaktion initiiert, andernfalls wird diese Zahlungsanfrage abgelehnt ((Keine Zahlung ist wirklich ausgegeben)).
Ein weiteres Beispiel ist der “Hofed-Contract”, bei dem es immer wieder darüber gesprochen wird, dass Bitcoin als digitale Währung unbeständig ist, da sich der Wert der Währung (und der Wechselkurs der Währung) im Laufe eines Tages verdoppelt oder verdoppelt. Dies kann jedoch mit Hilfe von Contract gelöst werden, wenn ein “Hofed-Contract” durchgeführt wird.
Wir nennen jemanden, der den Wert der Währung unverändert halten will, einen “Risiko-Ausweicher”, und einen anderen, der bereit ist, das Risiko der Währungsschwankungen zu tragen und davon zu profitieren, einen “Risiko-Träger”, so dass sie einen Betrag (z. B. 1000 CNY) und eine Zeitfenster (z. B. einen Monat) vereinbaren und einen Vertrag erstellen können, der die folgende Logik ausführt:
Wenn der Wert von Ether steigt, profitieren die Risikoträger, wenn der Wert von Ether sinkt, verlieren die Risikoträger, aber die Risikovermeider verlieren immer nicht. Natürlich können der Risikovermeider und der Risikoträger im Voraus eine “Versicherung” vereinbaren, die der Risikovermeider zahlen muss, und es kann auch vereinbart werden, dass der Risikoträger eine Sicherung von mehr als 1000 CNY bereitstellen muss (je höher die Verdoppelung ist, desto größer ist das Risiko, das er tragen kann).
In den obigen Beispielen gibt es noch ein Problem, das nicht sehr gut gelöst ist, nämlich wie man den Wechselkurs zwischen Ether und Kryptowährung bestimmen kann. Wie wir bereits erwähnt haben, kann der Vertrag nur auf Daten auf der Blockchain zugreifen, während die Kryptowährung Daten ist, die in der realen Welt existieren und nicht in der Kryptowelt.
Wir können einen weiteren Contract entwerfen, der eine Logik ausführt, um die Wechselkurse zwischen Ether und der virtuellen Währung aus der realen Welt in jedem Zeitfenster (z.B. einer Stunde) zu erfassen:
Für jeden Teilnehmer, der nicht weiß, was die anderen angeboten haben, besteht eine größere Chance, dass er einen echten Wechselkurs einreicht, und eine größere Chance, dass er die Kaution verliert, wenn er einen sehr absurden Wechselkurs einreicht.
Natürlich gibt es einige Lücken in dieser Regel, zum Beispiel, wenn eine Person eine sehr hohe Sicherheit hat, kann sie den Durchschnitt zu einem Preis höher oder niedriger als der tatsächliche Wechselkurs ziehen und gleichzeitig eine Belohnung erhalten und andere Personen, die den genauen Wechselkurs angeben, verlieren die Sicherheit. Aber in der Realität ist es in der realen Welt genauso, wenn Sie eine große Menge an Geld haben, können Sie auch den Preis einer Ware erhöhen oder drücken.
Ein weiterer Schwachpunkt ist der Schritt “Jeder kann die Kaution an den Contract leisten und einen Wechselkurs anbieten”. Dieser Schritt wird durch die Erstellung von Transaktionen umgesetzt, und alle Transaktionen werden auf der Blockchain geschrieben, so dass der Wechselkurs, den Sie einreichen, tatsächlich für andere sichtbar ist, was weitere Möglichkeiten für böswillige Angreifer schafft.
Wir haben bereits erwähnt, dass Contract Daten auf der Blockchain lesen kann, aber die Daten auf der Blockchain sind fest, woher soll man eine zufällige Zahl bekommen, wenn man eine Anwendung wie Glücksspiel implementieren will?
Eine denkbare Quelle für Zufallszahlen ist der Hash des nächsten Blocks, und in den meisten Fällen reicht diese Zufälligkeit aus. In der Tat kann der Miner diese Zufallszahlen in gewissem Maße manipulieren. Angenommen, ein Miner beteiligt sich an einem Glücksspiel, und der Gewinn des Glücksspiels ist größer als der Gewinn eines Blocks, dann wird der Miner, wenn er einen Block ausgraben würde, der ihn aus dem Glücksspiel macht, offensichtlich entscheiden, den neuen Block nicht zu veröffentlichen, was je stärker die Rechenleistung des einzelnen Miners ist.
Daher müssen wir ein ähnliches Mechanismus einführen, wie wir eine Wechselkurse einfordern, um zufällige Zahlen zu sammeln, die dann am Ende jeder Zeitfenster verwendet werden, um eine zufällige Zahl zu berechnen und. Aber wie bei der Einforderung von Wechselkursen, da die Teilnehmer den Wechselkurs einreichen, indem sie Transaktionen erstellen, sind die zufälligen Zahlen, die jeder einzelne zwischen den Zeitfenstern einreicht, für alle anderen sichtbar.
Es ist also notwendig, dass wir das Fenster der Sammlung von Samen in zwei Teile unterteilen, um eine Zufallszahl zu erhalten, die niemand vorhersagen und eingreifen kann:
In der ersten Stufe kennt man nur die zerlegten Werte der Seeds, die andere eingereicht haben, und nicht die tatsächlichen Seeds, und kann daher nicht sorgfältig einen Seed konstruieren, um das Ergebnis zu beeinflussen; in der zweiten Stufe bestätigt jeder nur die Seeds, die in der ersten Stufe eingereicht wurden, und kann keine neuen eingereicht werden, und kann auch andere Seeds nicht verhindern.
Wie wir bereits erwähnt haben, bietet Bitcoin Script keine Fähigkeit, Loops, Recursions und Sprünge anzubieten. Vielleicht hat Bitcoin die Ausführung einer Bitcoin Script-Zeit kontrolliert, weil ein Programm, das in einer Programmiersprache geschrieben wurde, die Turing-komplett ist, nicht immer nur aus der Sicht der statischen Analyse beurteilen kann, ob es nach begrenzten Schritten endet. Auf diese Weise können böswillige Angreifer eine Transaktion erstellen, die einen toten Kreislauf verursacht, um die normale Arbeit der Miner zu stören.
Der EVM ist eine kostenpflichtige virtuelle Maschine, die in EVM-Standards definiert ist, je nach benötigter Speicher- und CPU-Zeit, die jeder opcode verbraucht. Dies ist eine Rechenressource, die von Ether gekauft wird. Wenn das Ziel einer Transaktion der Contract ist, wird der Code des Contracts ausgeführt, der Auftraggeber muss für den Gas bezahlen, der bei der Ausführung des Contracts verbraucht wird, und erklärt, dass “eine höchstmögliche Anzahl von Gas zu zahlen bereit ist”, und die Ausführung des Contracts wird gestoppt, wenn der Gas auf halbem Weg erschöpft wird.
Wenn wir dann noch einmal auf die Frage des “Konsensintervalls” zurückkommen, dann wird in Bitcoin alle 10 Minuten ein neuer Block erscheinen, das heißt, dass das gesamte Netzwerk alle 10 Minuten einen “Konsens” erzielt, so dass normalerweise ein Bitcoin-Geschäft mehrere Minuten dauert, bis es bestätigt wird. In den frühen Jahren, in denen die Rechenleistung nicht sehr hoch ist, kann es eine Stunde dauern, bis man den Handel als zuverlässig erachtet.
Das liegt daran, dass ein schnellerer Konsensintervall die Vorteile des “zentralen Minenpools” in gewisser Weise erhöht. “Minenpool” bedeutet, dass Bitcoin-Miner zusammenkommen, um Minen zu schüren, die Miner folgen den Anweisungen des Minenpools bedingungslos und schließlich die Gewinne mit dem Minenpool teilen. Bitcoin als dezentrales System möchte offensichtlich nicht, dass dieser zentralisierte Minenpool zusätzliche Vorteile hat.
Wenn ein Miner A einen neuen Block findet, sendet er diesen Block aus, und sobald die anderen diese Nachricht erhalten haben, beginnen sie sofort mit der Arbeit an diesem neuen Block. Die Berechnung der Zeit zwischen “A hat einen neuen Block gefunden” und “A hat eine Nachricht erhalten, die von A ausgestrahlt wird” ist für die anderen Leute praktisch verschwendet, während andere Miner in den zentralen Minen das Problem nicht haben, weil sie schneller über die neuen Blöcke informiert sind und sofort mit der Arbeit an den neuen Blöcken beginnen.

Diese Übertragung kann einige Sekunden dauern, was für 10 Minuten nicht so wichtig ist, aber die Vorteile eines zentralen Miningpools werden immer deutlicher, wenn man die Konsensspannweite verkürzt. Ethereum löst dieses Problem jedoch durch die Einführung des Konzepts “Uncle Block”, der die Konsensspannweite auf 15 Sekunden reduziert, und Bitcoin hat eine große Verbesserung der Zahlungsbestätigungsgeschwindigkeit.
In der Bitcoin-Blockchain kann ein Block nur einen Vaterblock und nur einen Sohnblock haben. In Ethereum kann ein neu entstandener Block jedoch einen Vaterblock und mehrere Onkelblöcke haben. Zurück zum obigen Beispiel: Wenn in A ein neuer Block abgebaut wird, der aber noch nicht von anderen Personen empfangen wurde, während der Ausstrahlung, wenn jemand einen neuen Block abgebaut hat, der jedoch, weil die Ausstrahlung zu spät war, nicht von allen angenommen wurde, dann könnte dieser Block zum “Onkelblock” des nächsten Blocks werden.

Das Bild stammt von<https://blog.ethereum.org/2014/07/11/toward-a-12-second-block-time
Im nächsten Teil möchte ich Ihnen einige der Probleme vorstellen, die Ethereum noch nicht gelöst hat.
Das Problem mit der Arbeitskräftebescheinigung besteht darin, dass eine große Menge an Rechenleistung verschwendet wird, um die Sicherheit des Netzwerks zu gewährleisten, obwohl dies auch auf der Idee des “wirtschaftlichen Anreizes” basiert, die wir zuvor erwähnt haben. Ehtereum meint, dass es besser ist, die Arbeitskräftebescheinigung durch POS zu ersetzen, um die Effizienz des Netzwerks enorm zu verbessern.
Wenn Ether an sich wertvoll ist, warum kann man dann nicht von sich aus einen wirtschaftlichen Anreiz für Ether schaffen? POS bedeutet, dass jeder Node, der an der Blockproduktion teilnehmen möchte (Mining im herkömmlichen Sinne) als “Verifizierer” bezeichnet wird, eine Garantie an das System zahlen muss (das System bezieht sich hier auf eine Vorschrift in der Vereinbarung, dass alle Nodes der Ansicht sind, dass die Garantie “eingefroren” ist) und dann mit seinem eigenen Garantiegeld für die mögliche Anmeldung des nächsten Blocks bezahlen (eine wichtige Voraussetzung für die so genannte “wahrscheinliche” Anmeldung ist, dass der Block die Vereinbarung erfüllen muss), wenn der Block tatsächlich der nächste Block wird, werden alle Anmeldungen belohnt, ansonsten wird die Garantie nicht gewährt.
Das Modell ist sehr ähnlich wie bei POW, bei dem Miner ihre eigenen Rechenkräfte verwenden, um “Wetten” zu machen, und wenn eine Kette länger ist, ist es notwendig, auf diese zu wechseln, um weiter zu minen.
Der Einsatz von POS-Systemen erhöht die Durchsatzleistung des gesamten Netzwerks. Ohne die Notwendigkeit, Konsens zu erzielen, indem man eine Menge sinnloser Berechnungen durchführt, wird die Anzahl der Rechnungen pro Knoten nahe an die Anzahl der Rechnungen kommen, die für die Ausführung von Code in einem Vertrag und die Datenüberprüfung erforderlich sind.
Einer der Gründe, warum POS noch nicht eingesetzt wurde, ist, dass es noch einige ungelöste Probleme gibt, darunter ein 51% -Angriff wie POW, bei dem 51% der gesamten Netzwerk-Rechenleistung in POW eine gewisse physikalische Einschränkung hat, da die Rechenleistung von Rechengeräten zur Verfügung gestellt werden muss. Im Gegensatz dazu ist Ether, das 51% der gesamten Netzwerk in POS sammelt, vergleichsweise leicht zu kaufen, wenn Sie genug Geld haben.
Ein weiteres Thema ist die “Fragmentierung”, bei der sowohl Bitcoin als auch Ethereum alle Transaktionen auf derselben Blockchain bestätigen, was die Rechenleistung eines verteilten Netzwerks erheblich einschränkt. Jeder Knoten muss jede Transaktion empfangen, speichern und verifizieren.
Daher möchte Ethereum in Zukunft eine “Fragmentierung” einführen, um das gesamte Netzwerk in mehrere Teile zu unterteilen, die unabhängig voneinander die Transaktionsprüfung durchführen. Die Fragmentierung wird jedoch durch die Struktur der Zeiger auf die Daten anderer Fragmente verwiesen und die anderen Fragmente durch asynchrone Aufrufe beeinflusst, so dass das gesamte Netzwerk für den Benutzer immer noch einheitlich ist, nur dass die Verarbeitungskapazität des gesamten Netzwerks sehr stark erweiterbar ist.
In diesem Abschnitt werde ich Ihnen einige praktische, funktionierende Codes für Contract zeigen. Contract kann in vielen verschiedenen Sprachen geschrieben werden, die schließlich zu Opcode kompiliert werden, der auf dem EVM ausgeführt wird.
contract Test {
uint storedData; // State variable
struct Voter { // Struct
uint weight;
bool voted;
address delegate;
uint vote;
}
event HighestBidIncreased(address bidder, uint amount); // Event
function func() { // Function
if (msg.sender.balance < 10 finney) {
msg.sender.send(10 finney);
}
sha256("...");
address nameServer = 0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2;
nameServer.delegatecall("isAvailable", "MyName");
nameServer.call("register", "MyName");
}
}
Hier sind einige der zentralen Syntax-Beispiele, mit denen Sie in Solidity eine Statusvariable deklarieren können:uint storedData;Diese Variablen werden für immer auf der Blockchain gespeichert.structEin Contract kann also mehrere Funktionen bereitstellen, in denen man logische Entscheidungen treffen kann, die sich umkreisen und die Werte ändern kann.
Die Sprache bietet einige praktische Funktionen, wie zum Beispiel die Verwendung von gängigen Kryptographie-Algorithmen.sha256Einheit umgerechnet10 finneyIch habe mir die Adresse des Geldbeutels direkt geschrieben.0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2Und so weiter.msgEs ist eine integrierte globale Variable, aus der Informationen über die Transaktion abgelesen werden können, wie z. B. den Initiator, den Betrag usw. Der Code eines anderen Vertrags kann auf zwei Arten aufgerufen werden:delegatecallDas ist so, als würde man den Code eines anderen Contract in den aktuellen Kontext einfügen, als würde man eine Bibliotheksfunktion einführen.callDie Logik eines neuen Deals, der einen anderen Contract auslöst.
Diese komplexe Arbeit wird als “Status-Variable” abstrahiert, wobei storedData eine Status-Variable ist. In der Tat werden Änderungen der Status-Variablen während der Ausführung des Vertrags nicht in der Blockchain gespeichert, da die Ausführung des Vertrags eine endgültige Berechnung ist.
Ich zeige Ihnen jetzt einen wirklich brauchbaren Contract Coin, der seinen eigenen Token auf der Basis des Ethereum-Netzwerks ausgibt:
contract Coin {
// The keyword "public" makes those variables
// readable from outside.
address public minter;
mapping (address => uint) public balances;
// Events allow light clients to react on
// changes efficiently.
event Sent(address from, address to, uint amount);
// This is the constructor whose code is
// run only when the contract is created.
function Coin() {
minter = msg.sender;
}
function mint(address receiver, uint amount) {
if (msg.sender != minter) return;
balances[receiver] += amount;
}
function send(address receiver, uint amount) {
if (balances[msg.sender] < amount) return;
balances[msg.sender] -= amount;
balances[receiver] += amount;
Sent(msg.sender, receiver, amount);
}
}
Der Code stammt vonhttp://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html#subcurrency-example (MIT)
Der Vertrag, der als “Coin” bezeichnet wird, erklärt zwei Statusvariablen:minterDie Erfinder der Token, die diese Speicher verwenden, konstruieren die Funktion ((function Coin()Der erste Auftragsgeber, der für die Erstellung des Contracts verwendet wurde, wurde dieser Variablen zugeordnet; außerdem wurde eine Wallet-Adresse in die Karte der Zahlen deklariert.balances, wird verwendet, um den Saldo jeder Adresse, die den Token besitzt, anzuzeigen.
mintDiese Funktion beurteilt, ob der Initiator der Transaktion der Erfinder des Tokens ist, und wenn ja, fügt sie eine bestimmte Anzahl von Token an die angegebene Adresse gemäß den Funktionsparametern hinzu.sendDiese Funktion kann von allen aufgerufen werden und entzieht der Adresse des Auftraggebers einen bestimmten Betrag an Salden (wenn es genügend Salden gibt) und addiert ihn der Adresse des Ziels, was einer Überweisungsfunktion entspricht.
Wir erklärten auch, dass wir einen Namen haben:SentDie Ereignisse, die Ereignisse haben keine praktische Funktion, sondern nur den Druck von kritischen Ereignissen bei der Debugging erleichtern. In Zukunft wird es auch die Implementierung von Leichtbau-Clients erleichtern.

Ethereum bietet eine IDE namens Mix, um den Code zu deaktivieren. Auf der rechten Seite des Mix können Sie einige Blöcke und Konten virtualisieren, um Ihren Vertrag zu testen, und Sie können auch sehen, wie sich die Werte der einzelnen Statusvariablen während der Ausführung ändern. Es ist erwähnenswert, dass der Vertrag, sobald er veröffentlicht wurde, nicht geändert werden kann, und der Betrieb danach vollständig von Transaktionen anderer Personen ausgelöst wird.
Wenn wir fertig sind, können wir den Vertrag mit der Ethereum-Wallets im Netz veröffentlichen:

Nach der Veröffentlichung können Sie den Contract im Detail-Interface verfolgen:

Auf der linken Seite sehen Sie die Werte der beiden Statusvariablen.minterIch habe keine Ahnung, wie ich mich mit dieser Frage auseinandersetzen kann.balancesAuf der rechten Seite können Sie neue Transaktionen mit diesem Contract initiieren, und es gibt ein Dropdown-Menü, das Sie auswählen können.sendOder vielleicht…mintFunktion, Sie können die Parameter für die Übermittlung an den Contract ausfüllen. Da wir hier eine Transaktion mit dem Ziel der Übermittlung einer Nachricht und nicht mit dem Ziel der Übermittlung von Ether ausführen, müssen wir den Betrag der Transaktion nicht festlegen.
Der Contract, den ich hier vorstellen möchte, ist ein interessanter Contract, der einen “Ponzi-Schwindel” bewirkt, indem man dem Contract 1 Ether zahlt, um in das Spiel einzutreten, und 3 Ether für jede weitere Person, die sich anschließt.
contract Pyramid {
struct Participant {
address etherAddress;
}
Participant[] public participants;
uint public payoutIdx = 0;
// events make it easier to interface with the contract
event NewParticipant(uint indexed idx);
// fallback function - simple transactions trigger this
function() {
enter();
}
function enter() {
if (msg.value < 1 ether) {
msg.sender.send(msg.value);
return;
}
if (msg.value > 1 ether) {
msg.sender.send(msg.value - 1 ether);
}
uint idx = participants.length;
participants.length += 1;
participants[idx].etherAddress = msg.sender;
NewParticipant(idx);
// for every three new participants we can
// pay out to an earlier participant
if (idx != 0 && idx % 3 == 0) {
// payout is triple, minus 10 % fee
uint amount = 3 ether;
participants[payoutIdx].etherAddress.send(amount);
payoutIdx += 1;
}
}
function getNumberOfParticipants() constant returns (uint n) {
return participants.length;
}
}
Vereinfachte Codes<https://ethereumpyramid.com/contract.html
Der Code ist sehr einfach, der Contract erklärt eineparticipantsDie Array wird verwendet, um die Wallet-Adressen aller Teilnehmer in der Reihenfolge zu speichern, oder um eine zu deklarieren.payoutIdxEs wird verwendet, um zu erfassen, wie viele Teilnehmer bereits 3 Ether zurückerhalten haben.enterDie wichtigste Funktion des Contracts besteht darin, zunächst einige Parameter zu überprüfen, um sicherzustellen, dass jeder Teilnehmer 1 Ether bezahlt hat, und dann neue Teilnehmer in die Ether-Karte einzufügen.participantsAm Ende des Arrays schickt man 3 Ether an den ersten Teilnehmer, wenn der aktuelle Teilnehmer eine 3er-Multiplikation hat.payoutIdxEin Teilnehmer, der sich mit derpayoutIdxWeisen Sie auf den nächsten Teilnehmer.
HashTree:
Bitcoin:
Halting Problem:
Ethereum:
Ethereum Network:
Next of Ethereum:
Contract:
Contract IDE: