Spielen Sie den "Off-by-One"-Bug (Schwierigkeit beim Neuzielen basierend auf der Blockzeitspanne von 2015 statt 2016)?

In diesem Forenbeitrag von Gavin Andresen schreibt er:

Zweitens: Ich habe die Infrastruktur von „Entmutigungsblöcken“ geschrieben: https://github.com/gavinandresen/bitcoin-git/tree/discourageblocks (Code-Reviews willkommen)

... was uns die Möglichkeit geben sollte, Bergleute dazu zu bringen, das Richtige zu tun. Die Abschreckung von Blöcken, die den Off-by-One-Bug zu spielen scheinen, sollte ein ausreichender Anreiz sein, um zu verhindern, dass sich mehr als 50 % Kartelle bilden, ohne dass eine Blockchain-Splitting-Änderung erforderlich ist.

Ich glaube, der Off-by-One-Bug bezieht sich auf die Schwierigkeits-Neuausrichtung, die auf der Zeit basiert, die für die vorherigen 2015-Blöcke statt 2016-Blöcke benötigt wurde - bitte korrigieren Sie mich, wenn ich falsch liege.

Was ich wissen möchte, ist, wie dieser Fehler von Bergleuten ausgenutzt werden kann. Was können sie und welchen Vorteil haben sie davon?

Antworten (1)

Der Angriff ermöglicht es einer Gruppe von Minern mit mehr als 50 % der Rechenleistung des Netzwerks, die Schwierigkeit beliebig zu ändern.

Wenn die Schwierigkeit angepasst wird, werden nur die Zeiten der ersten und letzten Blöcke in einer Retargeting-Periode (dh die ersten und letzten Blöcke mit einer bestimmten Schwierigkeit) berücksichtigt. Dieser Angriff funktioniert, indem der Zeitstempel eines dieser beiden Blöcke manipuliert wird.

Blöcke gelten als gültig, wenn ihre Zeit größer als der Median der letzten 11 Blöcke und kleiner als currentTime + 2 Stunden ist, sodass es für einen Angreifer legal ist, eine neue Version eines alten Blocks mit einer weit in der Zukunft liegenden Zeit zu erstellen. Wenn dies der erste Block in einem Retargeting-Zeitraum ist, vervierfacht sich die Schwierigkeit nach diesem Zeitraum. Wenn es der letzte Block ist, wird die Schwierigkeit durch vier geteilt. (Schwierigkeitsanpassungen sind auf *4 oder /4 beschränkt.)

Beachten Sie, dass es nicht möglich ist, diese größeren Änderungen mit kürzlichen Blöcken vorzunehmen, da die Zeit mehr als zwei Stunden in der Zukunft liegen würde. Es muss mit historischen Blöcken durchgeführt werden, und dann muss der Angreifer alle Blöcke wiederholen, die nach diesem Block kommen. Dieser Angriff ist also nur möglich, wenn Sie viel mehr Rechenleistung haben als das legitime Netzwerk.

Dies wäre kein so großes Problem, wenn es einen Überschneidungsblock zwischen den Retargeting-Perioden gäbe. Anstatt den ersten und letzten Block in einer Retargeting-Periode zu verwenden, verwenden Sie den letzten Block der alten Schwierigkeit und den letzten Block der neuen Schwierigkeit. Dann kann der Angreifer immer noch mit einer Retarget-Periode herumspielen, aber es wird in der nächsten Retarget-Periode korrigiert.

Ich denke, eine bessere Lösung wäre, sich jeden Block in einer Retargeting-Periode plus vielleicht einige Blöcke vor der Periode anzusehen. Es scheint einfach eine schlechte Idee zu sein, bestimmten Blöcken "Spezialkräfte" zu geben.

Ein abgeratener Block wird als gültig angesehen (er fügt Bestätigungen zu Transaktionen hinzu, Blöcke danach sind ebenfalls gültig usw.), aber Ihr Knoten weigert sich, ihn weiterzuleiten oder zukünftige Blöcke darauf aufzubauen. Wenn der größte Teil des Netzwerks von einem Block abrät, wird er mit ziemlicher Sicherheit ersetzt. Sogar eine Minderheit, die einen Block entmutigt, wird die Chancen des Blocks beeinträchtigen. Es ist jedoch sehr unrentabel für einen Miner, einen Block zu entmutigen, wenn der Großteil des Netzwerks dies nicht tut.

(Danke an gmaxwell, dass er mir diesen Angriff erklärt hat.)