Blockzeit vs Schwierigkeitsanpassung - mempool

Hi,
warum ist Anpassung (hier -8,45%) negativ, wenn doch die „Durchschnittliche Blockzeit“ hier 9.7 Minuten kleiner die vorgesehenen 10 Minuten ist. Eigentlich müsste doch die Schwierigkeit nach oben angepasst werden… Wo liegt mein Denkfehler?
Werden hier unterschiedliche Zeiträume betrachtet?
Kann das jemand erklären?
LG

blockzeit

Du hast keinen Denkfehler.

Um deine Frage zu klären müsste man allerdings wissen, wie die Angaben berechnet werden und was sie überhaupt bedeuten. Ich finde es ziemlich unprofessionell, dass einfach irgendwelche Zahlen ohne Beschriftung oder Erklärung angezeigt werden.

Evtl. steht das in irgendeiner Doku oder FAQs von mempool.space.

Das vermute ich auch. Sowohl für die mittlere Blockzeit, als auch für das geschätzte nächste Adjustment, muss gemittelt werden.

Sinnvollerweise würde man mitteln, daraus die mittlere Blockzeit berechnen und daraus dann das Adjustmemt berechnen. Aber hier wird evtl. unterschiedlich geglättet.

Außerdem ist die Frage, was nach einem Diff. Adjustment passiert. Entweder wird bei der Mittelung mit einer neuen Zeitspanne begonnen, was korrekt wäre aber stark fluktuieren würde. Oder man mittelt über das letzte Adjustment hinweg, berücksichtigt also fälschlicherweise auch Blöcke aus der letzten Periode.

2 „Gefällt mir“

Auf die schnelle habe ich das im Code gefunden:

Scheint also über die letzten 504 Blöcke berechnet zu werden; also über das letzte Adjustment hinaus. Daher wohl wie du schon vermutet hast das „falsche“ aber mit diesem Ansatz natürlich richtige Ergebnis.

Liegt jedenfalls nicht an mempool.space, auch mempool.blocktrainer.de spuckt die falschen Daten aus… :stuck_out_tongue:

4 „Gefällt mir“

Stimmt, danke für das Heraussuchen!

Sie versuchen den hierdurch entstehenden Fehler aber auch zu kompensieren:

mempool/backend/src/api/difficulty-adjustment.ts at b8725ab13a662b8e0d6f4ce1fc9b88e910bdc248 · mempool/mempool · GitHub

// for the first 504 blocks of the epoch, calculate the expected avg block interval
// from a sliding window over the last 504 blocks
if (quarterEpochTime && blocksInEpoch < 503) {
  const timeLastEpoch = DATime - quarterEpochTime;
  const adjustedTimeLastEpoch = timeLastEpoch * (1 + (previousRetarget / 100));
  const adjustedTimeSpan = diffSeconds + adjustedTimeLastEpoch;
  adjustedTimeAvgSecs = adjustedTimeSpan / 503;
  difficultyChange = (BLOCK_SECONDS_TARGET / (adjustedTimeSpan / 504) - 1) * 100;
} else {
  difficultyChange = (BLOCK_SECONDS_TARGET / (actualTimespan / (blocksInEpoch + 1)) - 1) * 100;
}

Für die Schätzung der nächsten Difficulty-Anpassung difficultyChange wird in unserem Fall 504⋅600 s durch die Dauer der letzten 504 Blöcke adjustedTimeSpan geteilt. quarterEpochTime ist vermutlich der Timestamp des 504.letzten Blocks.

Dafür wird die Dauer der miteinbezogenen Blöcke aus der letzten Periode timeLastEpoch so angepasst, als wären diese Blöcke mit der aktuellen Difficulty gemined worden (-> adjustedTimeLastEpoch). Der Parameter previousRetarget entspricht der letzten Difficulty-Anpassung, nicht der Target-Anpassung (siehe Z. 166).

Das ist eigentlich ziemlich schlau. Der von mir oben angesprochene potentielle Fehler sollte also kein Problem sein.

Es erklärt aber immer noch nicht, warum nicht auch eine zum Adjustment passende durchschnittliche Blockzeit angezeigt wird. Ich habe mich allerdings nicht weiter durch den Code gewühlt…

2 „Gefällt mir“

cool, danke euch für die Erklärungen!

2 „Gefällt mir“

Noch als Nachtrag dazu, damit ich meine Lösungsmarkierung auch verdient habe… :slight_smile:

Die durchschnittliche Blockzeit timeAvgSecs wird berechnet, indem einfach nur die bisherige Zeit in der Periode diffSeconds durch die bisherige Anzahl von Blöcken in der Periode blocksInEpoch geteilt wird. Für die Anzeige wird timeAvgSecs dann noch minimal gerundet.

Es wird hierbei nicht zusätzlich gemittelt, d.h. man mittelt durch das beschriebene Vorgehen automatisch immer über die bisherige Periode! Gerade zu Beginn einer neuen Periode ist die so berechnete Blockzeit aufgrund der geringen Anzahl an Blöcken noch sehr ungenau, während die Adjustment-Schätzung aber über die 504 letzten Blöcke gemittelt wird (s.o.). Nach den ersten 504 Blöcken in einer Periode werden dann beide Werte über denselben Zeitraum gemittelt.

Die Vermutung, dass zu Beginn einer Periode für die Blockzeit und für das geschätzte nächste Adjustment unterschiedliche Zeiträume als Basis herangezogen werden, hat sich also bewahrheitet.

2 „Gefällt mir“

Hier noch eine offizielle Antwort zu dieser Frage… :slight_smile:

https://x.com/mononautical/status/1799561281755643958

1 „Gefällt mir“