Widersprüchliche Timestamps zwischen Blöcken + Leerer Block

Gute Frage und gut beobachtet! :smiley:

Der Block ist nicht leer, es sind nur keine Transaktionen von anderen Teilnehmern enthalten. Genau wie jeder andere Block auch erweitert dieser die Blockchain, sichert damit das Netzwerk und schüttet neue Bitcoin über die Coinbase Transaktion an den Miner aus.

Miner sind nicht gezwungen Transaktionen in einen Block zu schreiben, sie haben nur einen wirtschaftlichen Anreiz dies zu tun (Transaktionsgebühren).

Es kann deshalb trotzdem vorkommen dass ein leerer Block gefunden wird, ohne Transaktionen (exkl. Coinbase Transaktion).

Jetzt zu diesem konkreten Fall.

Wir müssen hier drei Blöcke betrachten:

  • Block 720479 – Timestamp 2022-01-26 16:18:07
  • Block 720480 – Timestamp 2022-01-26 16:20:56
  • Block 720481 – Timestamp 2022-01-26 16:18:58

Auf den ersten Blick denkt man sich hier dass etwas faul ist. Miner können schließlich nicht Zeitreisen. Die Chain ist allerdings trotzdem so gültig, sonst wäre es eine Fork und würde in den Explorern nicht so angezeigt werden.

Der Timestamp in einem Block ist nach folgenden Bedingungen gültig:

A timestamp is accepted as valid if it is greater than the median timestamp of previous 11 blocks, and less than the network-adjusted time + 2 hours. „Network-adjusted time“ is the median of the timestamps returned by all nodes connected to you. As a result block timestamps are not exactly accurate, and they do not need to be. Block times are accurate only to within an hour or two.

Solche Unterschiede kommen öfters vor, nur in diesem Fall zufällig noch mit einem leeren Block zusammen.

Wieso? Weil Miner unter anderem auch den Timestamp als Nonce benutzen um den Hashwert zu beeinflussen. Der Timestamp wird also in die Zukunft ausgereizt (bis zu einem gewissen Limit). Außerdem kann es durch die dezentrale Natur des Bitcoin Netzwerks zu Abweichungen kommen.

Jetzt zu dem leeren Block:

Miner A findet Block 720479 und veröffentlicht ihn im Netzwerk. Miner B erfährt von diesem Block und beginnt sofort mit der Suche nach dem nächsten, er will schließlich keine Zeit und damit Geld verlieren. Bevor er überhaupt damit anfangen kann Transaktionen auszuwählen und die Merkle Root zu berechnen hasht er einfach mit einem leeren Block weiter. Sollte er durch Zufall direkt einen Block finden, dann wurde eben ein leerer Block gefunden.

Natürlich ist es genau so möglich dass der Miner bzw. der Pool einfach einen Fehler gemacht hat, was aber auch nicht schlimm ist.


Nein, das stimmt nicht.

„Ein gültiger Block“ bedeutet dass der (Double-)Hash des Blockheaders kleiner als eine vorgegebene Zahl ist (die Difficulty).

Im Blockheader ist eine Merkle Root (ein Fingerabdruck) aller Transaktionen enthalten, die Transaktionen sind also in Stein gemeißelt. Ein nachträgliches Anpassen eines gültigen Blocks macht ihn automatisch ungültig da der Header und damit auch der Double-Hash des Headers sich verändert, das ist ja der Sinn der Sache. :sweat_smile:

Probier es selbst aus:

Bei der Suche nach einem Block sind Transaktionen also bereits im Block enthalten (und werden natürlich Gewinnoptimierend auch ausgetauscht – während der Suche).

11 „Gefällt mir“