選舉雖然在名義上標(biāo)榜一人一票,但是選舉的計票機卻是黑箱的,誰也看不到。要是選舉服務(wù)里面有個漏洞或者后門,美國的歷史也就要因此改變了。
區(qū)塊鏈將算法公開到區(qū)塊上,人人可見,有沒有漏洞就可以提前被億萬民眾發(fā)現(xiàn)。選舉過程也可以使用區(qū)塊鏈合約來實現(xiàn)。
我們看下面最簡單的選舉合約代碼。
該選舉合約不是簡單的一人一票,還具備人大代表機制,也就是代碼中的delegation。
普通用戶可以將投票權(quán)交給人大代表,人大代表的選擇代表里對應(yīng)所有用戶的一致選擇。
Voter結(jié)構(gòu)代表廣大屁民。屁民的weight默認(rèn)是1,表示一人一票,如果被代表了,weight就變成0,對應(yīng)人大代表的weight就是代表的所有屁民數(shù)量,包括自己。delegate字段指向人大代表,如果沒有被代表這個字段就是0。
Proposal結(jié)構(gòu)代表候選人。每個候選人都有一個名字和票數(shù)。
chairman是選舉主席,是選舉活動的發(fā)起人,有些操作只有它可以做。正因為它的權(quán)利很大,所以主席很容易被私下賄賂。同樣代表的投票權(quán)重很大,所以代表也容易私下被賄賂。
本算法做不到防止賄賂,畢竟這是物理世界的事,數(shù)字世界和物理世界如陰陽兩隔。
選舉步驟如下
主席通過Ballot()構(gòu)造器初始化選舉活動,傳入候選人名稱數(shù)組。因為主席也算屁民,所以它也可以投票,權(quán)重為1,跟屁民一樣,這樣似乎還挺民主的。
然后主席通過giveRightToVote()調(diào)用給屁民授權(quán),只有被授權(quán)過的屁民才有資格投票。這是個漏洞,不過不是數(shù)字世界的漏洞,而是物理世界的漏洞,它給賄賂開了個口子。
屁民可以通過delegate()方法調(diào)用將自己的投票權(quán)交給代表。因為代表還可以被代表,代表是一個級聯(lián)結(jié)構(gòu),所以為了防治代表鏈循環(huán),代碼需要進行循環(huán)檢測。
屁民通過vote()方法調(diào)用進行投票,這里的屁民也可以是代表。
所有人都可以通過winningProposal()和winnerName()方法查看選舉結(jié)果。
這是一個最簡單的選舉合約,復(fù)雜一點得還得考慮選舉的開始和結(jié)束時間,還有選舉的不同階段和層次,可以做的跟世界杯比賽一樣復(fù)雜。還可以讓投票付費,這樣就可以減少大量僵尸用戶利用一人一票等權(quán)重的漏洞給候選人刷票。
閱讀相關(guān)文章,關(guān)注微信公眾號/知乎專欄/頭條號【碼洞】