以太坊合约分析之选举算法
选举虽然在名义上标榜一人一票,但是选举的计票机却是黑箱的,谁也看不到。要是选举服务里面有个漏洞或者后门,美国的历史也就要因此改变了。
区块链将算法公开到区块上,人人可见,有没有漏洞就可以提前被亿万民众发现。选举过程也可以使用区块链合约来实现。
我们看下面最简单的选举合约代码。
该选举合约不是简单的一人一票,还具备人大代表机制,也就是代码中的delegation。
普通用户可以将投票权交给人大代表,人大代表的选择代表里对应所有用户的一致选择。
Voter结构代表广大屁民。屁民的weight默认是1,表示一人一票,如果被代表了,weight就变成0,对应人大代表的weight就是代表的所有屁民数量,包括自己。delegate字段指向人大代表,如果没有被代表这个字段就是0。
Proposal结构代表候选人。每个候选人都有一个名字和票数。
chairman是选举主席,是选举活动的发起人,有些操作只有它可以做。正因为它的权利很大,所以主席很容易被私下贿赂。同样代表的投票权重很大,所以代表也容易私下被贿赂。
本算法做不到防止贿赂,毕竟这是物理世界的事,数字世界和物理世界如阴阳两隔。
选举步骤如下
主席通过Ballot()构造器初始化选举活动,传入候选人名称数组。因为主席也算屁民,所以它也可以投票,权重为1,跟屁民一样,这样似乎还挺民主的。
然后主席通过giveRightToVote()调用给屁民授权,只有被授权过的屁民才有资格投票。这是个漏洞,不过不是数字世界的漏洞,而是物理世界的漏洞,它给贿赂开了个口子。
屁民可以通过delegate()方法调用将自己的投票权交给代表。因为代表还可以被代表,代表是一个级联结构,所以为了防治代表链循环,代码需要进行循环检测。
屁民通过vote()方法调用进行投票,这里的屁民也可以是代表。
所有人都可以通过winningProposal()和winnerName()方法查看选举结果。
这是一个最简单的选举合约,复杂一点得还得考虑选举的开始和结束时间,还有选举的不同阶段和层次,可以做的跟世界杯比赛一样复杂。还可以让投票付费,这样就可以减少大量僵尸用户利用一人一票等权重的漏洞给候选人刷票。
阅读相关文章,关注微信公众号/知乎专栏/头条号【码洞】