The Art of Readable Code && High Performance Comments

譯注 – 寫在前面

這是對 How delegated voting works, and how to extend it for secret voting 的中文翻譯,依序解說委任投票 (Delegated Voting) 、委任秘密投票 (Secret Voting) 與偏好投票 (Preferential Voting)。

文中稱謂比照原文;部份段落內容或有刪改調整,專有名詞之中譯則以 g0v.tw 提供為準。

流動式民主中,委任投票運作方式

在談流動式民主 (Liquid Feedback) 的密碼學演算法前,先解說其現行 (未加密) 投票原理 — 這樣的投票方式又被稱作委任投票。

未加密 (clear-text) 委任投票示意圖

未加密 (clear-text) 委任投票示意

生肖黨黨人以委任投票的方式,決議一項具有三種可能方案 (initiative) 的議案 (issue)。 (流動式民主使用偏好式投票 (Preferential Voting) ,因而略為複雜。此範例為了簡化,每人僅對一項方案投票;這種投票方式稱為 N 中選 1 (1-out-of-n))

  • 阿牛、阿虎、阿兔、阿蛇活躍參與議案決策,並對各方案有足夠理解,因此決定直接投票。這四人被標為綠色,並且阿牛投給方案 #1,阿蛇投給方案 #2,而阿虎與阿兔投給方案 #3。
  • 其它人對這個議案不那麼活躍,或者他們不太關注政治;因此他們選擇將投票權委任給他們信任,又或者意向接近的人。這些人被標為藍色。
  • 投票權的委任是可移轉 (transitive) 的;因此委任關係可形成 (Graph),而票數則沿節點加總,並付予直接投票者 (direct voter)。在這個範例中,小羊將投票權委任給小馬,因此小馬的意見值兩票;小馬與小龍又各自委任阿蛇,因此阿蛇的意見值 4 票:他自己的 1 票與委任的 3 票。
  • (圖中未繪出) 在流動式民主中,每個人會從屬於組織,而議案會依照主題 (area) 分類 (例如財政、民權、環保等)。如果你比較懶,可以將所有議案的投票權都委任給組織內的另一個人;你也可以針對不同主題,或是特定議案,將投票權委任給特定人士 (較遲進行的委任會覆蓋先前的委任結果)。

而這正解釋了委任民主 (delegated democracy) 的強項:

首先,組織內的投票委任與票選民代進入國會議事堂十分相似;只是你可以隨時改變主意,毋需再等四年。能依主題決定委任人選,也解決了民代能就所有議題替你投票的迷思。舉例來說,有位芬蘭選民的政治傾向是這樣的:

  • 支持數位民權
  • 支持資本主義市場,反對社會主義
  • 支持核能發電

而芬蘭現今無政黨持上述政見;因此選民要嘛妥協,選擇僅支持部份政見的政黨,要嘛只能不投票。但若選民能對各主題委任不同人選,他便能對三項主題分別找出最適合的人選。

要是投票者對特定議案有不同想法,他也可以就該議案委任給不同人選,以覆蓋原有的委任選項;他也可以選擇在該議案進行直接投票 (譯註:只對該議案有效,其他議案仍預設沿用舊有委任關係或順位)。

如果想親手玩玩,可以至流動式民主的展示系統註冊 (譯註:英文頁面),並參與太陽系的政治議題。

整合委任投票與祕密投票

譯註:原文這段描述不太清楚,我盡力揣摩;歡迎相關領域大大協助指正。

接著談如何讓這套系統能以密碼學安全的方式秘密投票 — 每個人投的票都不為其它人所知。這顯然與委任投票的流程相抵觸:如果我們無法得知誰投給哪個選項,又如何運作委任或計票?

答案是將票券拆為兩部份:公開 (public) 與秘密 (private, secret) 票。

秘密委任投票示意

秘密委任投票示意

  • 每位用戶可以投下公開與秘密票各一張,且兩者未必投給同一個方案 (例圖為了簡化,因此公開與秘密票的歸屬均相同)。
  • 圖中的藍與綠框屬於公開票,僅用於投票委任;計票則採計秘密票,即圖中黑框。
  • 公開票與秘密票都可以採用直接投票或委任投票。
  • 用戶可以選擇不投公開票,則其它人無法委任投票權給他,或者這些委任票將成為廢票 (譯注:此項在不同實作可能有差異)
  • 用戶可以選擇只投公開票,不投秘密票;這張公開票不計票數,但若其它人將票 (譯注:應該是秘密票) 委任給他時,秘密票將採計。
  • 正如 (明文) 投票,用戶可以將公開票與秘密票的投票權委任給其它人。秘密票的記錄與計算則可以參照 Acquisti algorithm 等的密碼學算法。
    (譯註:該站的 Requirements for secure voting 與 On cryptographic e-voting algorithms in general 兩篇值得一讀)

將投票拆解為公開與秘密票,除了能解決技術問題之外,也是在效仿現代投票機制:人民投票內容需保密,但民意代表則須記名 (公開投票),才能向選民證明自己善盡受委任投票的責任。

原作者打了一個 liquid_feedback_patch 來演示這項流程:用戶除了在流動式民主系統內投公開票以外,還要到實作 Acquisti algorithm 的另一個投票平台 (未實作) 投秘密票。流動式民主系統不自行計票,改向該平台取得投票統計 (譯註: 流程中使用假資料) ,再依照原有流程,計算投票結果之 Schulze ranking。

偏好投票

投票方式 (如何記票、如何決定勝選者) 大幅影響民眾的投票行為。例如北美的勝者全得選舉系統,促成了兩黨政治。設想在美國總統選舉時,若要投票給綠黨 (譯註:民主、共和黨之外的一個小政黨) 候選人,則與不投票沒有兩樣,反正不可能會當選。有些人便因此不去投票,使投票率較低。有些國家使用不同的投票方式 (例:芬蘭使用頓特法 d’Hondt system),但同樣的問題仍然存在。

為了使委任民主系統盡量公平且普及,勢必要引用較為現代的偏好投票方法,而非我們習慣的傳統方式。流動式民主使用的是 Schulze ranking 法 (作者也是德國人)。

在前面的圖例中,選民只支持對候選方案中的一項;但在偏好投票系統下,選民是將後選方案依照喜好排序:”我最喜歡 #3,然後是 #1,最後才是 #2。”

流動式民主的投票排序有幾項要點:a) 可以給不同的方案指定同一個順位,代表喜好程度相等;b) 包含方案 “維持現狀” (Status quo),代表投票人不接受順位低於此的其他方案。前者給與票選結果更大的彈性,而後者可以單純視為另一個選項。

然而很不幸的,大多密碼學上安全的電子投票系統,都是以傳統投票方式為主,因而未必適用於偏好式投票。

將所有可能的偏好順位列舉並編號,例如 #3 #2 #1 則投 1,#3 #1 #2 則投 2 ,是一種解決方案。但若候選方案數量增加,則這份列表會相當肥碩,密碼學相關的運算量 (譯注:加解密與對密文的計票) 也隨之增加。流動式民主允許方案順位重複,更加重了這個問題。

Acquisti algorithm 在 5.2 提到開放式投票 (write-in vote) (譯註:由投票人在選票上寫出候選人的名字或方案名稱,以完成投票的方式) 的實作,可應用於偏好投票。比起預先生成列表,且其中大多選項無人支持,等選舉人投票時才將偏好順位加入選項列表,能省下不少功夫。

譯注 – 寫在後面

對於流動式民主有不同實作,例如 Pirate Feedback (由德國海盜黨使用,g0v.tw 的投票系統衍生自此) 不允許多層委任;投票人可設定偏好列表,將自己的投票權依順位委任給列表中有表示意見的人。

在與 @caasihuang 討論後,我對秘密投票的可能流程有了更多體悟,簡單講述如下:

  1. 投票運作需要建立兩套系統:
    1. 流動式民主的明文系統,用於計算委任結果與表示個人意向。不用於實際計票,因此沒有亮票的法律問題。
    2. 秘密計票系統,實作 Acquisti 系統,保證投入的每張票皆有效 (來自合法投票人)、可重計票、無法追溯 (不知道是誰投的)。
  2. 秘密計票接收三類選項:
    1. 直接投票 (既有選項)
    2. 直接投票 (新選項),原文講述可以 Acquisti 的開放式投票解決
    3. 委任投票,比照直接投票新選項的方式,在開票時再由明文系統的 snapshot 解析
  3. 開票時 (或開票前) 對明文系統取 snapshot,用於解析秘密委任投票;秘密投票在計票完成後,回應的結果類似於:

    對應開放選項表,可將 option1-4 轉換回:

    再照該 snapshot 求得計票結果:
  4. 秘密票不計入委任鍊 (delegation chain),因此無限循環 (infinite loop) 只可能肇因於明文系統的委任關係 — 而這可以分析避免。

原文屬於 Public Domain,本譯文則以 CC-BY 授權;其中圖片由 @audreyt 修改原文得來。若有誤譯或用詞不當,請留言或 email 告知。

發表迴響

分類

%d 位部落客按了讚: