fixes #33128
this picks up #33164
on a normal start (without -reindex), CompleteChainstateInitialization()
calls LoadGenesisBlock(), which writes the genesis block to blk00000.dat
unless the block index already contains it. if blocks/index was deleted,
then the index is empty, so genesis is unconditionally written again
even though the file is still intact on disk and holds all the later blocks
that write eventually reaches AllocateFileRange(), which allocates
space from the start of the file. with posix_fallocate(), this only
reserves space. on platforms without it (e.g. OpenBSD, NetBSD), the
fallback writes zeroes over the requested range, replacing the blocks
that were already there
only after that, does the node notice that the chainstate no longer
matches the block index and fail with "Error initializing block database",
asking for -reindex. by then, the blocks are already gone, so the reindex
finds the genesis only, reports success, and getblockcount returns 0
this PR makes LoadGenesisBlock() read the genesis block back from
disk first and only write it when it is not already there. if genesis
is already on disk, update the blockfile info with its position and
size so that the next block is written after it instead of overwriting it