Here’s a first (well, second) version of a fully-functional headers-first synchronization.
Many changes:
- Do not use ‘getblocks’, but ‘getheaders’, and use it to build a headers tree.
- Blocks are fetched in parallel from all available outbound peers, using a limited moving window. When one peer stalls the movement of the window, it is disconnected.
- No more orphan blocks. At all. We only ever request a block for which we have verified the headers, and store it to disk immediately. This means that a disk-fill attack would require PoW.
- Some new fields in getpeerinfo:
- ‘syncheight’: the height up to which we’ve validated this peer’s headers.
- ‘commonheight’: the height up to which we have all blocks in common with this peer.
- ‘inflight’: the heights we’re currently requesting from this peer.
- Require protocol version 31800 for every peer (released in december 2010).
- No more syncnode (we sync from everyone we can, though limited to 1 during initial headers sync).
- Introduce some extra named constants and comments.
- Reindexing support for out-of-order blocks on disk.