After talking with Stan on the way to NYC I have a rather significant improvement to DPOS that will make it much more robust:
Every vote for a delegate can be either *for* or *against* them. A delegate is ranked according to the sum of the votes for them minus the votes against them. With this process in place it is now possible for delegates to be fired relatively easily for misbehaving even if the vast majority of a delegates supporters are lazy and not paying attention.
From Sergio Lerner:
For example, each node should measure:
1. The average latency of each representative
2. The ratio of transactions included in blocks versus the total number of transactions broadcasted (with enough fees).
3. The number of transactions rejected by this block without any reason (discrimination)
4. The number of times a representative has failed to broadcast the block
5. The number of times a representative has cheated by sending his block before his time slot.
6. The number of coins a representative has. (this could be computed if the representative uses the same pubkey for all his coins)
In addition to the statistics Sergio identified there would be the statistic on how often a delegate failed to reference a valid previous block that your client received in time. This skipping behavior should be punished.
Then we want to have rules that self-regulate / balance the network without significant intervention by the vast majority of the users *or* that will automatically force users to make a judgement when the network needs it. So here are some additional rules:
0) Assume every wallet has settings that allow the user to specify 10+ delegates that they trust. They do this one time and never have to touch it unless there are major issues with their list.
1) No delegate may have more than 2% of the vote and this will be enforced by blocking transactions which would push the vote total above 2%. Users will be warned anytime all of their delegates have over 1.25% of the vote which will give them ample time to select new delegates. The pro-active users will switch and the inactive users will see their warning go away automatically once the pro-active users switch.
2) When making a normal transaction the user's wallet always votes for the delegate in their top 10 list with the least votes and pulls votes from the delegate with the most votes. This will tend to rebalance a user's votes over 10 delegates and help keep the delegate pool well balanced.
3) Any time a client detects any delegate misbehaving by failure to include transactions, produce blocks, or skipping the prior delegates block then the client automatically prioritizes negative votes for this delegate over positive votes for their behaving delegates. It will not take long for the active transaction volume to accumulate enough negative votes to bump someone from the top 100. On average it will take less than 24 hours for 0.25% of the share supply to move (assuming it only moves once per year on average). 0.25% of the users voting against a delegate is likely enough to swing them out of the top 100, especially if clients switch their vote from being 'for' to being 'against' in which case it would be like losing 0.5% in net vote.
4) Once a delegate is out of the top 200, negative votes are automatically reallocated to positive or negative votes for other delegates.
5) Many clients can automatically add well behaved delegates to their own approved list after enough observation. This will allow the network to be self-sustaining while allowing manual intervention by the shareholders if there is a problem.
At this point we have a solid system that is mostly set it and forget it and which is easily maintained.