Fault tolerance (it's not guaranteed that you will find exactly the same hash) and because if you reject blocks with only one Nay vote you may not invalidate any block you'd like to with only 20%. 10% stake means half the blocks, etc. You also don't want to invalidate blocks based one one or two MIA signatories, as with 3 signatories the chain still works fine.
You also add a very easy attack vector by unanimous voting requirement, as you only need to DDoS one node per block to control the chain.
No. If you have 20% of tickets, then you will have one or more votes on 1-0.8^5 = 67% of blocks. You can make 2/3 of blocks empty, but the other 1/3 will go through. That is money burning fail, not a credible DDOS. Perhaps you meant something else?
Invalidation of draws that lack unanimity increases PoW attack resistance. By a lot. I will show you the math if it helps. As a comprimise, how about 4 yay's or more, instead of 3 or more? That would still help.
Alternatively, You can also strengthen the system by increasing the number of voters. Say 6 out of 10 instead of 3 out of 5. Again, I will show you the math if this helps. This would not be my first choice, but I think it would be fine.
Anyways, these are still parameter choices. Easily forked. It is still the core algorithm that matters.
I'm still not sure of your argument. You can simulate a blockchain with this stakeholder signing agreement (and the assumption that 100% of stakeholders will vote) in the following python program:
import math, os, random
random.seed("wefkw34DfsQ3A75")
stake_percent = raw_input("Enter stake percent of attacker (0.0000-1.0000): ")
blocks = raw_input("Enter number of blocks for simulation: ")
stakeholder_pool = raw_input("Enter number of random stakeholders: ")
stake_requirement = raw_input("Enter stake requirement to invalidate block: ")
blocks_passed = 0
blocks_invalidated = 0
print("Calculating...")
for i in range(int(blocks)):
vote_sum = 0 # The total number of attacker votes
for j in range(int(stakeholder_pool)): # Run loop for all stakeholder tickets
if float(stake_percent) > random.random(): # Calculate whether or not a ticket has been afforded to a malicious or non-malicious stakeholder
vote_sum += 1 # If it has been given to an attacker, add +1 attacker votes towards invalidating the block
if vote_sum < int(stake_requirement): # If we have don't enough attacker votes...
blocks_passed += 1 # The block passes through the blockchain as valid
else:
blocks_invalidated += 1 # The block is invalidated by the attacker
final_percent = float(blocks_invalidated) / (float(blocks_passed) + float(blocks_invalidated))
print("Blocks passed: " + str(blocks_passed))
print("Blocks invalidated: " + str(blocks_invalidated))
print("Percentage of blocks invalidated: " + str(final_percent))
Now, if we run it for the round of 5 scenario you described with unanimous voting required,
Enter stake percent of attacker (0.0000-1.0000): 0.2000
Enter number of blocks for simulation: 100000
Enter number of random stakeholders: 5
Enter stake requirement to invalidate block: 1
Calculating...
Blocks passed: 32712
Blocks invalidated: 67288
Percentage of blocks invalidated: 0.67288
With majority voting required to invalidate:
Enter stake percent of attacker (0.0000-1.0000): 0.2000
Enter number of blocks for simulation: 100000
Enter number of random stakeholders: 5
Enter stake requirement to invalidate block: 3
Calculating...
Blocks passed: 94160
Blocks invalidated: 5840
Percentage of blocks invalidated: 0.0584
Now the attacker succeeds only 5.8% of the time.
What about if the stakeholder has 51% stake?
Enter stake percent of attacker (0.0000-1.0000): 0.5100
Enter number of blocks for simulation: 100000
Enter number of random stakeholders: 5
Enter stake requirement to invalidate block: 1
Calculating...
Blocks passed: 2855
Blocks invalidated: 97145
Percentage of blocks invalidated: 0.97145
Enter stake percent of attacker (0.0000-1.0000): 0.5100
Enter number of blocks for simulation: 100000
Enter number of random stakeholders: 5
Enter stake requirement to invalidate block: 3
Calculating...
Blocks passed: 47981
Blocks invalidated: 52019
Percentage of blocks invalidated: 0.52019
As expected, the malicious stakeholder gets about 51% (0.52019) in the scenario of a 3 of 5 requirement, but in a 1 of 5 requirement, the stakeholder now has 97% control of the blockchain. It get worse quickly with increasing malicious stakeholder wealth with the unanimous system; at 30% we see 83% control of the chain, and at 40% we see 92% control of the chain.
This is a totally valid attack vector to consider, because it makes stakeholder-mining pool collusion extremely likely. The mining pool uses the stakeholder to invalidate the blocks of all competing PoW miners on the network, gives a fraction of their earning to the stakeholder, and then themselves now gets 100% of the network income as opposed to only a fraction before. Miners, unable to get any coins, drop off the network, difficulty goes down, and the malicious pool now gets even more coins. The malicious pool and stakeholder wins, everyone else loses, and the system is effectively centralized.