來自康奈爾大學的電腦科學教授Ari Juels(工作量證明機制提出者之一),康奈爾大學博士後Iddo Bentov, 康奈爾大學電腦科學博士生Fan Zhang,康奈爾大學電腦科學博士生Phil Daian共同提出了一種稱為癱瘓證明(Paralysis Proofs)的技術,這使得多重簽名方案又有了新的可能。
以下為整合譯文(注:其中的“我們”,指康奈爾大學的研究者):
從埋藏於“金銀島”的黃金寶藏,到七枚失蹤的法貝熱彩蛋,丟失和被盜的寶藏,一直是傳說中的事情。然而,在比特幣的世界,這裡沒有公主、惡龍或者海盜,這裡也沒有太多的浪漫。財富的丟失,往往只是因為膝上型電腦上的私鑰遺失了,或者弄丟了自己列印或抄寫的帶有私鑰的紙條,又或者是遭到了駭客的洗劫。
金鑰管理在任何密碼系統中都是至關重要的。像比特幣和以太坊這樣的密碼貨幣也不例外。私鑰的丟失或被盜,可能是災難性的,而要很好地處理私鑰也是一件非常困難的事情。使用者需要保護他們的私鑰,以免受狡猾駭客的竊取,同時又要妥善地保護它們以防資產丟失。金鑰管理在商業情景下尤其具有挑戰性,通常沒有人會信任完全被控制的資源。
一般而言,我們會使用多重簽名(multisig)技術來管理密碼貨幣的私鑰,這是一種強大的方法,簡單說就是讓多個使用者分別保管一個私鑰,而要進行交易,就需要其中幾個私鑰進行簽名。這種金鑰分發的方式,也被稱為秘密共享。
我們則釋出了一篇論文,解決了一般秘密共享方案(尤其在密碼貨幣領域)存在的嚴重問題。我們將這個問題稱為癱瘓問題。
秘密分享如何導致癱瘓問題的發生?
幾個月前,一位熟人向我們提出了一個簡單,但非常有趣的問題,而它也是現實世界金鑰分發挑戰的一個很好的例子。
這位朋友(這裡化名為Richie)和他的兩位商業夥伴共享了大量比特幣的所有權。而他們自然不希望當中有任何一個人能夠把這些比特幣偷偷拿走。他們希望確保這些比特幣只有在所有人的同意下才能夠使用。有一個簡單的解決方案,對吧?他們可以使用3 of 3的多重簽名方案,然後三個人都需要簽名才能夠使用這些比特幣。問題似乎解決了!但真的是這樣嗎?
很顯然,故事到這裡並沒有結束。當然,Richie和他的合作伙伴也會擔心其中有人把私鑰給弄丟的情況。例如儲存金鑰的裝置可能會壞掉,金鑰也有可能被錯誤刪除,或者有人遭遇了一些非常不幸的情況(例如車禍),那麼其中一名合夥人的私鑰就會丟失。則最終的結果是所有的比特幣就完全丟失了!
這並不是唯一糟糕的場景,Richie和他的合作伙伴也可能對如何花這些錢有著不同的看法,而且也無法達成協議。更糟糕的是,假設其中有一位合夥人是惡意或貪婪的,她可能透過扣留她的金鑰部分,來勒索其他人(換取資金)。在這種情況下,比特幣也可能會暫時或永久性地丟失。
這裡使用了“癱瘓”這個術語,以表示任何不能花費比特幣的尷尬情況。不幸的是,N-of-N的多重簽名方案無法解決癱瘓問題。事實上,它會使問題變得更糟,因為丟失任何一個金鑰都會是致命的。
出於這個原因,我們需要在滿足Richie及其合作伙伴目標的同時,也要避免掉癱瘓的情況,即需要讓所有人都同意花費這些比特幣,這似乎是不可能的!假設我們有一個N-of-N 的多重簽名方案,而要完成一筆交易,我們顯然需要讓所有合夥人同意簽署才可以做到。如果(N-1)位合夥人可以在某位合夥人的金鑰丟失的情況下,以某種方式獲得對比特幣的訪問許可權,他們可簡單地假裝其中一份金鑰已經丟失,並自行獲取資金。換句話說,我們實際上一開始實施的就是(N-1)of-N的多重簽名方案,這就產生了矛盾。
Richie的問題,似乎讓我們處在了癱瘓的狀態......
解決悖論
由於兩種強大技術的出現(區塊鏈和可信硬體),特別是英特爾SGX,事實證明我們實際上是可以解決這種悖論的。我們可以有效地在一般環境中做到這一點,據我們所知,這是有史以來第一次。為此,我們引入了一種稱為癱瘓證明(Paralysis Proof)系統的新技術
正如你會看到的,在以太坊平臺當中,我們可以相對容易地實施這種癱瘓證明系統,我們只需要用到一個智慧合約,而不需要英特爾SGX。我們在論文中提供了以太坊合約的例子。然而,比特幣中存在的指令碼約束,這使得它需要用到SGX裝置,並且還會引入一些技術挑戰。
簡單瞭解癱瘓證明系統
總體原理是相當簡單的。受信任的第三方,將所有的金鑰都儲存在託管處。如果一方或多方不能或不願簽署交易,則會導致上述的癱瘓情況,其他人則產生一個癱瘓證明,表明情況就是這樣的。鑑於此證明,第三方使用其持有的金鑰來授權交易。
但是,如果我們引入了一個可信的第三方,顯然,我們沒法實現Richie和他的朋友們提出的安全目標。因為有一方可以控制所有的私鑰!
而這就是SGX發揮作用的地方了。SGX應用,其行為基本類似於具有預定約束的可信第三方。例如,它可被程式設計,以便只有在提供有效證明時才能夠簽署交易。(從這個意義上講,SGX應用的行為與智慧合約非常相似。)感謝SGX,我們可以確保在可證實的癱瘓情況發生時,讓多數私鑰持有者能夠訪問到比特幣資產。
一些技術細節
當然,即使考慮到SGX的這種魔力,我們仍然需要確保癱瘓證明(Paralysis Proof)的生成是合法的。我們不希望Richie的合作伙伴能夠“指控”他,錯誤地聲稱他已經死亡,比如說對執行SGX應用的主機發起日食攻擊( eclipse attack)。令人高興的是,區塊鏈本身提供了一種強有力的方式來傳輸訊息,並讓某方知道傳輸者還活著。為了在比特幣網路上實施癱瘓證明系統,我們利用了這個事實以及一些技巧。為了簡單起見,我們將重點關注無法訪問的金鑰的問題,而暫時擱置其他形式的癱瘓情況。
一個癱瘓證明會被構建,證明某P方不及時響應(無法簽署交易)。該系統會發出一個挑戰(challenge),“被控”方必須對我們所謂的“生命訊號”作出迴應。如果在一段預定的時間內(例如24小時)沒有生命訊號響應這一挑戰,則這種缺席便構成了癱瘓證明。
而對於比特幣而言,P方的生命訊號,可以採用可忽略不計數量(例如0.00001 BTC)的比特幣UTXO形式,它可以是由P方發出(從而證明她還存在),或者透過pk_SGX發出(但需要等延遲過後才可以進行)。請注意,sk_SGX僅是被SGX應用所知的。
讓我們再拿三個合夥人作為例子。假設他們每個人都擁有一個金鑰對 (sk_i, pk_i)。首先,他們會託管自己的比特幣資金(假設有5000 BTC)到UXTO_0這個可花費的輸出,當三人都同意的情況,或者透過pk_SGX,就可以對其進行使用。現在,假設P_2和P_3決定指控P_1。SGX應用在收到兩人的請求之後,會準備以下兩筆交易,並將其傳送給P_2 和 P_3:
· t_1(交易1)建立了0.00001 BTC 的生命訊號UTXO_1 ,對此pk_1可以立即使用它,或者在超時後(例如144個區塊,約24小時)可由pk_SGX使用;
· t_2 (交易2)會花費UTXO_0以及生命訊號UTXO_1,然後將它們傳送到一個可由pk_2和pk_3控制的地址(或者,如果他們想要留在癱瘓證明系統當中,pk_SGX也是可選的)。
因此,指控P_1的合夥人應該向比特幣網路廣播t_1,等待t_1被新增到區塊鏈後,再等待接下來的144個區塊,然後將t_2廣播到比特幣網路。而在這期間,會出現兩種可能的結果:
· 在合法指控的情況下,P_1確實是無法使用t_1交易的,而一旦t_2交易被網路確認,則P_2和P_3將獲得比特幣的訪問權。這確保了BTC基金的可用性。
· 然而,在發生惡意指控的情況下,上述方案確保P_1在144個區塊時間內可提出上訴。為此,P_1可使用那個僅為她所知的金鑰,來花費UTXO_1。由於t_2將UTXO_0和UTXO_1都作為輸入,因此花費t_1,會使得t_2成為一筆無效交易。
安全論證
生命訊號的安全性,源於在t_1中使用了CheckSequenceVerify。詳細地講,只有當每個輸入的驗證部分(比特幣當中被稱為指令碼簽名-ScriptSig)都是正確的時候,t_2才會有效。SGX飛地裝置為花費託管基金而而生產的驗證部分會立即生效,但只有在t_1交易被納入比特幣區塊鏈之後(需等待144個區塊,由於CSV條件),花費t_1的驗證部分才會有效。因此,將超時引數設定為較大值有兩個目的:(1)給予P1足夠的響應時間,以及(2)確保攻擊者無法透過製造自己的鏈取代比特幣區塊鏈。
在以太坊平臺上的應用
以上提到的都是關於比特幣的例子,但癱瘓證明系統其實不僅僅可以應用於比特幣,對於像以太坊這樣的智慧合約平臺,其實現會更為簡單,我們可透過合約替換掉對可信SGX硬體的需求。
我們給出的參考實現程式碼只有117行,以下為其中的主要邏輯:
function spend(uint256 proposal_id) public { // Get rid of any paralyzed keyholders prune_paralyzed_keyholders(); require(is_keyholder(msg.sender)); require(proposal_id < proposals.length); // add sender's signature to approval proposal_sigs[proposal_id][msg.sender] = true; // if enough proposers approved, send money uint num_signatures = 0; for (uint256 i = 0; i < keyholders.length; i++) { if (!paralyzed[keyholders[i]]) { if (proposal_sigs[proposal_id][keyholders[i]]) { num_signatures++; } } } if ((num_signatures) >= required_sigs) { if (!proposals[proposal_id].filled) { proposals[proposal_id].filled = true; proposals[proposal_id].to.transfer(proposals[proposal_id].amount); } } } function remove(address accused) public { // Get rid of any paralyzed keyholders (prevent paralyzed requester) prune_paralyzed_keyholders(); // both requester and accused must be keyholders require(is_keyholder(msg.sender)); require(is_keyholder(accused)); // There shouldn't be any outstanding claims against accused require(!(paralysis_claims[accused].expiry > now)); // Create and insert an Paralysis Claim paralysis_claims[accused] = ParalysisClaim(now+delta, false); NewAccusation(accused, now + delta); // Notify the accused } function respond() public { require(paralysis_claims[msg.sender].expiry > now); paralysis_claims[msg.sender].responded = true; } |
更多數字貨幣資訊:www.qukuaiwang.com.cn/news