Warum sind Block-Header-Bits notwendig? (Ein gültiger Schwierigkeitsgrad wird bereits durch den Kettenverlauf impliziert)

Die Schwierigkeit oder das Ziel wird durch den Kettenverlauf impliziert, warum muss es also explizit im Header angegeben werden? Ich nehme an, es legt die vom Bergmann beabsichtigte Schwierigkeit offen, aber ich sehe nicht, warum das ohne Kettenkontext relevant wäre.

Es stellt also scheinbar redundante Daten im Header dar, es sei denn, es gibt historische Gründe für diese Designwahl?

Es gibt also andere SE-Fragen / Antworten, die implizieren, dass dies historisch war. Aber was war der Zweck von Header-Bits zu Beginn? War es ein Versehen?
Ja Dankeschön. Verwirrt mich immer noch. SPV muss die Header-Kette noch aus der Genesis validieren, auch wenn nicht alle Header gespeichert sind, damit die Schwierigkeit aus der Header-Ketten-Historie berechnet werden kann. Bits nicht erforderlich.
OK. (Im Allgemeinen ist es schön, wenn Sie Links zu relevanten Fragen einfügen können, die Sie bereits gesehen haben, um überflüssige Vorschläge zu vermeiden :-). Ich stimme zu, dass ich auch keinen Grund sehe, warum es besonders notwendig ist. Es ist durchaus möglich, dass es nur aus Bequemlichkeit / Faulheit von Satoshis Seite war, da es einfacher war, als den Knoten die Daten woanders speichern zu lassen, oder er hat es einfach nicht vollständig durchdacht. Leider können wir ihn nicht fragen.
Danke schön. Ich meinte, Ihr Link wäre neu für mich, nicht dass ich ihn bereits gesehen hätte, er war nützlich! Das war mir nicht klar.

Antworten (2)

Sie sind nicht wirklich notwendig. Der Grund, warum sie enthalten sind, kann nur Satoshi bekannt sein, und AFAIK hat er nicht angegeben, warum er sich dafür entschieden hat, nBits in den Blockheader aufzunehmen (oder viele andere Dinge, die nur willkürlich sind). Dies ist eines der vielen Dinge, für die sich Satoshi entschieden hat, und niemand weiß wirklich warum. Es verbleibt heute im Block-Header, da das Entfernen eine Hard Fork erfordern würde und es wirklich keinen großen Nutzen bringt, es zu entfernen.

Das nBits-Feld kann nützlich sein und wurde wahrscheinlich aus praktischen Gründen hinzugefügt. Anstatt den vollständigen Kettenverlauf zu haben, um die aktuelle Schwierigkeit zu kennen, können Sie sich stattdessen die nBits ansehen. Aber das ist nur Spekulation, und vollständige Knoten verwenden die nBits nicht, um die aktuelle Schwierigkeit zu bestimmen (außer denen des Genesis-Blocks).

Wenn Sie sich direkt auf die nbits festlegen, können Sie feststellen, wie viel Arbeit verwendet wurde, um den Header zustandslos zu erstellen, bevor Sie nach Informationen über frühere Header suchen (oder diese abrufen).

Dies kann helfen, DOS-Angriffe abzuwehren, die Junk-Header senden, um Sie zu zwingen, ihre Vorfahren zu ermitteln oder abzurufen.

Eine Heuristik zur DoS-Prävention, die sich dies zunutze machte, existierte bereits vor der Einführung der Header-First-Synchronisation in Bitcoin Core. Im Moment glaube ich nicht, dass es für irgendetwas in Core verwendet wird.
Sicher, damit können wir überprüfen, ob das PoW der Schwierigkeit von Headern ohne Kontext entspricht. Aber ein Angreifer könnte an diesem Punkt jeden Wert beanspruchen, und wir würden ihn nur in der Kontextvalidierung erkennen. Ich glaube nicht, dass dadurch ein sinnvoller Angriff verhindert wird.
CheckProofOfWork prüft auch, ob nbits mindestens das Minimum sind. Es könnte stattdessen „offensichtliche Arbeit“ überprüfen, was fast genauso gut wäre, aber Sie könnten zum Beispiel mit „Glücksaktien“ von einem hypoethischen 1 Block pro Sekunde diff=0,1 Altcoin überfluten. Es ist also anders, wenn auch nicht auf eine wichtige Weise.
Ok, aber es könnte das ohne explizite nBits tun.
Danke für deine Antworten! Sehr hilfreich für mein historisches Verständnis von nbits.