原文: 《跨鏈橋安全研究(四) | Polkadot異構多鏈解析,跨鏈橋如何跨過安全的門檻? 》

*以下僅為安全技術研究,不構成投資建議

歡迎大家來到成都鏈安出品的“跨鏈橋安全研究”系列文章,在上一篇文章裡( 多邊形戰士Polygon安全透析:如何保證跨鏈的安全性和穩定性? ),我們詳細對Polygon跨鏈橋協議進行專業的技術分析。

今天,成都鏈安安全研究團隊將Polkadot生態進行安全透析。

Polkadot異構跨鏈安全性分析:在Web3構造不同的平行鏈,如何守住共同的安全線?

Polkadot是一種異構多鏈的跨鏈技術,主要由中繼鏈、平行鏈、轉接橋構成。其中,平行鏈負責具體的業務場景實現,其允許並行處理交易,且每條平行鏈都有一個獨特的狀態轉換函數(STF)。中繼鏈則負責整個網絡的共識驗證,只要一條鏈的邏輯代碼可以編譯為Wasm並遵守Relay Chain API,那麼其就可以作為平行鏈被接入到Polkadot網絡生態中。而轉接橋負責連接polkadot生態和外部的獨立區塊鏈(如:以太坊等)。具體的系統架構如下圖所示:

Polkadot異構跨鏈安全性分析:在Web3構造不同的平行鏈,如何守住共同的安全線?

1_ 混合共識

Polkadot整個網絡的共識出塊過程主要為:

平行鏈階段:

收集人(Collator)會收集平行鏈上的交易打包生成候選區塊,將其發送給該平行鏈的驗證者。其中,候選塊可能是無效的,它必須經過有效性檢查才能被包含到中繼鏈中。

中繼鏈提交階段:

驗證者將通過平行鏈註冊代碼公開的驗證函數對候選區塊進行驗證。如果驗證成功,則該驗證者將其傳遞給網絡中的其他驗證者繼續進行驗證。否則,將該候選塊判定為無效塊。當該候選塊被超過一半的驗證者驗證通過時,驗證者會生成一個包含:平行鏈ID、收集人ID和簽名、候選塊執行前平行鏈的狀態根、候選塊執行後平行鏈的狀態根等信息的候選收據,該收據最終會被包含在中繼鏈的狀態中。

- 可用性和不可用性子協議

- 二級GRANDPA 批准有效性檢查

- 調用拜占庭容錯終結性小工具來鞏固鏈條

在傳統的PoS系統中,區塊生成取決於代幣的持有量而不是算力,質押的代幣數量越多成為驗證者的概率就越大,對區塊鏈系統造成的影響也就越大。因此,必須採取一定的措施降低這種可能的中心化風險,而如果由專業的人員和設備來維護系統中驗證者候選人的數量,會增加運營成本。所以針對擁有大量驗證者的系統,則更傾向於在鏈下建立一個候選驗證者池並從候選隨機篩選出驗證者,Polkadot採用的驗證者選擇算法是NPoS。

首先介紹一下共識算法中的概率確定性和可證明的確定性,一個運行PoW的中本聰區塊鏈就只能實現概率確定性並達成最終的共識。其中,概率確定性是指在給定的區塊後,我們可以根據其後連接的區塊數量計算出其在最長鏈上的概率。

最終的共識指的是,在未來的某個時刻,所有節點都會就一組數據達成一致,但這種最終的共識可能需要很長時間,並且無法確定需要多少時間。但類似GRANDPA (GHOST-based Recursive ANcestor Deriving Prefix Agreement)或以太坊的Casper FFG 之類的確定性工具,可以為區塊的確定性提供更強大的保證。並且在經過拜占庭協議一些過程後,可以形成不可逆的共識,稱為可證明的確定性。

Polkadot為了同時保證概率確定性和可證明的確定性,而採用了BABE(Blind Assignment for Blockchain Extension)和GRANDPA算法相結合的混合共識算法。其中,BABE算法負責區塊的生成,GRANDPA算法則負責區塊鏈中區塊的確定。

1.1 GRANDPA

GRANDPA與其他拜占庭容錯算法的不同之處在於,驗證人是對區塊鏈投票,而不是對區塊投票,所以該算法每輪可以確定好幾個最終區塊。但與其他拜占庭算法一樣複雜度為O(n²),意味著如果節點增加一倍,系統中為了形成共識發送的消息將會增加四倍。 Polkadot將區塊的生成和最終確定性分離,這種方式提高了整個共識系統的效率,提高了區塊生成的效率(BABE為O(n)),並在一輪中可以最終確認鏈上的好幾個區塊。

GRANDPA會選擇驗證人投票數最多且可以被認為是最終區塊的最高區塊號,以Kusama節點中的日誌為例:

Polkadot異構跨鏈安全性分析:在Web3構造不同的平行鏈,如何守住共同的安全線?

發現上一輪中,GRANDPA最終確定了三個區塊(664254到664256),這三個區塊可能的情況如下:

Polkadot異構跨鏈安全性分析:在Web3構造不同的平行鏈,如何守住共同的安全線?

上圖中左側深灰色方塊是之前被最終確定的區塊,右側的灰色橢圓形代表驗證人,驗證人給新一輪候選區塊投票,確定了其中三個候選區塊。可以發現,使用GRANDPA算法確定的區塊所在鏈可能包含分叉。

具體的算法過程為:

1、被指定為“主節點”的節點,將廣播該輪可以被最終確定的最高候選區塊;

2、每個驗證人為自己認為的最高候選區塊“預投票”;

3、每個驗證人將根據投票集,計算出最終確定的最高區塊。如果預投票集延長了之前已經被最終確認的區塊鏈,則所有驗證人將該鏈進行“預提交”;

4、所有驗證人等待接收到足夠數量的“預提交”,在新確定的鏈上提交消息。

注意,GRANDPA與其他拜占庭容錯算法相比,主要區別為:在關鍵路徑上沒有視圖的變化。儘管該算法每輪都會更新最高區塊,但是視圖更改是在異步網絡下開啟新一輪,因此在部分同步網絡中,即使在未分配最高區塊的情況下,協議也會不斷更新。

1.2 BABE

BABE是一種概率確定性的區塊生成算法,該算法將時間劃分為多個epoch,每個epoch又分為多個slot,最後選擇一個或多個驗證人在每個solt間隔創建區塊。在Polkadot中,每個slot的持續時間為6秒,即Polkadot上的目標出塊時間。

Polkadot異構跨鏈安全性分析:在Web3構造不同的平行鏈,如何守住共同的安全線?

每個solt由可由驗證隨機函數VRF(verifiable random function)生成一個主領導者,該函數將epoch隨機種子、slot編碼和創建者的私鑰作為輸入,使得每個節點可以為每個slot生成唯一的偽隨機值。如果存在低於某個指定閾值的slot,則驗證者有權在該slot中創建區塊。這種方式安全性較高,但是容易出現某些slot沒有領導者,而有些slot有多個主領導者的情況。

Polkadot異構跨鏈安全性分析:在Web3構造不同的平行鏈,如何守住共同的安全線?

slot存在多個驗證人:所有驗證人都會產生一個候選區塊並將其廣播到網絡,最先被網絡中大部分節點接收到的區塊獲勝。

slot沒有驗證人:Polkadot會在後台通過round-robin方法選擇一個驗證人,由其生成一個次級區塊。因此,solt必然存在一個區塊,主要區塊或者是次級區塊。在臨時性分叉的鏈中,既可能存在主要區塊,也有次級區塊。

1.3 分叉選擇算法

當系統中存在分叉時,BABE將在GRANDPA最終確定的鏈後繼續出塊,當最終確定的鏈上存在分叉時,BABE將選擇包含最主要區塊的鏈。

Polkadot異構跨鏈安全性分析:在Web3構造不同的平行鏈,如何守住共同的安全線?

如上圖所示,黑色區塊代表已經被GRANDPA最終確認的區塊,黃色區塊代表為完全的區塊。其中,標記為“1”的塊是主要塊,標記為“2”的塊是次級塊。因此,即使最上面的鏈包含最多的區塊也不會被選擇,因為其包含的主要塊最少。但是最後那條鏈即使包含最多主要塊同樣不會被選擇,因為其沒有在GRANDPA最終確定後的鏈上繼續出塊。最終被選擇的鍊為倒數第二條,同時滿足上述兩個條件。

2_ 跨鏈消息傳遞

2.1 XCM

Polkadot擁有三種類型的跨鏈消息傳遞協議: UMP、DMP和XCMP。

其中,UMP(向上消息傳遞)允許平行鏈將消息發送到區塊鏈系統的中繼鏈;DMP(向下消息傳遞)允許中繼鏈將消息向下傳遞到其中一條平行鏈。而XCMP則允許平行鏈之間的消息傳遞。 XCM是一種消息格式用於上述三種跨鏈消息的傳遞。

Polkadot異構跨鏈安全性分析:在Web3構造不同的平行鏈,如何守住共同的安全線?

不使用鏈上原生消息格式是因為,鏈之間缺乏兼容性,如果用戶打算將消息發送到多個目的地系統,則需要針對每個目的系統編寫合約。而且如果目的系統的智能合約升級,區塊鏈可能會引入新功能或更改現有功能,並因此改變其交易格式。為了解決這些問題,Polkadot使用XCM作為一種通用的消息格式。 XCM中包含的“消息”實際上只是在XCVM上運行的程序,該程序由一個或多個XCM指令構成。

2.2 跨鏈消息傳遞流程

下面以Moonbeam和Polkadot之間的資產傳遞為例,介紹生態中的跨鏈消息傳遞過程:

1、首先主要DApp以平行鏈的形式接入,此時中繼鏈上的原生代幣需要在平行鏈上註冊;

2、Alice通過一個XCM希望將其在Polkadot上一定數量的DOT轉移到Moonbeam上的賬戶;

3、Polkadot將執行XCM消息轉移相同數量的DOT到Moonbeam在Polkadot上的賬戶上;

4、當上述資產被成功存入後,XCM信息中的第二部分將被傳送至Moonbeam;

5、Moonbeam將執行XCM包含的指令,在該鏈上鑄造相同數量的xcDOT(DOT在Moonbeam上的映射幣)。

Polkadot異構跨鏈安全性分析:在Web3構造不同的平行鏈,如何守住共同的安全線?

2.3 資產轉移

對於相互信任的鏈(即Polkadot中由同一整體共識和安全保護的平行鏈),可以使用Teleporting框架進行跨鏈資產轉移。基本過程為:在發送方銷毀資產,並在接收方鑄造相應數量的資產。 Polkadot異構跨鏈安全性分析:在Web3構造不同的平行鏈,如何守住共同的安全線?

WithdrawAsset:只有一個參數,類型為MultiAssets,代表哪些資產必須從資產原產地登記冊的所有權中撤出,但未指定放置資產的位置。其中,撤回和未使用的資產都被臨時保存在持有登記冊中,並未永久存儲。

InitiateTeleport :代表中繼鏈在執行指令時,將創建一個全新的XCM消息,並將其發送到目標鏈。

Polkadot異構跨鏈安全性分析:在Web3構造不同的平行鏈,如何守住共同的安全線?

BuyExecution:使用WithdrawAsset提取的資產換取XCM指令的計算時間。 Polkadot社區中的大多數平行鍊為了避免“垃圾交易”和拒絕服務攻擊,都會要求與之交互的用戶支付一定的手續費。但是與以太坊交易模型不同,Polkadot中的手續費並未被包含在協議中,但對於一些確實需要支付手續費得到系統,XCM提供了使用資產購買執行資源的能力。主要包含以下三部分:

1 首先,需要提供部分資產

2 其次,必須協商資產交換獲取到的計算時間(或權重)

3 最後,執行XCM操作

所以該函數包含以下兩個參數:

1、fees:應從持有登記冊中提取並用於支付費用的金額,這只是最大值,因為任何未使用的餘額都會被立即返回。最終花費的金額由系統決定,該變量值只是限制它,如果解釋系統需要為其所需的執行操作支付更多的費用,那麼BuyExecution指令將導致錯誤。

2、weight:指定要購買的執行時間兩,通常該值大於或等於XCM程序的總權重。

DepositAsset:將剩餘的資金存入持有登記冊。實際上,扣除手續費後,我們不知道手上還剩餘多少資產,可以在assets中使用通配符All.into(),將剩餘資產全部存入beneficiary標識的賬戶中,此處該值為Parent.into (),代表中繼鏈的位置。

在跨鏈橋系列文章中,主要介紹了Nomad和Polygon兩大方案中的三種常見跨鏈橋項目類型,下面針對三個項目做個小結:

Nomad Bridge:

採用optimistic-rollup跨鏈技術,由《深度| Web3世界的信任邊界,跨鏈互操作性技術會影響區塊鏈發展的未來嗎?》可知,這種方式會在主鏈合約中維護一個狀態樹的根節點,如:Nomad源碼解析中提交新根時需要同時提交_oldRoot和newRoot,校驗通過後才會更新root值。根節點的安全性是整個跨鏈橋系統的核心,文章中剖析的安全事件就在於初始化該值時存在漏洞造成了巨額損失。

Polygon PoS Bridge:

採用公證人方式進行跨鏈,由源碼分析可知,跨鏈過程中重要的函數調用都是由驗證者指定的特定角色進行,所以其安全性完全取決於PoS的驗證者集合。對於這種類型的跨鏈橋,驗證者節點的私鑰安全就是整個系統的核心。經成都鏈安統計,2022年上半年就發生四起因私鑰洩露造成損失的跨鏈橋安全事件。

Polygon Plasma Bridge:

採用Plasma跨鏈技術,由《深度| Web3世界的信任邊界,跨鏈互操作性技術會影響區塊鏈發展的未來嗎?》可知,其鏈上並不會維護一個狀態樹根節點,除非用戶可以提交欺詐證明,否則默認完全信任Operator提交的根節點,所以存在鏈下數據可用性問題。因此,通常需要將鏈下交易映射到鏈上進行處理,這種映射方式的安全性則是整個系統的核心。例如Polygon Plasma Bridge的雙花漏洞中,withdraw交易就會被映射為一個NFT退款憑證上鍊,但是由於NFT的ID生成算法存在漏洞,造成了一筆withdraw交易可以被映射生成為多個不同的NFT,影響了數億美元。