
Bitcoin: Ein Peer-to-Peer Elektronisches Kassensystem
Eine rein Peer-to-Peer-Version von elektronischem Geld würde es ermöglichen, Online-Zahlungen direkt von einer Partei an eine andere zu senden, ohne über ein Finanzinstitut zu gehen. Digitale Signaturen bieten einen Teil der Lösung, aber die Hauptvorteile gehen verloren, wenn ein vertrauenswürdiger Dritter weiterhin erforderlich ist, um doppelte Ausgaben zu verhindern. Wir schlagen eine Lösung für das Problem der doppelten Ausgaben vor, indem wir ein Peer-to-Peer-Netzwerk verwenden. Das Netzwerk stempelt Transaktionen, indem es sie in eine fortlaufende Kette von hashbasiertem Proof-of-Work hasht, und bildet ein Protokoll, das nicht verändert werden kann, ohne den Proof-of-Work erneut durchzuführen. Die längste Kette dient nicht nur als Beweis für die Reihenfolge der beobachteten Ereignisse, sondern auch als Beweis, dass sie aus dem größten Pool von CPU-Leistung stammt. Solange eine Mehrheit der CPU-Leistung von Knoten kontrolliert wird, die nicht kooperieren, um das Netzwerk anzugreifen, werden sie die längste Kette erzeugen und Angreifer überholen. Das Netzwerk selbst erfordert eine minimale Struktur. Nachrichten werden auf einer besten Aufwandbasis gesendet, und Knoten können nach Belieben das Netzwerk betreten und verlassen, wobei sie die längste Proof-of-Work-Kette als Nachweis akzeptieren, was passiert ist, während sie weg waren.
1. Einführung Der Handel im Internet hat sich fast ausschließlich auf Finanzinstitute verlassen, die als vertrauenswürdige Dritte fungieren, um elektronische Zahlungen zu verarbeiten. Während das System für die meisten Transaktionen gut genug funktioniert, leidet es immer noch unter den inhärenten Schwächen des vertrauensbasierten Modells. Vollständig nicht umkehrbare Transaktionen sind wirklich nicht möglich, da Finanzinstitute nicht vermeiden können, Streitigkeiten zu schlichten. Die Kosten für die Mediation erhöhen die Transaktionskosten, begrenzen die minimal praktikable Transaktionsgröße und schneiden die Möglichkeit für kleine Gelegenheitsgeschäfte ab, und es gibt einen breiteren Kostenfaktor im Verlust der Fähigkeit, nicht umkehrbare Zahlungen für nicht umkehrbare Dienstleistungen zu leisten. Mit der Möglichkeit einer Umkehrung verbreitet sich das Bedürfnis nach Vertrauen. Händler müssen vorsichtig mit ihren Kunden sein und sie nach mehr Informationen fragen, als sie normalerweise benötigen würden. Ein gewisser Prozentsatz von Betrug wird als unvermeidlich akzeptiert. Diese Kosten und Zahlungsunsicherheiten können persönlich durch die Nutzung physischer Währungen vermieden werden, aber es gibt keinen Mechanismus, um Zahlungen über einen Kommunikationskanal ohne einen vertrauenswürdigen Dritten zu leisten. Was benötigt wird, ist ein elektronisches Zahlungssystem, das auf kryptografischem Nachweis anstelle von Vertrauen basiert und es zwei willigen Parteien ermöglicht, direkt miteinander zu transagieren, ohne die Notwendigkeit eines vertrauenswürdigen dritten Dritten. Transaktionen, die rechnerisch unpraktisch rückgängig zu machen sind, würden Verkäufer vor Betrug schützen, und routinemäßige Treuhandmechanismen könnten leicht implementiert werden, um Käufer zu schützen. In diesem Papier schlagen wir eine Lösung für das Problem der doppelten Ausgaben vor, indem wir einen Peer-to-Peer-verteilten Zeitstempelserver verwenden, um rechnerische Beweise für die chronologische Reihenfolge der Transaktionen zu erzeugen. Das System ist sicher, solange ehrliche Knoten kollektiv mehr CPU-Leistung kontrollieren als jede kooperierende Gruppe von Angreiferknoten.
2. Transaktionen Überprüfen Wir definieren eine elektronische Münze als eine Kette digitaler Signaturen. Jeder Eigentümer überträgt die Münze an den nächsten, indem er einen Hash der vorherigen Transaktion und den öffentlichen Schlüssel des nächsten Eigentümers digital signiert und diese am Ende der Münze hinzufügt. Ein Zahlungsempfänger kann die Signaturen überprüfen, um die Kette des Eigentums zu verifizieren. Transaktion Überprüfen Eigentümer 1's öffentlicher Schlüssel Hash Eigentümer 0's Signatur Eigentümer 1's privater Schlüssel Transaktion Eigentümer 2's öffentlicher Schlüssel Hash Eigentümer 1's Signatur Eigentümer 2's privater Schlüssel Transaktion Eigentümer 3's öffentlicher Schlüssel Hash Eigentümer 2's Signatur Eigentümer 3's privater Schlüssel Das Problem ist natürlich, dass der Zahlungsempfänger nicht überprüfen kann, dass einer der Eigentümer die Münze nicht doppelt ausgegeben hat. Eine gängige Lösung besteht darin, eine vertrauenswürdige zentrale Autorität, oder Münze, einzuführen, die jede Transaktion auf doppelte Ausgaben überprüft. Nach jeder Transaktion muss die Münze an die Münze zurückgegeben werden, um eine neue Münze auszugeben, und nur Münzen, die direkt von der Münze ausgegeben werden, gelten als vertrauenswürdig, nicht doppelt ausgegeben zu werden. Das Problem mit dieser Lösung ist, dass das Schicksal des gesamten Geldsystems von dem Unternehmen abhängt, das die Münze betreibt, wobei jede Transaktion durch sie gehen muss, genau wie bei einer Bank. Wir benötigen eine Möglichkeit für den Zahlungsempfänger, um zu wissen, dass die vorherigen Eigentümer keine früheren Transaktionen signiert haben. Für unsere Zwecke ist die früheste Transaktion die, die zählt, daher ist uns spätere Versuche, doppelt auszugeben, egal. Der einzige Weg, um das Fehlen einer Transaktion zu bestätigen, besteht darin, sich aller Transaktionen bewusst zu sein. Im auf Münzen basierenden Modell war die Münze sich aller Transaktionen bewusst und entschied, welche zuerst eintraf. Um dies ohne eine vertrauenswürdige Partei zu erreichen, müssen Transaktionen öffentlich angekündigt werden [1], und wir benötigen ein System, damit die Teilnehmer sich auf eine einzige Geschichte der Reihenfolge einigen, in der sie empfangen wurden. Der Zahlungsempfänger benötigt einen Nachweis, dass zu dem Zeitpunkt jeder Transaktion die Mehrheit der Knoten zustimmte, dass es die erste war, die empfangen wurde.
3. Zeitstempel-Server Die Lösung, die wir vorschlagen, beginnt mit einem Zeitstempel-Server. Ein Zeitstempel-Server funktioniert, indem er einen Hash eines Blocks von Elementen, die zeitgestempelt werden sollen, erstellt und den Hash weit verbreitet, beispielsweise in einer Zeitung oder einem Usenet-Beitrag [2-5]. Der Zeitstempel beweist, dass die Daten zu diesem Zeitpunkt existiert haben müssen, um in den Hash zu gelangen. Jeder Zeitstempel enthält den vorherigen Zeitstempel in seinem Hash und bildet eine Kette, wobei jeder zusätzliche Zeitstempel die vorherigen bestätigt. Hash Hash Block Element Element Block ... Element Element ...
4. Proof-of-Work Um einen verteilten Zeitstempelserver auf Peer-to-Peer-Basis zu implementieren, müssen wir ein Proof-of-Work-System verwenden, das Adam Backs Hashcash [6] ähnlich ist, anstatt Zeitungs- oder Usenet-Beiträge zu verwenden. Der Proof-of-Work umfasst das Scannen nach einem Wert, der, wenn er gehasht wird, z.B. mit SHA-256, der Hash mit einer bestimmten Anzahl von Null-Bits beginnt. Die durchschnittliche Arbeit, die erforderlich ist, ist exponentiell in der Anzahl der benötigten Null-Bits und kann überprüft werden, indem ein einzelner Hash ausgeführt wird. Für unser Zeitstempel-Netzwerk implementieren wir den Proof-of-Work, indem wir einen Nonce im Block erhöhen, bis ein Wert gefunden wird, der den Hash des Blocks mit den erforderlichen Null-Bits versieht. Sobald der CPU-Aufwand aufgebracht wurde, um den Proof-of-Work zu erfüllen, kann der Block nicht geändert werden, ohne die Arbeit erneut durchzuführen. Wenn spätere Blöcke daran angekettet sind, würde die Arbeit zur Änderung des Blocks die Wiederholung aller nachfolgenden Blöcke umfassen. Block Prev Hash Tx Block Nonce Tx ... Prev Hash Nonce Tx Tx ... Der Proof-of-Work löst auch das Problem der Bestimmung der Vertretung in Mehrheitsentscheidungen. Wenn die Mehrheit auf einer IP-Adresse-basierten Abstimmung beruht, könnte sie von jedem unterlaufen werden, der viele IPs zuweisen kann. Proof-of-Work ist im Wesentlichen eine CPU-eine Stimme. Die Mehrheitsentscheidung wird durch die längste Kette dargestellt, die den größten Proof-of-Work-Aufwand investiert hat. Wenn eine Mehrheit der CPU-Leistung von ehrlichen Knoten kontrolliert wird, wird die ehrliche Kette am schnellsten wachsen und alle konkurrierenden Ketten überholen. Um einen vergangenen Block zu ändern, müsste ein Angreifer den Proof-of-Work des Blocks und aller nachfolgenden Blöcke wiederholen und dann die Arbeit der ehrlichen Knoten überholen. Wir werden später zeigen, dass die Wahrscheinlichkeit, dass ein langsamerer Angreifer aufholt, exponentiell abnimmt, wenn nachfolgende Blöcke hinzugefügt werden. Um den steigenden Hardwaregeschwindigkeiten und dem variierenden Interesse an der Ausführung von Knoten über die Zeit Rechnung zu tragen, wird der Schwierigkeitsgrad des Proof-of-Work anhand eines gleitenden Durchschnitts bestimmt, der eine durchschnittliche Anzahl von Blöcken pro Stunde anstrebt. Wenn sie zu schnell generiert werden, steigt der Schwierigkeitsgrad.
5. Netzwerk Die Schritte zum Betrieb des Netzwerks sind wie folgt: 1) Neue Transaktionen werden an alle Knoten gesendet. 2) Jeder Knoten sammelt neue Transaktionen in einem Block. 3) Jeder Knoten arbeitet daran, einen schwierigen Proof-of-Work für seinen Block zu finden. 4) Wenn ein Knoten einen Proof-of-Work findet, sendet er den Block an alle Knoten. 5) Knoten akzeptieren den Block nur, wenn alle Transaktionen darin gültig und nicht bereits ausgegeben sind. 6) Knoten drücken ihre Akzeptanz des Blocks aus, indem sie daran arbeiten, den nächsten Block in der Kette zu erstellen, wobei sie den Hash des akzeptierten Blocks als vorherigen Hash verwenden. Knoten betrachten immer die längste Kette als die richtige und werden weiterhin daran arbeiten, sie zu erweitern. Wenn zwei Knoten unterschiedliche Versionen des nächsten Blocks gleichzeitig senden, können einige Knoten zuerst die eine oder die andere erhalten. In diesem Fall arbeiten sie an dem ersten, den sie erhalten haben, speichern jedoch den anderen Zweig, falls er länger wird. Der Gleichstand wird gebrochen, wenn der nächste Proof-of-Work gefunden wird und ein Zweig länger wird; die Knoten, die an dem anderen Zweig gearbeitet haben, wechseln dann zum längeren.
Neue Transaktionssendungen müssen nicht unbedingt alle Knoten erreichen. Solange sie viele Knoten erreichen, werden sie bald in einen Block aufgenommen. Blocksendungen sind auch tolerant gegenüber verlorenen Nachrichten. Wenn ein Knoten keinen Block erhält, wird er ihn anfordern, wenn er den nächsten Block erhält und erkennt, dass er einen verpasst hat.
6. Anreiz Nach Konvention ist die erste Transaktion in einem Block eine spezielle Transaktion, die eine neue Münze startet, die dem Ersteller des Blocks gehört. Dies fügt einen Anreiz für Knoten hinzu, das Netzwerk zu unterstützen und bietet eine Möglichkeit, die Münzen zunächst in Umlauf zu bringen, da es keine zentrale Autorität gibt, die sie ausgibt. Die kontinuierliche Hinzufügung einer konstanten Menge neuer Münzen ist analog zu Goldgräbern, die Ressourcen aufwenden, um Gold in Umlauf zu bringen. In unserem Fall sind es CPU-Zeit und Elektrizität, die aufgebracht werden. Der Anreiz kann auch durch Transaktionsgebühren finanziert werden. Wenn der Ausgabewert einer Transaktion geringer ist als ihr Eingabewert, ist die Differenz eine Transaktionsgebühr, die dem Anreizwert des Blocks hinzugefügt wird, der die Transaktion enthält. Sobald eine vorbestimmte Anzahl von Münzen in Umlauf gekommen ist, kann der Anreiz vollständig zu Transaktionsgebühren übergehen und vollständig inflationsfrei sein. Der Anreiz kann helfen, Knoten zu ermutigen, ehrlich zu bleiben. Wenn ein gieriger Angreifer in der Lage ist, mehr CPU-Leistung als alle ehrlichen Knoten zu versammeln, müsste er zwischen der Verwendung zur Betrügerei, indem er seine Zahlungen zurückstehlt, oder der Verwendung zur Generierung neuer Münzen wählen. Er sollte es rentabler finden, sich an die Regeln zu halten, solche Regeln, die ihm mehr neue Münzen als allen anderen zusammen zugestehen, als das System und die Gültigkeit seines eigenen Wohlstands zu untergraben.
7. Wiederherstellung von Speicherplatz Sobald die neueste Transaktion in einer Münze unter genügend Blöcken vergraben ist, können die zuvor ausgegebenen Transaktionen verworfen werden, um Speicherplatz zu sparen. Um dies zu erleichtern, ohne den Hash des Blocks zu brechen, werden Transaktionen in einem Merkle-Baum [7][2][5] gehasht, wobei nur die Wurzel im Hash des Blocks enthalten ist. Alte Blöcke können dann durch Stutzen von Zweigen des Baums komprimiert werden. Die inneren Hashes müssen nicht gespeichert werden. Block Blocküberschrift (Block Hash) Prev Hash Nonce Wurzel Hash Hash01 Hash0 Hash1 Hash23 Hash2 Tx0 Tx1 Tx2 Hash3 Tx3 In einem Merkle-Baum gehasht Block Blocküberschrift (Block Hash) Prev Hash Nonce Wurzel Hash Hash01 Hash23 Hash2 Hash3 Tx3 Nach dem Stutzen von Tx0-2 aus dem Block Eine Blocküberschrift ohne Transaktionen würde etwa 80 Bytes betragen. Wenn wir annehmen, dass Blöcke alle 10 Minuten generiert werden, wären das 80 Bytes * 6 * 24 * 365 = 4,2 MB pro Jahr. Mit Computersystemen, die typischerweise mit 2 GB RAM ab 2008 verkauft werden, und Moore's Law, das ein aktuelles Wachstum von 1,2 GB pro Jahr vorhersagt, sollte der Speicherplatz auch dann kein Problem sein, wenn die Blocküberschriften im Speicher gehalten werden müssen.
8. Vereinfachte Zahlungsüberprüfung Es ist möglich, Zahlungen zu überprüfen, ohne einen vollständigen Netzwerk-Knoten zu betreiben. Ein Benutzer muss nur eine Kopie der Blocküberschriften der längsten Proof-of-Work-Kette aufbewahren, die er erhalten kann, indem er Netzwerk-Knoten abfragt, bis er überzeugt ist, dass er die längste Kette hat, und den Merkle-Zweig, der die Transaktion mit dem Block verbindet, in dem sie zeitgestempelt ist, erhalten. Er kann die Transaktion nicht selbst überprüfen, aber indem er sie mit einem Ort in der Kette verknüpft, kann er sehen, dass ein Netzwerk-Knoten sie akzeptiert hat, und Blöcke, die nach ihm hinzugefügt werden, bestätigen weiter, dass das Netzwerk sie akzeptiert hat. Längste Proof-of-Work-Kette Blocküberschrift Prev Hash Nonce Merkle Root Blocküberschrift Prev Hash Merkle Root Hash01 Hash2 Blocküberschrift Nonce Prev Hash Nonce Merkle Root Hash23 Merkle-Zweig für Tx3 Hash3 Tx3 Daher ist die Überprüfung zuverlässig, solange ehrliche Knoten das Netzwerk kontrollieren, ist jedoch anfälliger, wenn das Netzwerk von einem Angreifer überwältigt wird. Während Netzwerk-Knoten Transaktionen für sich selbst überprüfen können, kann die vereinfachte Methode von den gefälschten Transaktionen eines Angreifers überlistet werden, solange der Angreifer weiterhin das Netzwerk überwältigen kann. Eine Strategie, um sich dagegen zu schützen, wäre, Warnungen von Netzwerk-Knoten zu akzeptieren, wenn sie einen ungültigen Block erkennen, was die Software des Benutzers dazu auffordert, den vollständigen Block und die alarmierten Transaktionen herunterzuladen, um die Inkonsistenz zu bestätigen. Unternehmen, die häufige Zahlungen erhalten, möchten wahrscheinlich dennoch ihre eigenen Knoten betreiben, um unabhängige Sicherheit und schnellere Überprüfung zu gewährleisten.
9. Kombinieren und Teilen von Werten Obwohl es möglich wäre, Münzen einzeln zu behandeln, wäre es unhandlich, für jeden Cent in einer Übertragung eine separate Transaktion durchzuführen. Um den Wert aufzuteilen und zu kombinieren, enthalten Transaktionen mehrere Eingaben und Ausgaben. Normalerweise gibt es entweder eine einzelne Eingabe von einer größeren vorherigen Transaktion oder mehrere Eingaben, die kleinere Beträge kombinieren, und höchstens zwei Ausgaben: eine für die Zahlung und eine, die das Wechselgeld, falls vorhanden, an den Absender zurückgibt. Transaktion Eingabe Eingabe Ausgabe ... ... Es sollte beachtet werden, dass das Fächer, bei dem eine Transaktion von mehreren Transaktionen abhängt und diese Transaktionen von vielen weiteren abhängen, hier kein Problem darstellt. Es besteht niemals die Notwendigkeit, eine vollständige eigenständige Kopie der Transaktionshistorie zu extrahieren.
10. Privatsphäre Das traditionelle Bankmodell erreicht ein gewisses Maß an Privatsphäre, indem es den Zugriff auf Informationen auf die beteiligten Parteien und die vertrauenswürdige dritte Partei beschränkt. Die Notwendigkeit, alle Transaktionen öffentlich anzukündigen, schließt diese Methode jedoch aus, aber die Privatsphäre kann weiterhin an anderer Stelle gewahrt werden: indem öffentliche Schlüssel anonym bleiben. Die Öffentlichkeit kann sehen, dass jemand einen Betrag an jemand anderen sendet, jedoch ohne Informationen, die die Transaktion mit jemandem verknüpfen. Dies ähnelt dem Informationsgrad, der von Börsen veröffentlicht wird, wo die Zeit und die Größe einzelner Trades, das "Tape", öffentlich gemacht werden, jedoch ohne zu verraten, wer die Parteien waren. Traditionelles Privatsphäre-Modell Identitäten Neues Privatsphäre-Modell Identitäten Transaktionen Vertrauenswürdige dritte Partei Transaktionen Öffentliche Gegenpartei Öffentlich Um eine zusätzliche Firewall zu schaffen, sollte für jede Transaktion ein neues Schlüsselpaar verwendet werden, um zu verhindern, dass sie mit einem gemeinsamen Eigentümer verknüpft werden. Einige Verknüpfungen sind dennoch unvermeidlich bei Multi-Input-Transaktionen, die notwendigerweise offenbaren, dass ihre Eingaben dem selben Eigentümer gehörten. Das Risiko besteht darin, dass, wenn der Eigentümer eines Schlüssels offenbart wird, Verknüpfungen andere Transaktionen offenbaren könnten, die dem selben Eigentümer gehörten.
11. Berechnungen Wir betrachten das Szenario eines Angreifers, der versucht, eine alternative Kette schneller als die ehrliche Kette zu generieren. Selbst wenn dies gelingt, öffnet es das System nicht für beliebige Änderungen, wie das Erzeugen von Werten aus dem Nichts oder das Entziehen von Geld, das dem Angreifer nie gehört hat. Knoten werden eine ungültige Transaktion nicht als Zahlung akzeptieren, und ehrliche Knoten werden niemals einen Block akzeptieren, der sie enthält. Ein Angreifer kann nur versuchen, eine seiner eigenen Transaktionen zu ändern, um Geld zurückzunehmen, das er kürzlich ausgegeben hat. Das Rennen zwischen der ehrlichen Kette und einer Angreiferkette kann als binomialer Zufallsprozess charakterisiert werden. Das Erfolgsevent ist, dass die ehrliche Kette um einen Block erweitert wird, wodurch sich ihr Vorsprung um +1 erhöht, und das Fehlschlagsevent ist, dass die Kette des Angreifers um einen Block erweitert wird, wodurch die Lücke um -1 verringert wird. Die Wahrscheinlichkeit, dass ein Angreifer von einem bestimmten Defizit aufholt, ist analog zu einem Glücksspielerruin-Problem. Angenommen, ein Spieler mit unbegrenztem Kredit beginnt mit einem Defizit und spielt potenziell eine unendliche Anzahl von Versuchen, um den Break-even zu erreichen. Wir können die Wahrscheinlichkeit berechnen, dass er jemals den Break-even erreicht oder dass ein Angreifer jemals mit der ehrlichen Kette aufholt, wie folgt [8]: p = Wahrscheinlichkeit, dass ein ehrlicher Knoten den nächsten Block findet q = Wahrscheinlichkeit, dass der Angreifer den nächsten Block findet qz = Wahrscheinlichkeit, dass der Angreifer jemals von z Blöcken zurück aufholt qz = { 1 wenn p≤q q/ pz wenn pq }
Angesichts unserer Annahme, dass p > q, sinkt die Wahrscheinlichkeit exponentiell, wenn die Anzahl der Blöcke, die der Angreifer aufholen muss, zunimmt. Mit den Chancen gegen ihn, wenn er nicht frühzeitig einen glücklichen Vorstoß macht, werden seine Chancen immer kleiner, je weiter er zurückfällt. Wir betrachten nun, wie lange der Empfänger einer neuen Transaktion warten muss, bevor er sich ausreichend sicher sein kann, dass der Absender die Transaktion nicht ändern kann. Wir nehmen an, dass der Absender ein Angreifer ist, der möchte, dass der Empfänger glaubt, er habe ihm eine Zeit lang Geld geschickt, um es dann nach einiger Zeit zurückzuzahlen. Der Empfänger wird benachrichtigt, wenn das passiert, aber der Absender hofft, dass es zu spät sein wird. Der Empfänger generiert ein neues Schlüsselpaar und gibt den öffentlichen Schlüssel kurz vor der Unterzeichnung an den Absender weiter. Dies verhindert, dass der Absender im Voraus eine Kette von Blöcken vorbereitet, indem er kontinuierlich daran arbeitet, bis er genug Glück hat, um weit genug voranzukommen, und den Zeitpunkt der Transaktion ausführt. Sobald die Transaktion gesendet wird, beginnt der unehrliche Absender im Geheimen an einer parallelen Kette zu arbeiten, die eine alternative Version seiner Transaktion enthält. Der Empfänger wartet, bis die Transaktion zu einem Block hinzugefügt wurde und z Blöcke nach ihm verknüpft wurden. Er weiß nicht, wie viel Fortschritt der Angreifer gemacht hat, aber wenn man davon ausgeht, dass die ehrlichen Blöcke die durchschnittlich erwartete Zeit pro Block benötigten, wird der potenzielle Fortschritt des Angreifers eine Poisson-Verteilung mit dem erwarteten Wert sein: =z q p Um die Wahrscheinlichkeit zu erhalten, dass der Angreifer jetzt noch aufholen könnte, multiplizieren wir die Poisson-Dichte für jeden Fortschritt, den er gemacht haben könnte, mit der Wahrscheinlichkeit, dass er von diesem Punkt aus aufholen könnte: ∞ ke− ∑ k=0 k! ⋅ { q/ pz−k wenn k≤z 1 wenn kz } Umzustellen, um die unendliche Verteilungsschwänze zu vermeiden... 1−∑ k=0 z ke− k! 1−q/ pz−k In C-Code umwandeln... #include <math.h> double AngreiferErfolgsWahrscheinlichkeit(double q, int z) { double p = 1.0 - q; double lambda = z * (q / p); double sum = 1.0; int i, k; for (k = 0; k <= z; k++) { double poisson = exp(-lambda); for (i = 1; i <= k; i++) poisson *= lambda / i; sum -= poisson * (1 - pow(q / p, z - k)); } return sum; }
Wenn wir einige Ergebnisse ausführen, können wir sehen, dass die Wahrscheinlichkeit exponentiell mit z abnimmt. q=0.1 z=0 P=1.0000000 z=1 P=0.2045873 z=2 P=0.0509779 z=3 P=0.0131722 z=4 P=0.0034552 z=5 P=0.0009137 z=6 P=0.0002428 z=7 P=0.0000647 z=8 P=0.0000173 z=9 P=0.0000046 z=10 P=0.0000012 q=0.3 z=0 P=1.0000000 z=5 P=0.1773523 z=10 P=0.0416605 z=15 P=0.0101008 z=20 P=0.0024804 z=25 P=0.0006132 z=30 P=0.0001522 z=35 P=0.0000379 z=40 P=0.0000095 z=45 P=0.0000024 z=50 P=0.0000006 Lösung für P weniger als 0.1%... P < 0.001 q=0.10 z=5 q=0.15 z=8 q=0.20 z=11 q=0.25 z=15 q=0.30 z=24 q=0.35 z=41 q=0.40 z=89 q=0.45 z=340
12. Fazit Wir haben ein System für elektronische Transaktionen vorgeschlagen, das nicht auf Vertrauen beruht. Wir begannen mit dem üblichen Rahmen von Münzen, die aus digitalen Signaturen bestehen, was eine starke Kontrolle des Eigentums bietet, jedoch unvollständig ist, ohne eine Möglichkeit zur Verhinderung von Doppel-Ausgaben. Um dies zu lösen, schlugen wir ein Peer-to-Peer-Netzwerk vor, das Proof-of-Work verwendet, um eine öffentliche Geschichte der Transaktionen aufzuzeichnen, die schnell rechnerisch unpraktisch für einen Angreifer wird, um sie zu ändern, wenn ehrliche Knoten die Mehrheit der CPU-Leistung kontrollieren. Das Netzwerk ist robust in seiner unstrukturierten Einfachheit. Knoten arbeiten alle gleichzeitig mit wenig Koordination. Sie müssen nicht identifiziert werden, da Nachrichten nicht an einen bestimmten Ort geroutet werden und nur auf einer besten Aufwandbasis geliefert werden müssen. Knoten können nach Belieben das Netzwerk betreten und verlassen, wobei sie die Proof-of-Work-Kette als Nachweis akzeptieren, was passiert ist, während sie weg waren. Sie stimmen mit ihrer CPU-Leistung ab und drücken ihre Akzeptanz gültiger Blöcke aus, indem sie daran arbeiten, diese zu erweitern, und ungültige Blöcke ablehnen, indem sie sich weigern, daran zu arbeiten. Alle benötigten Regeln und Anreize können mit diesem Konsensmechanismus durchgesetzt werden.