Die nächste Schwierigkeit, einen Block zu lösen, wird davon bestimmt, wie schnell Blöcke davor gelöst wurden. Außerdem ändert sich der Schwierigkeitsgrad nur etwa alle zwei Wochen.
Könnte also nicht jeder Knoten die erwartete Schwierigkeit verfolgen und muss sie nicht in jedem Blockheader haben? Oder gibt es einen Grund, warum Knoten die aktuelle Schwierigkeit in jedem Block mitteilen müssen? Nicht, dass es eine große Einsparung wäre oder so, es scheint nur seltsam, dass dies enthalten ist, wenn es nur eine Funktion aller anderen Teile einer Kette ist.
Vielleicht liegt es daran, dass die Berechnung von nBits irgendwann lange dauern würde, wenn Sie jedes Mal, wenn Sie die nächste Schwierigkeit berechnen wollten, alle Blockheader durchgehen müssten?
Erinnern Sie sich an das Whitepaper von Nakamoto , dass die Sicherheit für SPV-Kunden (Simplified Payment Verification) hauptsächlich am Arbeitsaufwand gemessen wird, der zur Sicherung einer bestimmten Transaktion aufgewendet wird. SPV-Knoten können vergangene Header nicht allein verwenden, um zu überprüfen, ob eine eingehende Zahlung gültig ist, daher besteht technisch gesehen keine große Notwendigkeit, vergangene Header zu speichern[1].
Wenn Sie nicht alle Header speichern möchten, benötigen Sie natürlich eine Möglichkeit, die Schwierigkeit für die Header zu messen, die Sie haben – und nBits bietet dies.
Beachten Sie, dass das Speichern aktueller Header die Sicherheit eines SPV-Clients erhöhen kann, indem es ihm ermöglicht wird, die richtige Schwierigkeit für spätere Header zu berechnen. Dies stellt sicher, dass ein Angreifer, der versucht, den Client anzulügen, Blöcke mit der richtigen Schwierigkeit erstellen muss. Dennoch wird hier keine vollständige Header-Kette benötigt, sodass nBits als Startwert immer noch nützlich ist.
[1] Aber BitcoinJ und alle anderen SPV-Clients, die ich kenne, speichern immer noch vollständige Header. Vermutlich besteht der Grund dafür darin, dass sie ihnen helfen, Kettenreorganisationen (Reorgs) zu erkennen, die eine zuvor erhaltene Zahlung ungültig machen würden.
Nick Odell
so there's technically not much need to store past headers
Was ist mit unbestätigten Transaktionen? Sie müssen sich vergangene Blöcke ansehen, um zu bestätigen, dass ihre Eingaben gültig sind.David A. Harding
David A. Harding
Kyker
Pieter Wuille
nBits
Wert in Headern nicht mehr wirklich nützlich (er ist immer bekannt, bevor ein Header oder Block bereits empfangen wird).