I'm pretty sure he hasn't
What a brilliantly helpful post! :)
What amount of gain/advangate are you talking about here (assuming I am on the right track regarding your discovery)? 0.01%? 0.1%? 1%? 10%? 100%? more?
I figure it is safe to go into some more details now.
I am still processing the data; I haven't figured out yet for certain if there is indeed an advantage to be gained, or what it would be. My hunch is that I am on to something, but that it would not provide enough of an advantage at this point (and like typical hash vulnerabilities, would come a bit at a time, which would be advantageous to Bitcoin, as that would provide the least volatility). My hunch is that current ASICs would not be able to take advantage of this, but that GPUs would -- so you would need a big advantage for it to be worthwhile.
My concern is that there may be ways to eliminate certain nonces without having to calculate the hash for them. As a simple (but made up) example, if you knew that the last nibble of the nonce had to be a 0 in order to solve the block, you would only have to check every 16th nonce, cutting your work by over 90% (or multiplying your hash rate by about 10x). If you knew that the last 2 nibbles had to be 00, your hashrate would increase about 250x (256x minus any calculations you have to perform). Of course, these are simplistic and unrealistic examples.
As for where I believe the vulnerability lies, it boils down to the hash needed to solve to block, and the leading zero bits. Right now, the latest successful hash (0000000000000000f7d7b35dbc3d750166fe3b9c45e24a25dbed93fb4a28bf2f) has 256 bits (as all do), with the first 64 bits set to 0. That's 25% of the bits set to 0, in a row. Because of that, the hash ends up with about 25% less 1's than average. Between having less 1's than average, and the order of the 0's, I believe it is possible to predict (given the block header data) whether certain nonces could solve the block.
Adding to this is that we now have a great data source to assist: over 250,000 80-byte blocks of data, along with their 32-byte "winning" hash.
A typical use of hashes involves using the hash to verify that data has not changed; in this case, an attacker would have to change data in a way that the hash would come out to one specific value (the hash of the original data). However, with Bitcoin, the attacker (miner) needs to change the data in such a way that any that the hash matches one of massive amounts of potential hashes (somewhere in the order of a septendecillion acceptable hashes -- now there's a word I don't see every day!). So you've got a much, much better chance of finding a way of altering the data to "win."
One other thing worth mentioning -- like most (I would guess) data, the header block is skewed towards zeroes (I.E. 80 bytes of random data would have 320 0 bits on average; this data normally has more).
In any case, I haven't come up with anything conclusive, and from a purely statistical view (e.g. based on the expected numbers of people who have tried and failed), it is unlikely that I will. However, my gut still feels that there is something here.
The fix would be to prevent the leading zeroes required in the hash. For example, requiring that they be set to the first X bits of the Merkle tree would likely do the trick.