詳解最小化反共謀基礎設施MACI:鏈上治理中的抗勾結框架
關於這篇文章的背景,請參考《二次方投票和二次方資助》。在這篇文章發布後的一個月,BSC基金會在DoraHacks开發者平臺HackerLink上運行了BSC生態第一輪二次方資助,並在其後的15天中收到了全球超過60個开發者團隊提交的項目。
在《二次方投票和二次方資助》中,我介紹了Vitalik的博客《Quadratic Payments》所提到的三個問題:身份僞造攻擊(Identity Bribery)、勾結(Collusion)、理性忽視問題(Rational Ignorance)。這三個問題其實不限於二次方投票,而是鏈上治理機制所遇到的通用問題。因此,這些問題的解決方案不僅可以使得二次方投票更規模化和更安全,還可以惠及更多鏈上治理的機制。
這篇文章的目標是為設計一種“非合作二次方投票”,或“抗勾結二次方投票”的機制做准備。在這種場景下,投票者無法相互之間合作,因此就沒有了勾結的可能性。這種機制一個基礎框架是,Vitalik Buterin在Ethresear上發表的文章《Minimal anti-collusion infrastructure》[1] (MACI)。因此,我們先解釋MACI的機制,從而為進一步探討如何使用MACI改進二次方投票,消除勾結(Collusion)的可能性。
MACI: Minimal Anti-Collusion Infrastructure
MACI是“最小化抗勾結框架”。背景材料參考Vitalik Buterin 的博客https://ethresear.ch/t/minimal-anti-collusion-infrastructure/5413 ,以及《On Collusion》 https://vitalik.ca/general/2019/04/03/collusion.html
很多的鏈上治理應用需要“抗勾結”這個特性,但同時又需要區塊鏈對交易執行以及抗審查、保護隱私的保證。投票是有這種需求的一個重要場景,因為很明顯在投票中,抗勾結是必須的,同時對執行結果的正確性的要求是很高的,需要保護計票過程,最後,還需要防止對投票者的審查。
設置
假設有一個智能合約\(R\),包含一個公鑰的列表 \(K_1 ... K_n\), 以及一些必要的函數,可以把這些公鑰注冊到智能合約中。另外,只有符合以下兩個條件驗證身份的參與者的公鑰可以進入到R中:
账戶屬於一個“合法”的參與者(一個獨立的人,某個社區的成員,比如擁有某個國家的國籍、在一個論壇上有足夠高的聲譽、持有不少於某個數量的Token…)
账戶持有人個人控制密鑰(例如,如果需要的話,可以打印出來以證明)
每一個用戶需要stake一筆錢: 如果任何人泄漏了自己的私鑰,那么得到私鑰的人可以直接取走這筆錢,從而這個账戶就會從列表中被移除。這個機制抑制了任何人把私鑰交給別人。
另外,假設有一個操作員(\(operator\)),他有一個私鑰\(k_\omega\), 和一個對應的公鑰\(K_\omega\).
最後,假設有一個機制 \(M\), 它是一個函數 \(action^n \rightarrow Outputs\), 其中,函數的輸入是\(n\)個參與者的行為,輸出是這個函數定義的某種輸出結果。例如,一個簡單的投票機制是一個函數,根據輸入的值,輸出出現次數最多的那個值。
執行
在起始時間\(T_{start}\),\(operator\)开始一個其實狀態\(S_{start} = {i: (key=K_i, action = \phi)}, i \in 1...n\).
在起始時間\(T_{start}\)和結束時間\(T_{end}\)之間,任何注冊的參與者可以向R發送消息,消息用參與者自己的私鑰\(k\)加密。有兩種消息:
約定行為: 例如投票。參與者需要發送加密過的消息 \(enc(msg = (i, sign(msg = action, key = k_i)), pubkey = K_\omega)\), 其中\(k_i\)是這個參與者當前的私鑰,\(i\)是參與者在\(R\)中的id
更新密鑰: 參與者需要發送加密過的消息\(enc(msg = (i, sign(msg = NewK_i, key = k_i)), pubkey = K_\omega)\), 其中\(NewK_i\)是參與者要變更的公鑰, \(k_i\)是這個參與者當前的私鑰
這時,操作員的工作是按照消息上鏈的先後順序處理每一個消息。具體的處理過程:
使用操作員私鑰解密消息。如果解密失敗,或者解密對應的信息無法解碼成為以上的兩類信息,則直接跳過這條信息
使用\(state[i].key\)驗證消息的籤名
如果解碼後的消息是約定的行為(\(action\)),那么設置\(state[i] = action\), 如果解碼後的消息是一個新的公鑰,那么設置\(state[i].key = NewK_i\)
在\(T_{end}\)之後,操作員必須公布輸出狀態 \(M(state[1].action, ... , state[n].action)\), 同時給出一個ZK-SNARK,證明這個輸出是正確的結果。
為什么這個機制是抗勾結的
假設一個參與者想要證明他做過什么,例如做過\(action\) \(A\),他可以引用一個鏈上的交易\(enc(msg = (i, sign(msg = A, key = k_i)), pubkey = K_\omega)\),並且提供一個零知識證明,驗證這筆交易的確是包含\(A\)的加密信息。但是,他無法證明他沒有發出別的交易,例如他可能發出過一筆更早的交易,把公鑰換成了一個新的\(NewK_i\),因此前面的證明也就變得沒有意義了,因為如果他更換過密鑰的話,他可能已經做了別的動作。
參與者還可能把私鑰給其他人,但是這樣做的話那個人拿到私鑰後就可以立即試圖修改密鑰。這樣的話 1) 有50%的成功率,2) 會導致拿到密鑰的人直接拿走之前stake的存款。
MACI未解決的問題
接收方在可信硬件環境中,或者接收方在可信多籤的情況下,賣出私鑰
原有的私鑰在一個可信的硬件環境中的攻擊,這個環境可以防止私鑰變更為任何攻擊者們不事先知道的私鑰
第一種情況,可以通過特別設計的復雜籤名機制,而這種設計對可信硬件和多籤不友好。不過這種設計需要確保驗證函數對ZKP友好。
第二種情況可以通過“面對面零知識證明”解決,例如,參與者可以把私鑰拆解為\(x + y = k_i\),公布\(X = x*G\) 和 \(Y = y*G\), 並且給驗證者展示兩個信封,分別包含\(x\)和\(y\); 驗證者打开一個,檢查公布的\(Y\)是正確的,然後檢查\(X + Y = K_i\)。
非合作二次方投票
這種機制可以用來改進包括投票在內的多種鏈上治理機制。在二次方資助中,當資金池規模非常大的時候,或者當二次方資助被用於更大的場景時(例如大選、國會審批預算等場景),勾結就會成為一個必須被解決的問題。因此,設計一個抗勾結二次方投票(Anti-collusion quadratic funding)機制,可以規模化二次方資助。
[1]Vitalik Buterin, Minimal anti-collusion infrastructure,
https://ethresear.ch/t/minimal-anti-collusion-infrastructure/5413
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。
24H熱門幣種與要聞 | Michael Saylor發布數字資產框架提案;Azuki疑似即將發幣(12.23)
24 H 熱門幣種 1、CEX 熱門幣種 CEX 成交額 Top 10 及 24 小時漲跌幅: B...