Angenommen, ein Miner erhält einen neuen Block von einem verbundenen Peer. Bitte korrigieren Sie mich, wenn ich falsch liege: Der Miner validiert den neu empfangenen Block, bevor er ihn selbst verwendet und an seine anderen verbundenen Peers sendet. Ich habe das gehört, aber es scheint mir, dass es eine bessere Strategie wäre, den Block bereits zum Minen darüber zu verwenden, da der Block-Header und der damit verbundene Arbeitsnachweis sehr schnell zu überprüfen sind und es höchst unwahrscheinlich ist, dass jemand ihn erstellt hat ein Blockheader mit einem kleinen Hash für einen ungültigen Block. Warum also auf dem vorherigen Block weiter schürfen?
Wie lange dauert dieser Vorgang normalerweise? Wovon hängt es ab? Wird es auf spezialisierter Mining-Hardware oder auf einer Allzweck-CPU durchgeführt?
Ist es richtig, dass die Zeit, die die Blockvalidierung benötigt, linear zur Größe des Blocks + des Zeugen ist, sollte Segwit aktiviert werden?
Außerdem: Wie lange dauert es im Durchschnitt, bis ein Block durch das Netzwerk propagiert ist? Es wäre großartig, wenn dieser Durchschnitt nach den Hashing-Kräften der empfangenden Miner gewichtet würde.
Hier gibt es mehrere Fragen.
Bitte korrigieren Sie mich, wenn ich falsch liege: Der Miner validiert den neu empfangenen Block, bevor er ihn selbst verwendet und an seine anderen verbundenen Peers sendet.
Ja und nein. Beachten Sie, dass wir mit Miner über Leute sprechen, die selbst Blöcke bauen - dazu gehören Solo-Miner, Pool-Betreiber und p2pool-Benutzer. Hasher, die sich nur mit einem Pool verbinden und Arbeiten ausführen, gehören nicht zu dieser Gruppe.
Bergleute können – und tun es manchmal – einen neuen Block bauen, bevor sie den vorherigen vollständig verarbeitet haben (selbst wenn es ihr eigener ist), um Zeit zu sparen, die nicht abgebaut wird. Da sie leider noch nicht wissen, welche UTXOs in dem gerade empfangenen Block ausgegeben werden, wissen sie nicht, welche Folgetransaktionen gültig sind, und können daher keine neuen Transaktionen einbeziehen. Aus diesem Grund sind diese Blöcke abgesehen von der Münzbasis leer.
In der Praxis werden diese Miner zwei Mechanismen haben, um den vorgeschlagenen Block zu aktualisieren, an dem ihre Hasher arbeiten:
bitcoind
(über das P2P-Protokoll, über den submitblock
RPC-Befehl für ihre Blöcke oder über separate Relaisnetzwerke wie FIBER ). bitcoind
baut dann einen neuen Satz gültiger Transaktionen darauf auf (über den getblocktemplate
RPC) und sie aktualisieren ihre Hasher, um mit der Arbeit an einem Block mit diesen Blöcken zu beginnen.Die Annahme ist, dass, wenn (1) passiert, derselbe Block kurz durch (2) geht und wir von der Arbeit an einem leeren Block oben zu einem normalen Block oben wechseln. Es gab einmal einen Vorfall, wo dies nicht geschah.
Als BIP66 aktiviert wurde, hörten einige Miner, die eine BIP66-fähige bitcoind
Version ausführen, Blöcke ab, die von Pre-BIP66-Pools gesendet wurden. Ein Pre-BIP66-Miner produzierte einen nicht BIP66-kompatiblen Block (falsche Versionsnummern), und BIP66-fähige Miner hörten zu und begannen, leere Blöcke obendrauf zu produzieren. Natürlich haben sie bitcoind
nie den vollständigen Block akzeptiert, da er nach den neuen Regeln ungültig war – Regeln, denen die Bergleute selbst zugestimmt haben. Das Ergebnis war eine Folge von vielen leeren Blöcken darüber, wobei viele Miner auf den vorherigen ungültigen Blöcken bauten, die alle vom Netzwerk nicht akzeptiert wurden.
Also um deine Frage zu beantworten:
Warum also auf dem vorherigen Block weiter schürfen?
Weil die neue möglicherweise ungültig ist. Aufgrund der Kosten für das Mining eines ungültigen Blocks ist es unwahrscheinlich, dass dies absichtlich geschieht, aber es kann aufgrund von Software- oder manuellen Fehlern passieren. Darüber hinaus sollten wir keine Infrastruktur aufbauen, die darauf angewiesen ist, dass dies nicht geschieht – da dies solche Angriffe im Laufe der Zeit billiger machen könnte.
Wie lange dauert dieser Vorgang normalerweise? Wovon hängt es ab?
In Ihrem Prozess zählen Sie nur die Blockvalidierung. Aber der gesamte Prozess besteht aus allem zwischen (A) der Erstellung eines gültigen Blocks im Netzwerk und (B) Hashern, die dazu übergehen, einen Block darauf aufzubauen. Das beinhaltet:
Die Blöcke müssen sich über das Netzwerk ausbreiten . Normale bitcoind
Knoten breiten sich nur nach vollständiger Validierung aus und benötigen Bursts mit hoher Bandbreite, um alle Blöcke zu übertragen. Neuere Technologien wie Compact Blocks (BIP152) und FIBER vermeiden eine vollständige erneute Einreichung oder sogar das Warten bis zum Abschluss der Validierung.
Die Blöcke müssen validiert werden .
Die Validierung hängt von vielen Faktoren ab:
Die Zeit zum Erstellen eines neuen Blocks hängt hauptsächlich von der Softwareversion ab. In älteren Versionen war es bis zu ein paar Sekunden, aber in letzter Zeit wurde es auf zig Millisekunden reduziert.
Wird es auf spezialisierter Mining-Hardware oder auf einer Allzweck-CPU durchgeführt?
Soweit ich weiß, gibt es keine kundenspezifische Hardware für die Blockvalidierung oder den Blockaufbau.
Ist es richtig, dass die Zeit, die die Blockvalidierung benötigt, linear zur Größe des Blocks + des Zeugen ist, sollte Segwit aktiviert werden?
Meist. Es gibt eine Ineffizienz im aktuellen Signatur-Hashing-Algorithmus, die O (n ^ 2) in der Größe von Transaktionen sein kann. Dies kann dazu führen, dass einzelne Transaktionen Minuten dauern, um nur den Signatur-Hash zu berechnen. Dies ist in BIP144 behoben, das immer innerhalb von SegWit-Transaktionseingaben verwendet wird, wodurch es im schlimmsten Fall zu O (n) wird (weniger als 10 ms für einen Block im schlimmsten Fall auf gängiger Hardware).
Längerfristig spielen andere Faktoren wie die Größe des UTXO-Sets eine Rolle. Wenn dies auf mehrere Gigabyte anwachsen würde und nicht in typische Speichercaches passen würde, könnte die UTXO-Abrufzeit für die Validierung dramatisch ansteigen.
Außerdem: Wie lange dauert es im Durchschnitt, bis ein Block durch das Netzwerk propagiert ist? Es wäre großartig, wenn dieser Durchschnitt nach den Hashing-Kräften der empfangenden Miner gewichtet würde.
Das ist kompliziert. Es ist sicherlich nicht proportional zur Hashing-Geschwindigkeit, sondern hängt eher mit der Netzwerktopologie und der verwendeten Technologie zusammen. Die FIBER-Website verfügt über einige Statistiken, überträgt jedoch häufig in weniger als 20 ms mehr als die minimale theoretische Netzwerklatenz (Lichtgeschwindigkeit über lange Verbindungen) auf der ganzen Welt. Dies ist nur möglich, wenn es sich um ein privates Netzwerk handelt, das davon ausgeht, dass seine Teilnehmer sich nicht an DoS-Angriffen auf das Netzwerk beteiligen. Das öffentliche Netzwerk ist viel robuster, benötigt jedoch oft viele Sekunden, um einen Block an große Teile von Knoten weiterzugeben, und Dutzende von Sekunden, um weniger verbundene Knoten zu erreichen.
Ich denke, alle großen Miner haben eine eigene Software entwickelt, um den Mining-Prozess zu verwalten und in der Lage zu sein, auf den kürzlich erhaltenen Block-Header umzuschalten, bevor die Validierung abgeschlossen ist. Der Blockvalidierungsprozess sollte nicht viel Zeit in Anspruch nehmen, da die meisten Transaktionen aus dem Block bereits in Mempool vorhanden und bereits verifiziert sind. Die Validierungsaufgabe besteht darin, verpasste Transaktionen zu überprüfen, Coinbase zu überprüfen, Blockbelohnung zu überprüfen, Merkleroot zu überprüfen. Die Blockvalidierung sollte also in wenigen Sekunden abgeschlossen sein. Der über das Netzwerk zu verbreitende Block hängt von der Verbindungsgeschwindigkeit ab.
Wie oben erwähnt, beginnen viele Miner heute bereits mit dem Mining, indem sie nur den neuen Blockheader verwenden, bevor der Block validiert und heruntergeladen wird.
Aus diesem Grund sehen Sie manchmal neu generierte Blöcke mit nur einer Transaktion (der Coinbase-Transaktion). Ein Beispiel dafür ist der folgende Block: https://blockchain.info/block/00000000000000000a06dbd18a15a452c4dd50f662044e654f83066da2775ed8
Dies liegt daran, dass der Miner nicht genau weiß, welche Transaktionen im vorherigen Block enthalten waren, bevor er ihn herunterlädt und validiert. Aus diesem Grund enthält es nur die Coinbase-Transaktion, bis der Mempool aktualisiert wurde, um zu vermeiden, dass eine Transaktion eingeschlossen wird, die bereits in den letzten Block aufgenommen wurde.
Amaclin