簡介
“楔入式側鏈”的一個主要目標是在比特幣系統模型之上最小化附加的信任。難點是幣在側鏈間的安全轉移:接收鏈必須能得知傳送鏈的幣已被正確鎖定。
設計原理
“楔入式側鏈”的一個主要目標是在比特幣系統模型之上最小化附加的信任。難點是幣在側鏈間的安全轉移:接收鏈必須能得知傳送鏈的幣已被正確鎖定。在比特幣的領導下,我們提議用DMMS來解決這一問題。儘管有可能利用一個簡單基於信任的方案,引入固定數量簽名者來驗證幣的鎖定,但有很多重要理由讓我們避免這種單點故障的引入:
信任個人簽名者,並不僅僅意味期待他們做事誠實,他們還必須永遠不出漏洞、永遠不會泄露關鍵的秘密、永遠不會被挾持、永遠不會停止參與網路。
由於數字簽名是長期存在的,對任何信任的要求也必須如此。經驗告訴我們,即使時間跨度只有幾個月,信任需求也是一種危險的期待,更何況我們所期望的金融系統所能持續的時間長達幾個世代。
在比特幣系統消除了單點故障前,數字貨幣一直沒有什麼吸引力,社區強烈反對引入這種弱點。2007年以來的金融事件更加強了社區的不信任;對金融系統和其他公共機構的公共信任也同樣處於歷史的低點。
雙向楔入
楔入式側鏈的技術基礎稱作雙向楔入。本節我們將解釋它是如何工作的,先給出一些定義。
幣(coin),或資產,是一種可以用密碼學方法辨識控制者的數字財產。
區塊,是一個描述資產控制發生變化的交易的集合。
區塊鏈,是一個有序次的區塊的集合,所有用戶必須(或最終)對該集合達成共識。這確定了資產控制的歷史,提供了一個計算上無法偽造的交易時序。
重組,或稱reorg,發生在客戶端本地,當先前已接受的鏈被一個有更多工作量證明的競爭鏈取代時,分叉上失敗一方的區塊要從共識歷史中移除。
側鏈,是驗證來自其他區塊鏈數據的區塊鏈。
雙向楔入,指的是讓幣以一個固定或確定性的匯率在側鏈間轉出和轉入的機制。
楔入式側鏈,是一條資產可以從其他鏈導入並返還的側鏈;即,一條支持雙向楔入資產的側鏈。
簡單支付驗證證明(或稱SPV證明),是一種動態成員多方簽名(DMMS),發生於一條類比特幣系統工作量證明(proof-of-work)區塊鏈上。
本質上,SPV證明是由一個展示工作量證明的(a)區塊眉列表,和一個(b)表明某一輸出發生在列表中的某一個區塊的密碼學證明所組成。
這使驗證者可以檢查是否有一定數量的工作已經認可了某個輸出的存在。當有其他證明(proof)展示了一條工作量更多的鏈,且生成該輸出區塊未包含於其中時,其他證明會使這一證明失效。
使用SPV證明來確定交易歷史,隱含著要信任最長的區塊鏈也是最長的正確區塊鏈,在比特幣系統中,這是由一個被稱為SPV的客戶端實現的。由於誠實的哈希算力不會為一個無效鏈去工作,只有當超過50%的哈希算力合謀時,才會始終欺騙SPV客戶端(除非客戶端處於長期的女巫攻擊之下,使其無法看到實際的最長鏈)。
還可以這樣做,通過獲取每個區塊眉來指代區塊鏈上未花費輸出的集合,任何擁有SPV證明的人不需要“中繼”(relay)每個區塊也能確定鏈的狀態。(在比特幣系統中,完全驗證者第一次開始跟蹤區塊鏈時需要做這種中繼。)
通過在比特幣系統的區塊結構中包含一些額外數據,我們可以生成比區塊眉完整列表更小的證明(proofs),從而提高可擴展性。儘管如此,這樣的證明還是比普通的比特幣交易要大得多。幸好對於大多數資產轉移來說,這並不是必要的:每條鏈的持幣人可以直接使用元互換(原子交換)操作進行匯兌。
對稱式雙向楔入
我們可以利用這些想法將一個側鏈SPV楔入至另一個側鏈。這包含以下工作:為了將父鏈幣轉移為側鏈幣,父鏈幣被傳送到父鏈上的一個特殊輸出中,該輸出只能由側鏈上擁有的一個SPV證明來解鎖。為了在兩條鏈上進行同步,我們需要定義兩個等待周期:
1、側鏈間轉移的確認期,是指幣在轉移至側鏈之前,在父鏈上必須被鎖定的期間。此確認期目的是生成足夠多的工作量,讓下一個等待期內的拒絕服務攻擊變得更困難。典型的確認期的量級可以是一或兩天。
當父鏈上生成了特殊輸出後,用戶等待確認期結束,然後在側鏈上生成一個引用該輸出的交易,提供出一個它已被創建並在父鏈上被足夠工作量覆蓋的SPV證明,
確認期是一個依側鏈而定的安全參數,要在跨鏈交易速度和安全性間做權衡。
2、接下來,用戶必須等待一個競賽期。這個期間,新轉移過來的幣不能在側鏈上花費。競賽期的目的是防止重組時出現雙花,在重組期間轉走先前鎖定的幣。在這個延遲期內的任何時刻,如果有一個新的工作證明發布出來,對應的有著更多累計工作量的鏈中沒有包含那個生成鎖定輸出的區塊,那么該轉換將被追溯為失效。我們稱此為重組證明。
只要有可能,所有側鏈上的用戶都會有動力來制發重組證明,因為對不良證明的承認會稀釋所有幣的價值。
典型的競賽期也是一或兩天的量級。為了避免這些延遲,用戶很可能用元互換(原子交換)(在附錄C中有描述)進行大多數交易,只要有流動性的市場可用。
當幣在父鏈上被鎖定時,該幣可以在側鏈內自由轉移,不需要與父鏈進一步互動。不過,它仍保留著父鏈幣的身份,僅能轉回到它所來的那一條鏈上。
當用戶想把幣從側鏈上轉回父鏈時,與原先轉移所用的方法相同:在側鏈上將幣傳送至一個SPV鎖定的輸出,產生一個充分的SPV證明來表明該輸出已完成,使用這個證明來解鎖父鏈上先前被鎖定的那個等面值的輸出。
由於楔入式側鏈可能會從很多鏈中搬運資產,且無法對這些鏈的安全性做出假定,因此,不同資產不可相互兌換是非常重要的(除非是一個顯示聲明的交易)。否則,惡意用戶可以通過創建一條資產毫無價值的無價值鏈進行偷盜,將這樣一種資產移到一個側鏈,再把它和別的東西去兌換。為了應對這種情況,側鏈必須有效地將不同父鏈中的資產處置為不同的資產類型。
總之,我們提議讓父鏈和側鏈相互做數據的SPV驗證。由於不能指望父鏈客戶端能看到每條側鏈,為了證明所有權,用戶必須從側鏈導入工作量的證明到父鏈。在對稱式雙向楔入中,反向的操作也是如此。
為了讓比特幣系統成為父鏈,需要有一個能識別和驗證SPV證明的腳本擴展。最起碼的要求是,這種證明需要做得足夠小,以便能放進比特幣系統一個交易之中。不過,這只是一個軟分叉,對於不使用新功能的交易不會產生影響。
非對稱式雙向楔入
上節以“對稱式雙向楔入”作為標題,是因為從父鏈向側鏈的轉移機制與反方向的機制是相同:都擁有SPV安全性。
另一種方案是非對稱式雙向楔入:這種方式下,側鏈上的用戶對父鏈能完全驗證,由於所有的驗證者都知道父鏈的狀態,從父鏈向側鏈的轉移不需要SPV證明。另一方面,由於父鏈並不知道有側鏈,所以轉回到父鏈時需要有SPV證明。
這對安全性有所促進,現在,即使一個51%攻擊者也沒法錯誤地將幣從父鏈轉移到側鏈。不過,相應的代價是迫使側鏈的驗證者去跟蹤父鏈,同時也意味著發生在父鏈上的重組也可能導致側鏈上的重組。在這裡,我們不詳細探討這種可能性,因為圍繞重組的議題會導致複雜度顯著擴大。