Ich weiß, dass Satoshi nicht mehr da ist, um zu fragen, also könnte es sinnlos sein, zu fragen, aber ich hoffe, dass jemand etwas darüber wissen könnte.
Bitcoin-Mining verwendet typischerweise ein extraNonce ( bnExtraNonce
in der scriptSig der Coinbase tx) und ein Nonce-Feld (32 Bit). Warum hat Satoshi das Nonce-Feld nicht einfach größer gemacht, und dann wäre das nicht einmal nötig bnExtraNonce
? Gibt es einen Grund, warum das Nonce-Feld auf 32 Bit gehalten werden musste? Es scheint einfacher gewesen zu sein, eine 64-Bit-Ganzzahl im Blockheader zu haben. Selbst wenn er Bedenken hatte, eine Ganzzahl mit mehr als 32 Bit zu haben, hätte der Header einfach als zwei 32-Bit-Ganzzahlen nonce1
und interpretiert werden können nonce2
.
Auf diese Frage gab es viele gute Antworten. Nachdem ich sie durchgelesen habe, werde ich mich auch mit der Antwort befassen.
Das Coinbase-Feld der Coinbase-Transaktion (wie es genannt wird) ist wirklich nur ein scriptSig, das keine Überprüfung seines Inhalts durchlaufen muss (außer dass es weniger als 100 Bytes beträgt und die neueren BIP34-Anforderungen). Satoshi wusste, dass man hier beliebige Inhalte einfügen konnte, und so fügte er eine aktuelle Schlagzeile in die ScriptSig des Genesis-Blocks ein: „The Times 03/Jan/2009, Kanzler am Rande der zweiten Rettungsaktion für Banken“. Eine Nachricht wie diese hilft auch zu bestätigen, dass kein Pre-Mining durchgeführt wurde, da die Nachricht nicht vor dem Datum der Veröffentlichung des Artikels in den Block eingefügt werden konnte.
Ich denke, dass Satoshi dachte, dass ein 32-Bit-Nonce-Space übertrieben wäre. Ein Standardcomputer, wie der, auf dem ich dies schreibe, kann ungefähr 3 MH/s erreichen, was ungefähr 0,07 % des Weges durch einen einzelnen Nonce-Bereich entspricht, bevor Sie nTime erhöhen und einen ganz neuen Bereich von Nonces erhalten können. Das soll nicht heißen, dass Satoshi dachte, dass es immer nur einzelne Computer-CPUs geben würde ( dieser Beitrag zeigt, dass er es nicht tat), aber ich wette, er dachte, dass jeder Miner in diesem Fall seine eigene Adresse haben würde.
Ich glaube nicht, dass Satoshi sich Pools vorstellte, insbesondere in der ziemlich zentralisierten Art und Weise, wie sie heute existieren, und die Flexibilität des Coinbase-Felds wurde nur von Mining-Pools (als eine Art Hack) genutzt, als die Hash-Power groß genug wurde, um durchzukommen mehr als ein einzelner Nonce-Bereich pro Sekunde.
Aus den Protokollregeln geht hervor, dass es so etwas wie eine zusätzliche Nonce nicht gibt.
Es gibt nur eine 32-Bit-Nonce im Blockheader (über die sehr schnell iteriert werden kann) und bis zu 100 beliebige Bytes in der Coinbase-Eingabe. Der Blockgenerierungscode im Referenzclient hat traditionell eine „zusätzliche Nonce“ in diese willkürlichen Bytes eingefügt, aber der Inhalt kann beliebig sein.
Meine Vermutung: Es scheint klar, dass Satoshi kein gepooltes Mining erwartet hat.
In einer Welt ohne gepooltes Mining würden Sie einfach jedes Stück Mining-Hardware, das bis zu 4 Gigahashes pro Sekunde (GH/s) erreichen kann, seinen eigenen öffentlichen Schlüssel verwenden lassen, was garantiert, dass es eine einzigartige Coinbase-Transaktionsausgabe erzeugt. Das Zeitfeld kann jede Sekunde aktualisiert werden, sodass die Nonce jedes Mal auf 0 zurückgesetzt werden kann, wenn die Zeit aktualisiert wird.
In einer Welt mit gepooltem Mining erstellen mehrere Personen alle identische Coinbase-Transaktionsergebnisse (zahlen, wen auch immer der Pool-Betreiber sagt, dass er zahlen soll) und sie hashen gemeinsam viel schneller als 4 GH/s, wodurch die Nonce-Reichweite erschöpft ist, bevor die Zeit angenommen wird aktualisiert werden. Dies macht die zusätzliche Nonce erforderlich, um zu vermeiden, dass mehrere Miner dieselben Header-Hashes überprüfen.
Warum also hat Satoshi überhaupt die Extra-Nonce geschaffen? Es sieht so aus, als wäre es eine einfache Möglichkeit gewesen, zu sehen, wie viele Hashes der Miner seit seinem Start verwendet hat. Wenn Sie sich die Coinbase von Block 1 (dem ersten Block nach dem Genesis-Block) ansehen, sehen Sie, dass es sich um Folgendes handelt:
04 ......... Push 4 bytes to stack
ffff011d ... The same as the nBits field
01 ......... Push 1 byte to the stack
04 ......... Number of times nonce was reset so far: 4 <= 20 GH
Bei Block 10 ist es 0x36 (54 <= 220 GH). Kurz gesagt, die ursprüngliche zusätzliche Nonce kann nur ein zusätzliches Debugging-Tool sein. Sie können nBits und die zusätzliche Nonce verwenden, um zu berechnen, wie viele Blöcke der Miner im Durchschnitt hätte produzieren sollen, und wenn das stark von der Anzahl der produzierten Blöcke abweicht, haben Sie möglicherweise ein Problem.
OP_RETURN
, um ein zusätzliches Nonce-Feld zu erstellen.Tatsächlich ist die zusätzliche Nonce eine beliebige Präzisionszahl ( http://satoshi.nakamotoinstitute.org/posts/bitcointalk/115/ )
Ich vermute, dass es dazu da ist, willkürliche Änderungen an einem Block zuzulassen, selbst in einer Situation, in der es keine Änderungen in Bezug auf Transaktionen gibt. Dies würde es noch unwahrscheinlicher machen, dass es in einem transaktionslosen Zeitraum einen unlösbaren leeren Block geben könnte. (Schon fast unmöglich. Aber Hashes sind von Natur aus unvorhersehbar, also war Satoshi vielleicht nur besonders paranoid, als er es hinzufügte.)
Tatsächlich brauchen wir überhaupt keine 32-Bit-Nonce im Blockheader. Alles kann in das Coinbase-Eingabeskript eingefügt werden. Die Frage sollte also lauten: Können wir mit einem 76-Byte-Blockheader statt mit 80 Byte umgehen?
Morsecoder
Morsecoder
Morsecoder
Pieter Wuille
Morsecoder