The thread title here may sound unrealistic, but I believe this necessary for future Bitcoin adoption.
Currently, the client checks a lot. It ensures the blocks are under 10 MB. It has complex rules about what timestamps for blocks are legal and what timestamps are not. It even tries to make sure the transactions within the block are all correct. (correct me if I'm wrong about any of these)
These checks, and undoubtedly more, are absolutely unnecessary. As long as the miners make sure to follow the correct rules, the client should automatically follow the majority of the network. In fact, these checks are bad: they make changes that will inevitably be needed in the future require hard forks. This is a problem because of two reasons: 1), the client will eventually reject blocks over 10 MB once we need them (needing a hard fork), and 2), the client will reject new types of transactions that it doesn't understand (also needing a hard fork).
Of course, the client needs to make sure it isn't being fed a completely bogus blockchain. Therefore, the client does still need to check the block header's hash and the Generation transaction, as well as listing new blocks as unknown until they are confirmed by 2+ confirmations (by which time the client displays the standard "n confirmations" starting with the block. This should prevent any additional wait times (3 confirmations by most standards), avoid a bogus view of the blockchain, and maintain the trust-free nature of a full node.
There are some issues with this, however. One in particular is the improved utility of a 51% attack. Rather than simply a double-spend opportunity, the attacker might fake some transactions (since the client no longer processes the scripts) and downright steal in the minds of the client. This is definitely a major problem, so I propose the following:
- If the client finds an abnormally large amount of reorgs, it begins checking the blocks (this code is included in bitcoind, so it would not be extra bloat).
- If it finds issues with the blocks, it will compare its version with the median version of its peers. If this median version is much higher than its, the client will disable all functionality and call for an upgrade (this can be manually overridden).
- If it believes that it is up to date, it displays a warning that the network may be getting attacked and begins applying strong checks to blocks. At this point, all transaction-accepting functionality is disabled (because double-spends may be in progress). This can be both manually overridden and automatically overridden simply by waiting a few blocks.
Another major issue is the DOS attack caused by an attacker isolating the client by forcing it to connect to the attacker's version of the network and only the attacker's version. This is called a quarantine, and already has disastrous effects. However, these effects are all the worse when the client is not performing verification, as it, along with many things, will give away the fact that it is quarantined. This issue is compounded because the attacker's peers can trick the client into thinking that it is up to date. In this situation, little remedy exists, but there is one giveaway: a comparatively slow hashrate.
Unfortunately, the network does tend to fluctuate and a slowing of hashrate may not be easily exploited. However, unless the attacker also happens to have a large hashrate, the client can assume that something is wrong if blocks are being found for a period of time slower than an hour per block. Because it is still verifying difficulty and headers (this is necessary), it can launch a warning to be handled by its parent that it may be isolated.
At this point, the client will begin verifying blocks again. If it discovers inconsistencies, this is a definite sign of an outdated client that is under attack. It may elevate the warning to a forced shutdown and an upgrade notice, only capable of being overridden manually.
There are likely countless issues with this approach that my non-technical mind has failed to enumerate, and I do not suggest this be immediately implemented. However, of course after extensive theory and testing, it may be an excellent improvement for the network. I would like to note that this patch not only does not require a hard fork (old clients do not need to upgrade), but also prevents most sources of hard forks in the future. Hard forks are known to cause chaos, and a solution to the problem is needed (but not urgent). Miners will, of course, need to react to hard forks still; however, in this changing atmosphere from "everyone's a miner" to "mining is a profession", it may be time to stop treating clients like miners.