neo-project / neo

NEO Smart Economy
MIT License
3.47k stars 1.03k forks source link

Set 1 NEO to equal 1 vote #28

Closed lerider closed 7 years ago

lerider commented 7 years ago

TLTR version here:

  1. Create a Slack group and have NEO holders join.
  2. Discuss how much shares you own together.
  3. Wait until you have a large enough group so that your shares totals to 5%.
  4. Split up all your shares so that there is only 500 shares in each node. You will have 10 000 nodes.
  5. Accumulate 10% of all coins so that you can nominate all 10 000 nodes for bookkeeeping.
  6. Have all your 10 000 nominees vote for each other.
  7. You will now have 10 000 nominees, each of the nominees will get 5% votes guaranteed.
  8. If 5% is above the bookkeeping threshold, the 5% consortium will now have 10 000 bookkeepers.

Above can be adjusted, the only expense is to buy coins for nomination. The only way to prevent this with current system is that NEO consortium realize this problem and split all their shares in a multitude on wallets and cross-vote to get majority consensus nodes. Even then it's not "secure", because you don't know how many bookkeepers that the minority consortium will split up into.

It's a risk, currently disregarded as an "assumption" and "not likely". Arguments that were used against people warning Coindash that not posting their address in advance is a bad idea and inviting for attacks. Not changing the vote system is also inviting for minority consortium attacks.

Long version: It is known that bookkeepers will be voted by the NEO shareholders. There was a big confusion about that, especially this row from the old Whitepaper 1.0: 1份小蚁股投给一个候选记账人,计1票;1份小蚁股投给多个候选记账人,各个候选记账人各计得1票。

Literally, it means that one antshare equals one vote, and it is allowed to vote for multiple bookkeepers. If one antshare vote for one multiple bookkeepers, then each bookkeeper get one vote each.

Here is where the confusion starts. By allowing one share to vote for multiple bookkeepers, it opens up for "Stake attacks", that is buying up a lot of shares, creating for example 70 bookkeepers and then have them all vote for each other to secure >1/3 of bookkeeper nodes. This was previously argued against by saying it would be "too expensive" to be a real concern.

Game theory part: The biggest concern in such system is actually not one person with evil intent, but instead a consortium of smaller owners who go together to vote for each other since they all hold multiple votes. Thus, they don't even have to spend any money to gain enough shares, they can just agree to vote for each other beforehand. In fact, this would be the most beneficial strategy in such a system, guaranteeing that it would very quickly turn up a cartel who would control the bookkeeping nodes for eternity. A bit similar as current bitcoin situation, perhaps even worse.

The most straightforward suggestion would perhaps be "just allow one vote per wallet", but then you run into the problem that everyone votes for the most honest bookkeeper, and several dishonest bookkeepers can sneak in with minor votes (for example if 90% of the users vote for same bookkeeper, then the other 10% decide the rest of the bookkeepers, which is obviously not an optimal scenario)

Solution:

The solution is to split the votes, such as 1 ANS (NEO) is always equal to 1 vote, and if a shareholder votes for two different bookkeepers, then the shares he is holding will be split among these two bookkeepers. This solution will (1) prevent the "stake attack" mentioned by one attacker who creates multiple bookkeepers, (2) prevent the previously optimal cartel-strategy mentioned above, and (3) still allow for bigger stakeholders to vote for themselves (as we already acknowledge that there are players with different interests in the network).

The split can be done in two ways, one that allows fractional votes and one that does not allow fractional votes. x = Voter's total number of ANS (NEO)

Allow fractional votes:

  1. Voter chooses n bookkeepers to vote for.
  2. Each bookkeeper receives x / n votes.

Do not allow fractional votes:

  1. Voter chooses n bookkeepers to vote for.
  2. Each bookkeeper receives (x - (x mod n) ) / n) votes. This mean that they will all get the same amount of votes, but there will be a remainder of votes that are not distributed since fractions are not allowed.
  3. The remainder votes will either be allowed to be distributed following step 1 again, or the remainder votes will be counted as abstained votes.
Mytechshout commented 7 years ago

Seems to be a good idea. The NEO team must look into it.

0b01 commented 7 years ago

I think you might be onto something here. It would be better if you could support your claims with numbers. Can you calculate the exact percentage of malicious population for the cartel situation to happen?

lerider commented 7 years ago

It doesn't have to be malicious population. With current voting system, the cartel will happen 100% based on game theory.

It is surely financial beneficial to become a bookkeeper, so if we are a group of people with stake, the best strategy is to agree that everyone in our group vote on ALL members in the group (1 ANS = 1 vote for each member in the group) to fill all bookkeeper seats and avoid others from joining in. It could be one large stake with many small partners, or a number of medium sized parties. It is just the optimal game strategy, so it will happen 100% if 1 ANS can vote multiple times.

canesin commented 7 years ago

Hey @lerider, good that you want to contribute, why don't you join our dev group in slack and discuss this ? Some problematic points with your analysis:

1 - You are wrong on attacks incentive as nodes considered byzantine faulty do not participate on the block reward.

2 - Voting participation is effectively expected to be higher as there is incentive to participate in the consensus and high stake participants will want to do so.

3 - The multiple voting behavior you described should not be inferred from documentation text, can you validate your assumption against what is in the code/protocol ?

4 - Can you show simulations and modeling of proposed changes ? We cannot judge on assumptions.

regards,

tommydangerous commented 7 years ago

@canesin hello, I'm looking to get involved in development. I tried to join the slack channel but the heroku app returns invalid token. Can I please have an invite to your dev channel?

lerider commented 7 years ago

Preparing for bed, will look into your group tomorrow. Quick reply:

  1. It is not to prevent attacks, it is to prevent consortiums who want to collect all rewards for themselves.

  2. Yes, I also expect it to be high. High stake participants will split into several bookkeeping nominates and then before vote decide together with other high stake participants to all give each other one vote each, practically high-jacking all seats in the congress for eternity.

  3. It's in the whitepaper 1.0, both English and Chinese version, paragraph 5.2.2 https://github.com/neo-project/neo/wiki/Whitepaper-1.0#p

  4. It's not an assumption, it's game theory and it will happen since it's the optimal strategy with this voting system. A programmer might be able to simulate it, would require some self-learning algorithm for that. I'm not a programmer. It's very basic game theory, so I wouldn't say a simulation is needed, but if someone is up for the task, then I won't stop them.

canesin commented 7 years ago

Hi @tommydangerous, sure so https://antshares-slack.herokuapp.com is not working ? Please drop me a dm in reddit with your email /u/canesin and I will invite you.. the slack and other communication channels are moving with the rebrand, so there is some confusion

tommydangerous commented 7 years ago

Thank you, will do now!

tommydangerous commented 7 years ago

@canesin sent message on Reddit. Let me know if you didn't receive it. Thank you

lerider commented 7 years ago

@canesin I have the same problem. Failed! token_revoked

lerider commented 7 years ago

Let me clarify how a minority can easily get majority as bookkeepers if we don't change:

  1. Create a Slack group and have NEO holders join.
  2. Discuss how much shares you own together.
  3. Wait until you have a large enough group so that your shares totals to 5%.
  4. Split up all your shares so that there is only 500 shares in each node. You will have 10 000 nodes.
  5. Accumulate 10% of all coins so that you can nominate all 10 000 nodes for bookkeeeping.
  6. Have all your 10 000 nominees vote for each other.
  7. You will now have 10 000 nominees, each of the nominees will get 5% votes guaranteed.
  8. If 5% is above the bookkeeping threshold, the 5% consortium will now have 10 000 bookkeepers.

Above can be adjusted, the only expense is to buy coins for nomination.

R5fan commented 7 years ago

The issue you raise is very real. The solution, doesnt quite solve it. If you only allow 1 vote per share, candidate bookkeepers will use that vote only for themselves to maximize their own chances of election. I dont see the incentive for non-candidate ANS holders to vote at all (in fact, a negative incentive, since it costs ANC to cast a vote), so honest bookkeeper candidates will have difficulty getting elected against dishonest bookkeepers or cartels.

BTW, can I say Im astonished that something as fundamental as this, is still being discussed at this point?

lerider commented 7 years ago

It's one vote per share which can still be distributed among several consensus nodes. 500 votes on two candidates will give 250 votes each. Adding mid-50 percent weighted average on number of nodes, cartels less than 25 percent holdings have zero say in number of consensus nodes.

VincentTano commented 7 years ago

has the 1 vote 1 share system been implemented into the code yet? curious to see how the code will look like after the change.

lerider commented 7 years ago

Replaced by https://github.com/neo-project/neo/issues/30