歡迎大家來到 Beosin 出品的 “跨鏈橋安全研究” 系列文章,在上一篇文章裡(跨鏈橋安全研究 (三) | 多邊形戰士 Polygon 安全透析,如何預防 “潘多拉魔盒” 的開啟?),我們詳細對 Polygon 跨鏈橋協議進行專業的技術分析。今天,Beosin 團隊將 Polkadot 生態進行安全透析

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

混合共識

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 算法則負責區塊鏈中區塊的確定。

GRANDPA

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

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

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


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

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

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

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

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

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

BABE

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

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

  • slot 存在多個驗證人:所有驗證人都會產生一個候選區塊並將其廣播到網絡,最先被網絡中大部分節點接收到的區塊獲勝。
  • slot 沒有驗證人:Polkadot 會在後台通過 round-robin 方法選擇一個驗證人,由其生成一個次級區塊。因此,solt 必然存在一個區塊,主要區塊或者是次級區塊。在臨時性分叉的鏈中,既可能存在主要區塊,也有次級區塊。

分叉選擇算法

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

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

跨鏈消息傳遞

XCM

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

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

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

跨鏈消息傳遞流程

下面以 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 中由同一整體共識和安全保護的平行鏈),可以使用 Teleporting 框架進行跨鏈資產轉移。基本過程為:在發送方銷毀資產,並在接收方鑄造相應數量的資產。

WithdrawAsset:只有一個參數,類型為 MultiAssets,代表哪些資產必須從資產原產地登記冊的所有權中撤出,但未指定放置資產的位置。其中,撤回和未使用的資產都被臨時保存在持有登記冊中,並未永久存儲。
InitiateTeleport :代表中繼鏈在執行指令時,將創建一個全新的 XCM 消息,並將其發送到目標鏈。

BuyExecution:使用 WithdrawAsset 提取的資產換取 XCM 指令的計算時間。Polkadot 社區中的大多數平行鍊為了避免 “垃圾交易” 和拒絕服務攻擊,都會要求與之交互的用戶支付一定的手續費。但是與以太坊交易模型不同,Polkadot 中的手續費並未被包含在協議中,但對於一些確實需要支付手續費得到系統,XCM 提供了使用資產購買執行資源的能力。主要包含以下三部分:
1 首先,需要提供部分資產 2 其次,必須協商資產交換獲取到的計算時間(或權重)3 最後,執行 XCM 操作所以該函數包含以下兩個參數:
1、fees:應從持有登記冊中提取並用於支付費用的金額,這只是最大值,因為任何未使用的餘額都會被立即返回。最終花費的金額由系統決定,該變量值只是限制它,如果解釋系統需要為其所需的執行操作支付更多的費用,那麼 BuyExecution 指令將導致錯誤。
2、weight:指定要購買的執行時間兩,通常該值大於或等於 XCM 程序的總權重。

存款資產:

將剩餘的資金存入持有登記冊。實際上,扣除手續費後,我們不知道手上還剩餘多少資產,可以在 assets 中使用通配符 All.into(),將剩餘資產全部存入 beneficiary 標識的賬戶中,此處該值為 Parent.into(),代表中繼鏈的位置。
在跨鏈橋系列文章中,主要介紹了 Nomad 和 Polygon 兩大方案中的三種常見跨鏈橋項目類型,下面針對三個項目做個小結:

游牧橋:

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

多邊形 PoS 橋:

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

多邊形等離子橋:

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

免責聲明:作為區塊鏈信息平台,本站所發布文章僅代表作者及嘉賓個人觀點,與 Web3Caff 立場無關。本文內容僅用於信息分享,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。