選舉雖然在名義上標榜一人一票皮官,但是選舉的計票機卻是黑箱的,誰也看不到实辑。要是選舉服務里面有個漏洞或者后門捺氢,美國的歷史也就要因此改變了。
區(qū)塊鏈將算法公開到區(qū)塊上剪撬,人人可見摄乒,有沒有漏洞就可以提前被億萬民眾發(fā)現(xiàn)。選舉過程也可以使用區(qū)塊鏈合約來實現(xiàn)残黑。
我們看下面最簡單的選舉合約代碼馍佑。
該選舉合約不是簡單的一人一票,還具備人大代表機制萍摊,也就是代碼中的delegation挤茄。
普通用戶可以將投票權交給人大代表冰木,人大代表的選擇代表里對應所有用戶的一致選擇穷劈。
Voter結構代表廣大屁民。屁民的weight默認是1踊沸,表示一人一票歇终,如果被代表了,weight就變成0逼龟,對應人大代表的weight就是代表的所有屁民數(shù)量评凝,包括自己。delegate字段指向人大代表腺律,如果沒有被代表這個字段就是0奕短。
Proposal結構代表候選人宜肉。每個候選人都有一個名字和票數(shù)。
chairman是選舉主席翎碑,是選舉活動的發(fā)起人谬返,有些操作只有它可以做。正因為它的權利很大日杈,所以主席很容易被私下賄賂遣铝。同樣代表的投票權重很大,所以代表也容易私下被賄賂莉擒。
本算法做不到防止賄賂酿炸,畢竟這是物理世界的事,數(shù)字世界和物理世界如陰陽兩隔涨冀。
選舉步驟如下
主席通過Ballot()構造器初始化選舉活動填硕,傳入候選人名稱數(shù)組。因為主席也算屁民蝇裤,所以它也可以投票廷支,權重為1,跟屁民一樣栓辜,這樣似乎還挺民主的恋拍。
然后主席通過giveRightToVote()調(diào)用給屁民授權,只有被授權過的屁民才有資格投票藕甩。這是個漏洞施敢,不過不是數(shù)字世界的漏洞,而是物理世界的漏洞狭莱,它給賄賂開了個口子僵娃。
屁民可以通過delegate()方法調(diào)用將自己的投票權交給代表。因為代表還可以被代表腋妙,代表是一個級聯(lián)結構默怨,所以為了防治代表鏈循環(huán),代碼需要進行循環(huán)檢測骤素。
屁民通過vote()方法調(diào)用進行投票匙睹,這里的屁民也可以是代表。
所有人都可以通過winningProposal()和winnerName()方法查看選舉結果济竹。
這是一個最簡單的選舉合約痕檬,復雜一點得還得考慮選舉的開始和結束時間,還有選舉的不同階段和層次送浊,可以做的跟世界杯比賽一樣復雜梦谜。還可以讓投票付費,這樣就可以減少大量僵尸用戶利用一人一票等權重的漏洞給候選人刷票。
閱讀相關文章唁桩,關注微信公眾號/知乎專欄/頭條號【碼洞】