Have any observations been made to conclude the accuracy of Bitcoin network time?
It would be interesting to know if NIST or any other authority has tracked the phenomenon.
From this blog post describing the timejacking attack:
Each node internally maintains a counter that represents the network time. This is based on the median time of a node's peers which is sent in the version message when peers connect. The network time counter reverts to the system time however if the median time differs by more than 70 minutes from the system time. A very reasonable way to estimate the median network time.
So block timestamps are based on "network time" which is in turn one of:
The network time is used to validate new blocks. As a precaution, nodes reject any block timestamp that is greater than 2 hours from the current network time. Block timestamps that are earlier than the median time of the past 11 blocks are also rejected. This validation puts upper and lower bounds on the acceptable range of block timestamps.
So block timestamps are:
I have to refresh my error propagation lessons, but I guess this leads to an accuracy at around ±3 hours.
Of course this is just an upper bound on error, but the actual question remains: what is the real blockchain accuracy? (which is a very interesting question.) The only way to be sure is actually tracking it and comparing with a known perfect timestamp. I don't know if anyone has ever done that before and couldn't find any references.
Essentially when a node finds a block, it broadcasts it with whatever timestamp it wants, so it doesn't mean it's accurate at all. Of course nodes are programmed not to do this, but it doesn't mean they can't. Other nodes are programmed to accept blocks with timestamps that make sense: for example if I receive a block with a timestamp set to a period way into the future I'll probably dismiss it.
So it's not completely accurate but it's accurate enough because the majority of nodes are using the bitcoind node, which is programmed with a specific timestamp logic in mind to generate the timestamp based upon the median time of a node's peers which is sent in the version message when peers connect.