主頁 > 前端設計 > Polkadot|茶溪岸啤(XCMP),再來一杯!

Polkadot|茶溪岸啤(XCMP),再來一杯!

2020-10-01 15:15:58 前端設計

導讀:上一篇文章Polkadot 茶溪岸啤(XCMP),干杯!主要介紹了XCMP一些基本內容,還有XCMP訊息路由方式,

「總體而言,XCMP主要分為2部分:XCMP訊息的分發、XCMP訊息的存取」,本文主要就是介紹XCMP訊息的存取,

文末答題有驚喜:剩下3道題目準備好接招了嗎?

如果上篇文章的內容你大致都能看懂,恭喜你,已經很厲害了!!

但是,請做好心理準備,因為接下去的內容將更加復雜,我們將用盡可能清晰的方式來解釋,

XCMP訊息的存取

當接收鏈接收到訊息后,接下去要進行的流程是:處理訊息,然后將訊息及相關證明放進新塊構建好后交給驗證人,并最終確認出塊,這個流程是比較復雜的,涉及到的新資料結構也很多,

先來看看一些接下去要用到名詞的解釋:

Para X

表示平行鏈X或者平行執行緒X,

因為平行鏈要接入Polkadot需要購買一個專用插槽Slot,Slot數量少且貴,所以更精益的方式是使用平行執行緒,平行執行緒接入Polkadot不需要專門購買一個Slot,而是按塊付費,平行執行緒與平行鏈在開發上基本上一樣,而且也能使用Polkadot的各種功能,

平行鏈

當我們說平行鏈的時候,其實是指由平行鏈收集人節點構成的區塊鏈網路,如果提到了驗證人,一般會專門指出這是驗證人節點,

好,接下去我們借助一張看起來有點復雜、但其實比較清晰的圖來講解XCMP訊息的存取,

在這里插入圖片描述

上圖是我們自己總結的XCMP訊息存取的全景圖,基本上概括了XCMP訊息存取的全部內容,

圖中描述了Para B要給Para A發送訊息 m2020,雖然Para還可能表示平行執行緒,但接下去以平行鏈為例(平行執行緒也是類似的)來解釋這張圖,闡述XCMP的訊息存取流程,

在平行鏈B要向平行鏈A發送XCMP訊息前,首先要開一個鏈B通向鏈A的通道(Channel),然后接下去的流程是:

  1. 平行鏈B發出訊息 m2020(放至出口佇列),并在新出的塊 (假設為#3號塊) 中包含了此訊息,

  2. 平行鏈B作為發送鏈,會維護對每個接收鏈的一條MQHC(Message Queue Hash Chain),可以看成是一種鏈表(如圖中,平行鏈B到A、C、D、E都建立了通道并發送過跨鏈訊息,所以平行鏈B有4條MQHC),

MQHC鏈的每個元素對應于一條跨鏈訊息,元素的結構是一個三元組(parent_hash、message_hash、block_number),parent_hash是該元素的父元素的哈希,message_hash跨鏈訊息的哈希,block_number是父元素訊息發出時的中繼鏈區塊號(可以當做全域時間來用),

平行鏈B的所有MQHC(這里是4條)的鏈表頭元素會作為Merkle樹的葉節點從而構成一棵樹,樹根是Message Root,簡稱MR,MR具有非常牛逼的作用,如果你有了MR,再加上到某個MQHC元素的Merkle路徑,就能驗證MQHC上的元素,再加上發送鏈的訊息佇列里的訊息原文,你就能驗證所有已經發送、但沒有被處理的所有訊息,

MR會存盤到平行鏈B的區塊頭里(這里剛好是#3號塊的區塊頭),#3號塊的區塊頭除了有MR,還有bitfield、watermark這兩個也是和XCMP相關的資料,

bitfield是一個位域陣列,每一位的含義是發送鏈對該位表示的接收鏈在本塊中是否發送了跨鏈訊息,假設bitfield 的1-4位表示鏈B對鏈A、C、D、E的跨鏈訊息發送情況,則區塊頭里的bitfield =1111說明這個區塊包含了對這四條鏈的跨鏈訊息,

watermark可以理解為跨鏈訊息的序號,不過這個序號不是一維的,而是二維的, watermark的結構為(block_number,para_id),block_number中繼鏈的區塊號,para_id是平行鏈的id,兩個watermark組成的區間就可以確定一個訊息集合,比如,若w1=(100,A),w2=(300,A),則區間[w1,w2) 表示在中繼鏈#100號區塊到#300號區塊這段時間里,鏈B對para_id=A的這條鏈發送的所有訊息,

  1. 當平行鏈B將訊息m2020包含進區塊并最終被驗證人驗證確認后,其區塊頭會存盤到中繼鏈的區塊中(如本例中B的#3號區塊頭),這樣一來,中繼鏈就拿到了鏈B的#3號塊的MR,bitfield、watermark三個關鍵資料結構,根據這三個資料結構,中繼鏈就會做一些有趣的事情,

  2. 中繼鏈上有一個資料結構叫做CST(Channel State Table),中繼鏈于是會使用該新提交的平行鏈區塊頭里的MR去更新自己的CST里相應的一行,

CST的作用是跟蹤某條發送鏈對某條接收鏈所發送的訊息的狀態,從而提供某個通道的MQHC的鏈表頭的證明(proof),

CST作為一張表,其行標是發送鏈的ID,列標是接收鏈的ID,每個表項其實可以表示一個通道,表項的結構是一個二元組(sender_mr,block_number),易知通過表項的block_number +列對應的para_id可以得出watermark,sender_mr表示該通道的最新mr,block_number為該表項上次更新時的中繼鏈區塊號,

CST其實是按行來進行存盤的,一行中會有很多表項;因為是同一行所以這些表項的發送鏈都相同;而因為發送鏈都相同,同行的表項里的最新MR也都相同,因此當新的平行鏈區塊頭到來時,CST是按行進行更新的,

CST其實除了一張表外,還有第二部分是映射(para_id => row_root),row_root是CST的行里的表項構成的Merkle樹的樹根,這樣,某一行只要有一個表項變化了,其row_root就會變化,

row_root會作為葉子繼續構出一棵Merkle樹,其根為XCMP_Root,其會關聯至中繼鏈的狀態根(State Root),

  1. 當平行鏈A開始構建新PoV區塊時,將會需要其所有訊息的proof,

鏈A需向中繼鏈獲取:以A為發送鏈的MR的light client proof,以A為接收鏈的所有通道的watermark的light client proof,而且這些proof需要同時構建,這樣這些proof都能基于中繼鏈的同一個State Root;light client proof是通過Merkle proof轉化而成的,

因為中繼鏈狀態根(State Root)路徑到CST的表項其實要分2部分,先從State Root到row_root,再從row_root到表項,所以從State Root到表項里的MR的整個Merkle proof被稱為「Nested Proof」,

某個通道的最新訊息根MR可以通過中繼鏈能夠獲取,MR的作用在前面提到過,MR 、MQHC鏈表頭的Merkle root、MQHC、對應訊息的原文這四樣東西能驗證這個通道目前未被處理的訊息,這樣,本次構建區塊就會把目前還沒有處理的訊息都處理下,

因此,鏈A還需要所有訊息的從MR到MQHC元素的merkle root,以及訊息的原文,

這樣,包含訊息哈希的MQHC元素——訊息根MR ——MR構成的CST表項—— CST的row_root ——State Root,就能整合成一個總的proof,從中繼鏈狀態根State Root到跨鏈訊息的哈希,

最后PoV區塊里需要包含內容有:所有的訊息原文,及其對應的MQHC元素,及其整個的proof,

另外還有一些細節:

1)平行鏈的狀態里不光要存盤MQHC的鏈表頭的Merkle proof,還要存盤MQHC所有元素的Merkle proof(它們也曾當過鏈表頭),

2)如果確認訊息被執行,則MQHC里的鏈表可以丟棄已經執行過的訊息的對應元素(但不一定要求立即丟棄,因為可以多存一會起到冗余的作用),

對上面第5點——平行鏈PoV區塊的構造,Polkadot官網上有一個簡例,
在這里插入圖片描述

以上面這張圖中的鏈B為例,鏈B給鏈A發送了跨鏈訊息,且通過Channel State Table可知,鏈A上一次處理鏈B發過來的訊息的時間是中繼鏈塊號位rc_1的時候,上一次的watermark1為(rc_1, A),而當前的watermark2為(rc_6, A),

假設鏈A要出新塊,其要把[watermark1,watermark2) 之間的跨鏈訊息都進行處理,鏈A出塊需要的資料有(以下的1、2、3就是構成整個的proof):

  1. 中繼鏈State Root到CST row_root的Merkle proof(紅色部分);

  2. CST row_root到 (MR,block_number) 構成的表項的Merkle proof(藍色部分);

  3. MR到MQHC鏈表頭的Merkle proof(橙色部分);

  4. 所有訊息對應MQHC的元素(圖中左下方綠色矩形);

  5. 所有訊息的原文(圖中左下方綠色信封);

最后當平行鏈構造完PoV區塊后,驗證人會對其進行驗證,驗證通過則完成出塊,然后區塊頭會上到中繼鏈,中繼鏈更新狀態,而發送鏈通過查詢中繼鏈也能知道自己發出的訊息最終被處理完成了,

總結

本次Polkadot XCMP的干貨文章到此就結束了,這杯茶(X)溪(C)岸(M)啤(P)的味道如何?

XCMP的內容,尤其是本篇中講到的XCMP訊息存取部分,還是比較復雜的,用到了很多新創造的概念,比如訊息哈希鏈表(MQHC),以及各種型別的Merkle樹(訊息樹、CST Item構成的樹、CST Row構成樹、狀態樹等等),確實很難一次性看懂,建議大家多看幾遍(劃重點:可以仔細看看我們畫的那張XCMP訊息存取的圖),

之所以設計得這么復雜,是為了XCMP的設計目標:快速、有序、可驗證、無遺漏,

XCMP的設計主要分為XCMP訊息分發和XCMP訊息存取,現在我們回顧下,Polkadot是否實作了其設計目標:

訊息分發:通過平行鏈直接直接發訊息,而不中繼鏈達到了快速√,

訊息存取:通過watermark及其相關機制達到有序√、無遺漏√的目的;通過MQHC、各種Merkle樹及Proof做到了可驗證√,

綜上,Polkadota XCMP的設計大致是完成其目標的,但也因為XCMP設計比較復雜,目前還在實作中,未來可能會有一些變動,讓我們共同關注,

課后小習題

一共準備了5個小題目

(都是單選,包括了上篇文章的2個題目,把你的答案集齊5個給桔子,前五名全對的小伙伴有驚喜好禮哦😯)

  1. 以下內容中,不是Polkadot XCMP設計的目標的是?

【A】快速

【B】消除跨鏈訊息的「饑餓」現象

【C】高效

【D】可驗證

  1. 根據本文內容,目前在Polkadot XCMP不可能發生的訊息路由方式的是?

【W】發送鏈將跨鏈訊息發送給一個自己的全節點,該全節點轉發至接收鏈

【X】接收鏈的收集人去找發送鏈的釣魚人拿跨鏈訊息,然后在本鏈的網路中gossip這個訊息

【Y】發送鏈將跨鏈訊息發送給一個中繼鏈的全節點,該中繼鏈全節點轉發至接收鏈

【Z】接收鏈的驗證人主動去找發送鏈的驗證人拿跨鏈訊息,然后在本鏈的網路中gossip這個訊息

  1. 下列關于MQHC的說法錯誤的是?

【H】 MQHC會存盤在平行鏈的區塊頭里,而且因為平行區塊頭上中繼鏈,所以中繼鏈也會存盤MQHC

【I】 MQHC是指Message Queue Hash Chain,MR是指Message Root

【J】MQHC的鏈表頭作為葉節點構成的樹的樹根為稱為訊息根Message Root

【K】 當擁有MR、MQHC鏈表頭的Merkle Proof、MQHC鏈表頭、鏈表頭包含的訊息原文時可以證明鏈表頭里的訊息原文的存在性和正確性

  1. 下列關于CST的說法正確的是?

【L】CST的全稱是Channel Send Table

【M】CST是按列存盤的,每一列的表項對應相同的接收鏈

【N】CST除了一張表外,還有第二部分映射(para_id => row_root),其中row_root會作為葉子繼續構出一棵Merkle樹,其根為XCMP_Root

【O】當新的平行鏈區塊頭到來時,中繼鏈會根據區塊頭里的交易樹的樹根去更新CST

  1. 關于接收鏈進行PoV區塊的構建的下列說法中錯誤的是?

【A】中繼鏈狀態根(State Root)路徑到CST的表項分為2部分,先從State Root到row_root,再從row_root到表項,因此從State Root直接到表項里的MR的整個merkle proof被稱為「nested proof」

【B】PoV區塊出塊是一步完成的,沒有比較明顯先構建、再驗證確認的分割階段

【C】基于State Root的那些proof需要在同一時刻構建,這樣這些proof才能基于中繼鏈的同一個State Root

【D】PoV區塊里需要包含內容至少有:所有的訊息原文,及其對應的MQHC元素,及其整個的proof

5題全對的前五名小伙伴

會有好禮相送喲!

作者簡介
樓嵩
來自致力于「構建區塊鏈互聯網路,打通價值孤島」的BitXHub團隊
研究方向:Web3+

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/145526.html

標籤:其他

上一篇:加密貨幣登上央視, Filecoin沖擊新風口!

下一篇:2020-09-30 English article to remember

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more