I wanted to see the math play out if we bypassed the 32-bit limit on the Genesis block without altering the Merkle Root or extraNonce.
Some people wanted to do another trick: putting extra bits in the previous block hash. For example:
version: 01000000
prevBlockHash: 6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d61900........ <- always set to zero, for all block headers
merkleRoot: 982051fd1e4ba744bbbe680e1fee14677ba1a3c3540bf7b1cdb606e857233e0e
time: 61bc6649
bits: ffff001d
nonce: 01e36299
And then, if the previous block hash would be always masked with "bits", then, as the difficulty would grow, it would give us more and more space for nonces. For example:
version: 00e00921
prevBlockHash: 2f369562b3a0dd54cb88fd7fee235d53b9c1737b513800.................. <- mask based on "17" from "bits"
merkleRoot: 1a34fdc7baef0205d305dcdc3420d60988c65653aad54fb85de0fe124bea1ce8
time: aa7bbb69
bits: ccf00117 <- "17" means 9 bytes of nonce
nonce: 0c7fc5a1
Also, that kind of trick is described in
Hardfork Wishlist:
Mask out the must-be-zero bits in the previous-block-hash (block header) so miners can reuse them for nonce space.
In the current protocol, the minimal difficulty is set to "1d00ffff", which means, that the last four bytes could be always masked in that way. But in general, as we will have stronger, and stronger block hashes, with more and more zeroes, then it gives us more space, to potentially put something there in the future. For example: if SHA-256 would be replaced with something else, then we could require a block, which would give all zeroes, when hashed through that function, and then simply put the result of the new hash function, running on the same data, in the same place.
In this way, the size of the block header can stay at 80 bytes, which is a nice feature, because then, you can easily calculate offsets for any block headers, and get them with constant time complexity.