Ich habe gelesen Wie wird der Schwierigkeitsgrad berechnet? und verstehen möchten, wo der "off-by-one"-Fehler bei der Berechnung der Schwierigkeit liegt. Hier ist ein Matlab-Snipet, das ich geschrieben habe, um die Schwierigkeit zu berechnen. Was sind die korrekten Blockschrittintervalle, die ich verwenden sollte? Hinweis: minv
und maxv
sind die Blockhöhen (plus 1) des Intervalls. Somit werden Zeitstempel von den Blockhöhen 0 und 2015 in der ersten Schwierigkeitsberechnung verwendet.
% Calculate difficulty
num = floor(length(block_chain)/2016);
minv = 1;
maxv = 2016;
target = 1209600;
difficulty = ones(num,4);
delta = zeros(num,1);
timedif = delta;
for i = 1:num
if i == 1
difficulty(1,3) = 1;
timedif(i) = block_chain(maxv,2) - block_chain(minv,2);
else
timedif(i) = block_chain(maxv,2) - block_chain(minv,2);
delta(i) = max(0.25,min(target/timedif(i),4));
difficulty(i,3) = max(1,difficulty(i-1,3)*delta(i));
end
difficulty(i,:) = [block_chain(minv,1), block_chain(maxv,1),...
difficulty(i,3), timedif(i)];
minv = maxv + 1;
maxv = maxv + 2016;
end
Aus dem Litecoin-Wiki :
Zeitverzerrungsfehler[14]: Die Bitcoin-Schwierigkeitsberechnung ist um einen Block verschoben, sodass ein Angreifer wiederholt versuchen kann, den letzten Block jedes Retargeting-Fensters zu generieren, und einen fabrizierten Zeitstempel von 2 Stunden in die Zukunft verwendet, um die Zeit zu bestimmen Unterschied zum ersten Block im Retarget-Fenster hoch, wodurch die Schwierigkeit um 0,5 % gesenkt wird. Aufgrund des Fehlers wird der falsche Zeitstempel nicht als erster Block im nächsten Retargeting-Fenster verwendet, und daher werden die 2 zusätzlichen Stunden nicht in der nächsten Schwierigkeitsberechnung kompensiert. Sobald die Schwierigkeit niedrig ist, kann der Angreifer viele schnelle Münzen schürfen, oder im Falle einer kleinen Kette könnte ein Angreifer mit 51% Hash-Power die Schwierigkeit auf 1 reduzieren und einen neuen Fork aus dem Genesis-Block schürfen. Dies ist kein durchführbarer Angriff auf Bitcoin, weil die Wahrscheinlichkeit, bei so hohen Schwierigkeiten wiederholt alle 2 Wochen den letzten Block zu generieren, vernachlässigbar ist. Obwohl das Beheben dieses Problems in Bitcoin möglich ist, sollte es sorgfältig durchgeführt werden (indem Regeln hinzugefügt werden, die Knoten dazu ermutigen, im Laufe der Zeit zu aktualisieren), um eine Kettenverzweigung zu vermeiden, dh alte Clients, die kein Upgrade durchgeführt haben, könnten mit anderen Schwierigkeiten arbeiten und daher nicht einverstanden sein welche Blöcke gültig sind. In Litecoin ist dieser Fehler behoben
Der "off-by-one" oder Time Warp Bug wird verursacht, weil der Schwierigkeitsberechnungsalgorithmus keine überlappenden Zeiträume verwendet, für die erste Neuberechnung verwendet er die Blöcke 1 bis 2016 und für die zweite die Blöcke 2017 bis 4032.
Dies allein ist überhaupt kein Problem, aber da das Protokoll Zeitunterschiede zwischen den Knoten zulässt, ermöglicht dies, die Schwierigkeit beim Schmieden von Blöcken mit Auflösungszeit in der Zukunft zu verringern.
Der Algorithmus verwendet T(2016) - T(1), um die Geschwindigkeit des Netzwerks zu berechnen, wenn Block 2016 mit einem Zeitstempel 2 Stunden in der Zukunft erstellt wird (maximal vom Protokoll erlaubt), dann ist die Schwierigkeit 0,5 % niedriger als was es sollte sein.
Wenn dann Block 2017 gefunden wird und die Zeit echt ist (T(2017) kann kleiner als T(2016) sein), wird die zu Block 2016 hinzugefügte zusätzliche Zeit bei der nächsten Neuberechnung nicht kompensiert, wie es der Fall wäre, wenn Block 2 verwendet würde T(4032) - T(2016), um die Geschwindigkeit zu finden.
Ein detaillierteres Angriffsschema finden Sie unter: https://bitcointalk.org/index.php?topic=43692.msg521772#msg521772
Kal Abel
Frisco
Frisco
Kal Abel
Kal Abel