I would like this thread to discuss only this one proposal for hindering empty block mining. We already have two threads full of speculation about who is mining the empty blocks, and brainstorming other ideas for stopping them. I'd prefer that this not become a third.
The idea has floated several times to reject blocks that don't contain at least some portion of the transactions that you node is aware of. Might be time to reconsider it
Of course, it wouldn't be anything as simple as "reject empty blocks" or "reject blocks with less than X transactions". Those won't work.
It will need to be more like "I see 100 pending transactions that are valid and should be included in the next block. This block I just got from the network contains less than 25% of them, so I will reject it." There will probably need to be a threshold too, like "I only see 10 pending transactions, and that isn't enough to enforce a minimum number on this incoming block, so I will accept it, even though it has none".
As a first guess, I would say that a threshold of 10 or 20 and a fraction of 1/4 to 1/2 would work well.
Method b) Nodes invidually determine which nodes are invalid (seems to be the method advocated by kjj )
The problem is that at any moment in time your node my not see every transaction. This is important: CHAIN SELECTION BY NODES IS DETERMINISTIC AND MUST ALWAYS BE TO AVOID FATAL FORKS. Now matter how a node is made aware of a block, how delayed, or what other data it has at the time it currently always picks the same chain. This keeps the entire network operating on the same chain and avoids fatal forks (forks which can't be re-organized by simply allowing dominant chain to grow longer).
If nodes determine which block is valid based on information it has (which may be incomplete) then it is possible (actually very probable given enough time) that some nodes will consider block X valid and some consider block X invalid. Deterministic chain selection is now fatally broken. Once a node considers a block invalid it won't change its mind and thus any blocks built on it also become valid. The two fragments keep diverging. Forks will build upon forks upon forks until the network a fragmented mess of sub networks each with a different view of the current coin balances. An attacker could exploit this fact by broadcasting transactions (not in the block it just mined) selectively right before broadcasting the block to ensure some nodes will consider a block valid and some not. Even without malicious intent the network would destroy itself if chain selection isn't deterministic.
It is a non-issue. Over time transaction fees will make up a larger and larger share of the revenue a miner needs to stay profitable.
You've added a number of assumptions. The biggest one is that you assume that block rejection is permanent.
Taking out just that one added assumption, and the system works again. If my node has block X, and another block comes in (call it Y) that has the hash of block X-1 in it, that new block is rejected. Unless when block Y+1 comes in and has the hash of block Y in it instead of X. When that happens, block X is tossed out, and block Y gets
unrejected.
In this case, if block Y+1 meets the acceptance criteria, block Y becomes valid, even though I didn't like it when I first saw it. However, if block Y+1 is also an antisocial block, they both remain on the lonely pile until a good miner builds on top of it, or until the X chain grows longer than the Y chain, making the issue moot.
There may be holes in my idea, but I don't believe that this is one.
16 or 20 years from now, when the subsidy has dropped and hopefully the fees have increased, this may be a non-issue. But today, it is a real issue. We are paying full price for these blocks, but only getting part of the value.
For the record, I have no problem with botnets contributing to bitcoin, as far as bitcoin is concerned (i.e. ignoring the moral issues of theft of service or whatever you want to call it), as long as they are contributing to the security of both past
and present transactions.
Seems like a bad idea. There's going to be a lot of wasted work if half the miners are working on a different block. You will effectively halve the total network hashrate and make it that much easier to 51% the network. Plus if X+1 and Y+1 are found around the same time, it gets worse. This also makes it easier for some to try to double spend their coins.
Probably best to keep things as they are and things will sort themselves out as designed.
We get network splits all the time. And good miners would have an incentive to build off of the blocks other good miners, so the forks would rarely be anything near 50/50.
And most importantly, this gives the antisocial miners powerful incentives to become good miners, without waiting for however many years it takes for fees and subsidies to do that automatically.
Let me be very clear. I propose that:
1. nodes temporarily reject blocks that they can identify as antisocial. Nodes already temporarily reject blocks, but for different reasons.
2. nodes have a method whereby a block that was temporarily rejected can become accepted. Again, nodes already do this.
Further, I assert that:
1. these will not lead to permanent or even long-lived chain forks, for exactly the same reason that the ordinary chain forks that we get about once a week are not permanent, and can't become permanent.
2. any method used to game the system to create blocks that include only dummy transactions created by the attacker to circumvent rejection will necessarily require more effort than simply doing the right thing (including ordinary transactions), giving the current antisocial miner(s) a strong incentive to become a positive part of the network.
The two main objections to my proposal are:
1. It would cause forks, which would be bad. I think that I've addressed this sufficiently. It will indeed cause local forks, but those forks will not be global, and will not persist any more than the forks we already have.
2. Miners would lose quite a bit of autonomy over which transactions they include. Sadly, this is true, and is actually the entire point of the proposal. But, the community at large is paying for the work done. I think that we have the right to set standards for the quality of work which we will accept.
My proposal also has some less obvious advantages.
1. It requires no new protocol and no new centralized authority. Each node can make the decision to defer an incoming block based on the data it has locally.
2. Each node would be able to set their own policy. The network would reflect something like an average of the policies of all miners.