原文作者:Michael Zhu ,a16z crypto 研究工程師來源:a16zcrypto 翻譯:DeFi之道
一般來說,所有投票系統都依賴於良好完整性和透明度,以此才能以任何有意義的方式發揮作用。從這點來看,區塊鏈成為了構建這一系統的理想實現路徑,事實上許多去中心化組織已經通過採用無許可投票來表達集體意圖,一般是在通過動用大量資金或調整關鍵協議參數的情況下來實現。但鏈上投票也有缺點,即隱私性不足,這對 web3 投票系統尤其不利,在當前的大多數鏈上投票協議中,選票和計票都是完全公開的,沒有隱私,那麼投票結果容易受到操縱和選民激勵失調,最終可能導致不民主的結果。
這就是我們發布 Cicada 的原因:一個新的開源 Solidity 庫,它利用時間鎖定謎題和ZK零知識證明進行鏈上投票。與現有系統相比,Cicada 具有新穎的隱私屬性,最小化信任化假設,並且足夠高效,可以在以太坊主網上使用。
在這篇文章中,我們調查了投票隱私的概況,並闡述了 Cicada 工作原理(將提供正式證明)。我們還鼓勵開發人員查看 GitHub 存儲庫——Cicada 可以通過多種方式進行調整和擴展,以支持不同的投票方案和功能,我們希望與社區合作探索這些可能性。
隱私投票背景概述
在任何投票系統中,都需要考慮許多不同的隱私層。個人選票數據的披露、連續計票和選民身份都會以不同方式影響選民激勵,哪些隱私屬性是必需的取決於投票的具體規則。以下是密碼學和相關科學文獻中經常出現的一些內容:
選票隱私:無記名投票,也稱為“澳大利亞選票( Australian ballot)”,是為物理現實世界的投票系統開發的一種投票方式,目的是保護個人選民的偏好,並減少賄賂和脅迫(在鏈上設置中,我們可能需要比選票隱私更強大的屬性——參見下面的“無收據”)。投票隱私也減輕了社會期望偏差——即人們根據別人對自己選擇的看法進行投票的壓力較小。
計票結果隱私:許多投票系統在選民仍在投票時會隱藏計票結果,每個選項已投了多少票是未知的,以免影響投票率和選民激勵。我們在現實世界中可以看到很多類似的情況,例如:晚些時間開始投票的美國參議員相比早些時間投票的參議員,前者之間更有可能與自己的政黨結盟。鏈上:在代幣加權投票中,鯨魚可以讓對手保持領先,讓他們產生一種虛假的安全感(有些人可能懶得投票,認為他們無論如何都會贏),然後在最後一刻投票,以改變結果。
選民匿名投票:在許多現實世界的投票系統中,個人的投票是私密的,但您投票的事實通常是公開的,這對於防止選民欺詐很重要,因為公佈誰投票的記錄可以讓人們檢查是否有其他人以他們的名義投票。然而,在鏈上,我們可以在使用加密原語保持匿名的同時防止選民欺詐——例如使用Semaphore,您可以在零知識的情況下證明您是尚未投票的合格選民。
無收據投票:個人選民自己提供他們選票的“收據”以證明他們是如何投票給第三方的,不然可能會導致選票出售。一個相關性很強的屬性是 coercion-resistance,它可以防止某人以某種方式強迫選民投票。這些屬性在去中心化環境中特別有吸引力,在這種環境下,可以通過智能合約市場使投票權流動,不幸的是,它也很難實現,事實上 Juels 等人聲明在沒有可信硬件的情況下,在未經許可的環境中是不可能實現的。
Cicada 專注於運行計票隱私,它可以與零知識組證明相結合,以獲得選民匿名和選票隱私等功能。
Cicada 簡介:從同態時間鎖謎題中計算隱私
為了實現計票結果,Cicada 借鑒了(據我們所知)以前從未在鏈上使用過的加密原語。
首先,時間鎖謎題 (Rivest, Shamir, Wagner, 1996) 是一種加密謎題,它封裝了一個秘密,只有經過一段預定的時間後才能揭示——更具體地說,這個謎題可以通過重複執行一些操作來解密不可並行計算。時間鎖定謎題在投票的背景下非常有用,可以實現計票結果隱私:用戶可以將他們的選票作為時間鎖定謎題提交,這樣他們在投票期間是完全隱私的,但可以在投票後公開。與大多數其他私人投票結構不同,這可以在不依賴計票機構(如選舉工作人員清點紙質選票或數字選票)、閾值加密(threshold encryption 其中多個受信任方必須合作解密消息)或任何其他受信任方情況下,任何人都可以運行計票隱私可以解決時間鎖定難題,來確保在投票後公佈結果。
其次,同態時間鎖謎題 (Malavolta Thyagarajan, 2019) 具有額外的屬性,即在知道密鑰、解密謎題或使用後門的情況下,可以對加密值進行一些計算。特別是,線性同態時間鎖謎題允許我們將謎題組合在一起,產生一個新的謎題,封裝了原始謎題的秘密值。
正如該論文的作者所指出的那樣,線性同態時間鎖謎題是一種特別適合私人投票的原語:選票可以編碼為謎題,並且可以將它們同態組合以獲得對最終計票進行編碼的謎題。這意味著只需要一次計算就可以揭示最終的計票結果,而不是為每張選票解決一個獨特的難題。
新結構:效率和權衡
要使投票方案在鏈上切實可行,還需要考慮更多的因素。首先,攻擊者可能會嘗試通過投出編碼不正確的選票來操縱投票。例如,我們可能希望每個選票的時間鎖定謎題都編碼一個布爾值:“1”表示支持投票的提案,“0”表示反對。該提案的熱心支持者可能會嘗試編碼,例如“100”來放大他們的有效投票權。
我們可以通過讓選民與選票本身一起提交選票有效性的零知識證明來防止這種攻擊。儘管零知識證明在計算上可能很昂貴——為了盡可能降低選民參與的成本,證明應該是 (1) 客戶端可有效計算和 (2) 鏈上可有效驗證。
為了使證明盡可能高效,我們使用定制的 sigma 協議——一種為特定代數關係設計的零知識證明,而不是通用證明系統。這實現了極快的證明時間:在現成的筆記本電腦上用 Python 生成選票有效性證明需要 14 毫秒。
雖然這個 sigma 協議的驗證器在概念上很簡單,但它需要一些大的模冪運算。 Malavolta和Thyagarajan的線性同態方案使用Paillier加密,因此這些冪運算將對某些RSA模N取模N^2,對於一個合理大小的N,冪運算在大多數EVM鏈上是非常昂貴的(數百萬gas)。為了降低此成本,Cicada 改用指數 ElGamal ,它仍然提供了加性同態,但工作模量要小得多(N而不是N^2)。
使用 ElGamal 的一個缺點是解密計數的最後一步需要暴力破解離散日誌(請注意,這是在鏈下完成並在鏈上有效驗證)。因此,它僅適用於預期的最終票數相當小的情況(例如小於 2^32,或大約 430 萬票)。在最初的基於 Paillier 的方案中,無論其大小如何,計數都可以被有效地解密。
選擇RSA模N也涉及到權衡。我們的實現使用 1024 位模數來提高gas效率。雖然這遠高於有史以來最大的 RSA 模數(829 位),但它低於通常推薦的用於 RSA 加密或簽名的 2048 位大小。但是,我們的應用程序不需要長期安全性:一旦選舉結束,如果將來考慮 N 就沒有風險。假定計票和選票在時間鎖定期後公開,因此使用相對較小的模數是合理的。
匿名性與選民資格
如上所述,Cicada 提供了運行計票結果的隱私——時間鎖定謎題屬性在投票期間保持計票的私密性。然而,每個單獨的選票也是一個時間鎖難題,在相同的公共參數下加密。這意味著就像可以解密計數(通過執行必要的計算)一樣,每張選票也可以,換句話說,Cicada 僅在投票期間保證選票隱私——如果好奇的觀察者希望解密特定選民的選票,他們可以這樣做。解密任何個人選票與解密最終計票一樣昂貴,所以它需要O(n)的工作來完全解密一張有n個選民的選票。但是,所有這些選票都可以並行解密(假設有足夠多的機器),所需的時間與解密最終計票所需的時間相同。
對於某些選票,這可能是不可取的。雖然我們對臨時的運行計票隱私感到滿意,但有時我們可能想要無限期的投票隱私。為實現這一點,我們可以將 Cicada 與匿名選民資格協議結合起來,通過零知識組成員身份證明進行實例化。這樣,即使選票被解密,它所揭示的只是有人以這種方式投票,而不知道具體是誰。
計票機構
我們在設計 Cicada 時的首要任務之一是避免需要一個計票機構:許多私人投票結構都需要一個半信任的計票機構(或權力委員會,或通過安全的多方計算進行協調)來接收和匯總選票,如果將其強行映射到區塊鏈環境中,就意味著這些方案不能完全由智能合約執行,需要一些人為乾預和中心化的信任。
在大多數結構中,計票機構的完整性不受信任,但他們的活躍度值得信任——如果他們離線,則無法計算最終結果,從而無限期地拖延投票結果。在某些結構中,他們也有一定的隱私性,也就是說,他們了解每個人如何投票,但預計會在不透露此信息的情況下公佈投票結果。
在現實世界的場景中,計票機構是一個合理且必要組織,但它在區塊鏈環境中並不需要,我們的目標是最大限度地減少信任並確保一定的審查阻力。
Cicada 只是探索了鏈上投票隱私領域眾多方向中的一個,並補充了其他團隊正在進行的相關研究。如上所述,Cicada 與Semaphore、ZK 存儲證明和RLN (Rate-Limiting Nullifier)等匿名技術密切相關,Cicada 還可以集成Nouns Vortex 團隊提出的 optimistic proof checker ,以減輕選民的 gas 負擔。
另外,還可以調整 Cicada 以支持不同的投票方案(例如代幣加權投票、二次投票),更複雜的方案對於以太坊主網來說可能計算成本太高,但它們在 L2 上是很實用的,考慮到這一點,我們歡迎您的貢獻、Fork和建議,和我們一起討論下一步該把Cicada帶到何處