深入瞭解波卡跨共識消息 XCM(2)

語言: CN / TW / HK

在近期的 Zero Knowledge 播客節目中,Parity 聯合創始人 Rob Habermeier 分享了 XCM 如何允許平行鏈相互通信。本文是該播客的第二部分。

AnnaRose:

有個概念叫碎片化。例如,如果在兩條鏈之間,你用了多個橋去連接相同資產,這些資產在某一端是合成的,那麼如果你有多個版本的橋接資產,就可能會導致碎片化。這樣可能會出現有趣的套利機會,但我認為這也削弱了很多東西。你們有一個儲備的概念,是不是説在 Statemine 上可能會有 USDC,然後其他鏈可以直接通過 XCM 使用它,而不是通過其他橋,這有點像是網絡中的規範 USDC。你們是這樣設想的嗎?

Rob:

是的,差不多。我們以 USDC 作為例子,各條鏈獲得的本質上是 Statemine 上對 USDC 的聲明,那麼你就不需要有 USDC 的各種包裝過的(Wrapped)版本,只需要把 Statemine 作為 USDC 代幣的可信儲備。

AnnaRose:

但是如果有其他橋存在,也還是會遇到同樣的問題。就像如果你用另一個橋橋接來自以太坊的 USDC,你又有它的 Statemine 版本,兩種 USDC 都來了,那麼你在平行鏈 X、Y、Z 上還是會有同樣的碎片。

Rob:

我猜是會有這種情況的。這是市場需要處理的問題。

AnnaRose:

如果你有多個樞紐,會出現問題嗎?就像你在 Statemine 中有某種規範的資產,它會移動到平行鏈 A,然後使用 XCM 將它更進一步移動到另一條鏈。這些樞紐是否造成了一些問題,還是説它總是以某種方式指向原始來源?

Rob:

是的。這種應用的工作方式是,你總是會接觸到 Statemine/Statemint 鏈的基礎。所以任何樞紐實際上都是接到儲備資產然後再出去的,而不是從一條鏈直接接到另一條。傳送不是這麼運作的,但在儲備資產轉移中是這樣的。

AnnaRose:

好的。而且你提到了可信傳送者,這是否意味着平行鏈本身是受信任的,是不是你將一些平行鏈列入傳送白名單,但可能還有其他你未列入白名單的平行鏈仍在傳送東西,你只是不認可而已。我其實不明白你如何讓它可信。

Rob:

好吧,舉例來説,在 PolkadotKusama 生態系統中, DOTKSM 的可信傳送者鏈是我們所説的系統級公共利益鏈,例如 Statemint/Statemine,所以只有它們是 Polkdadot 治理信任的可以正確地鑄造和銷燬 DOT/KSM 的鏈。

你或許可以建立某種側通道或其他方法,XCM 的其他功能之一是你可以從一個鏈到另一個鏈進行任意函數調用,所以你可以想象兩條鏈建立一個協議,他們通過這個協議鑄造/銷燬彼此的代幣。這取決於生態平行鏈的治理,治理可以決定他們信任哪些其他生態來正確鑄造和銷燬他們的代幣。這就是我説的 “可信” 的意思,也就是除非通過了發行鏈的治理的同意,否則不允許這樣做。

AnnaRose:

我不明白這個過程發生在哪裏。這個規則是內置在 XCM 中的嗎?比如它説這些平行鏈可以做出這個選擇,或者是説平行鏈本身可以決定這個,並排除其他鏈。而且我不明白他們如何排除其他鏈。

Rob:

這主要取決於代幣的分類是什麼。因為代幣,例如平行鏈上的一些代幣,通常用於發行鏈上的某種服務或流程。重要的是,你在另一條鏈上擁有的代幣,是通過一系列操作,對存儲在發行鏈上的那些服務或基礎資產的有效聲明。為此,對於發行鏈,最終必須將外鏈代幣識別為自己的。那麼,如果是通過儲備的方法,那麼它總是跟蹤餘額並確切地知道每個其他鏈有多少。如果是傳送,比如某個鏈來找我説,“我有一千個你的代幣,我想傳送過來”。你沒有權力這樣做,我不認這些代幣。這意味着存在於另一條鏈上的代幣實際上毫無價值,它們其實並不對應於對服務或資產的聲明。

AnnaRose:

但你們怎麼阻止這種情況呢?我是在想,如果它是一個智能合約平行鏈,並且可以創建一個智能合約,這就像充當橋的一側。可能這就是我理解錯了的地方,我一直認為它像智能合約一樣,在另一邊也有一個智能合約,兩者可以互相交談,但實際上可能 XCM 的運作方式不同?是不是我對傳送者的工作方式理解錯了?

Rob:

首先,你可以在 XCM 上構建任何類型的協議,因為它支持任何圖靈完備的函數調用。它能做的一件事就是支持費用支付機制,就像在其他鏈上支付 gas 費一樣。但説到儲備資產和傳送資產,在 XCM 中什麼是優先的。我們用 Substrate 處理鏈設計的方式是模塊化,你有不同的組件,比如一個智能合約執行組件、一個治理組件等,打包在一起就形成了你的鏈,而其中一個組件就是 XCM 執行器。

XCM 實際上是一種編程語言,它不是圖靈完備的編程語言,但的確是一種編程語言。還有一個跨共識虛擬機 XCVM,來執行這些指令。當你讓一條用 Substrate 編寫的鏈使用 XCM 時,你所做的是將 XCVM 連接到你的鏈,並使其成為你的鏈的一部分。你説 “這是處理傳入 XCM 指令的東西,它會執行其他鏈給它的命令”,然後我會繼續傳遞其中的一些內容。就像對於這個函數調用,你可能會創建某種自定義適配,比如 “將函數調用視為智能合約調用”,或者你可能會説 “將它們視為買單”/“將它們視為賣單” 等等。所以它是可插拔的,你可以將自己的邏輯插入其中,你可以將這種基礎級別的虛擬機引入你的鏈中。

AnnaRose:

XCM 或 XCVM 是否內置有白名單和黑名單,它是否已經決定了 “這是一個平行鏈,這是一個原生平行鏈代幣,它們被允許存在於這些地方”。我覺得應該不是吧,我想象它應該是更無需許可的?有點像每個鏈都可以決定他們覺得誰是值得信賴的傳送者。我只是不明白為什麼你無法將這些代幣注入到這個新的平行鏈中,具體是如何防範的?因為它似乎是無需許可的。

Rob:

這是一個很好的問題。它是關於一條鏈如何引用和識別另一條鏈的解決方法。所以有一個來源的概念,即消息的發起者。如果你只看一個智能合約系統,來源就是它的賬户。在以太坊上,它們被稱為 20 字節十六進制字符串,要麼是公鑰的哈希,要麼是一堆合約創建參數的哈希。那麼現在,當你談論從其他鏈接收消息時,你需要知道從哪個鏈,以及從該鏈上的哪個賬户接收消息,這就是你進行許可的方式。如果你收到一條消息,你將驗證某些來源來做不同的事情。

來源系統的工作方式有點像文件路徑或 URL。有一種通用的來源,有點像是整個世界。然後你在其中有共識機制,比如 Polkdadot 或 Kusama,就像主權區域。然後下面有平行鏈,再下面有賬户。在鏈如何確定它們自己的來源上,是比較靈活的,比如它們鏈上的來源有什麼,取決於它們自己。你可以讓智能合約成為鏈的有效來源,因為這只是他們自己的鏈的一個子來源。XCMP 的職責之一是維護來源 —— 某條消息來自平行鏈 A,並通過 XCMP 發送給平行鏈 B,平行鏈 B 接收數據和消息的來源。

你也可以有相對來源。比如我要提到我的鄰居,我不需要説哪個國家、哪個城鎮、哪個郵編,我只用説 “就是住在和我隔了三個房子的 Joe”。所以你可以對來源做同樣的事情,即相對來源,比如 “這是來自你影響範圍內的平行鏈 X”。

説回到鏈實際上如何禁止傳送,本質上他們可以做的是他們可以配置允許哪些來源將資產傳送給他們。所以我會説 “我相信 Joe 會在他那邊銷燬代幣並將它們發送給我”。但是,如果我從 Bob、Alice 或 Eve 那裏收到一條消息,上面寫着 “嘿,我這邊已經銷燬了代幣了,快把這筆記到你的賬户上”。我會説 “我從來沒有把我家的鑰匙給過你們啊,你誰啊?”

Joe 沒有權力給 Alice、Bob 或 Eve 我的鑰匙。這種許可是不可傳遞的,因為最終這些代幣必須在我的鏈上可回收。現在 Joe 可以做一些傻事兒,所以 Joe 有能力在他那邊銷燬和鑄造代幣。他可以創建一個系統,在這個系統之上還有更多的代幣和衍生品,允許其他鏈參與,但這是 Joe 的事兒。如果我們覺得 Joe 沒有能力在這方面做得很好,那麼我們一開始就不應該賦予他鑄造和銷燬代幣的能力。

AnnaRose:

但是,萬一 Joe 真的做得很差,衍生品脱離了他的控制,這些衍生品到處都是了。是不是像另一條鏈可以去領取衍生品,然後拿回你這邊説 “這是從 Joe 那裏拿的”,會不會有這種互相關聯的來源?原平行鏈真的能夠識別出這個來源是惡意的嗎?或者説它會接受嗎?比如它是基於衍生品的衍生品,是合成的資產,但它來自 Joe 那裏。

Rob:

我覺得你的問題可能是,他們可以欺騙 Joe 去做錯事嗎?因為其實如果有人來找我説,“嘿,我有你代幣的衍生代幣,請把你的代幣記入我的地址”。我不會照做的,因為那是不同的代幣。所以他們只能去欺騙 Joe 用這些衍生品做錯事。但是你其實可以有其他防禦措施,比如最早就跟蹤代幣的總髮行量,保證它永遠不會超發,不會有無限印鈔的情況。

如果你使用基於傳送的系統的話,一旦這個東西進入更廣的、複雜的、圖靈完備的生態,你無法一直跟蹤到誰在哪裏 claim 了什麼東西。這就是為什麼傳送應該只在極少數情況下使用,默認的做法應該是始終保持儲備餘額。平行鏈可能會成為它自己的代幣的儲備鏈,這是我們看到在興起的模式;對於在其他鏈上發行的、不是該鏈的主要代幣的二級代幣,你可以使用 Statemint 或 Statemine,或者用智能合約來儲備自己鏈的資產。

AnnaRose:

我在想是否有像 ERC-20 這樣的東西,是不是有 XCM-20?

Rob:

有 XC-20。

AnnaRose:

如果這些現有的平行鏈上有類似 ERC-20 的東西怎麼辦?所以對平行鏈來説,它們有自己的儲備和基礎代幣。但是,如果你在它之上構建東西,這是否會產生更多問題?還是説儲備金仍然可以存在於部署它的第一條鏈上?

Rob:

這其實是一個設計決策,取決於智能合約的開發者。但我們看到一些標準已經開始出現,比如 ERC-20 加上額外的東西,這對於讓代幣與 XCM 環境和跨鏈原生類型更兼容是必要的。但任何方法都有優點和缺點。如果你使用智能合約作為儲備金,你最終可能會為 gas 支付更多費用。而如果你有一個專門用於儲備的鏈,儲備操作會相對便宜,但它們存在於代幣的實際邏輯之外的其他地方。所以這些是跨鏈 App 開發者必須做出的決定。

AnnaRose:

我在努力地去跟上你的思路。可能是我之前做了太多采訪了,我總是想像它像橋一樣,就像從 A 點到 B 點,但在波卡中它是與整個共識捆綁在一起的,不僅僅是一條消息,不僅僅是一個代幣轉移。你能幫我梳理一下,消息是如何從一側到另一側,然後返回的嗎?

Rob:

這是我們區分消息傳遞層和消息本身的原因之一。

AnnaRose:

順便説一句,我知道我一直都混淆了 XCM 和 XCMP,我得對聽眾説抱歉。

Rob:

這就是為什麼我們在考慮改掉這個名字。這就是為什麼做出這些決定很重要的原因,因為無論何時你對任何東西進行工程設計,都會用到黑箱。你需要了解你的工具,它們的作用,而不一定要了解它們如何工作的所有複雜細節。

從開發應用的人的角度來看,一條消息具體是如何傳遞的並不重要,你只關心它是否到達,它到達的速度,以及你必須為此支付多少費用。而這些東西都抽象到了 XCMP 協議中,我們保證消息確實會到達。除了在某些極端情況平行鏈出現故障的情況下,比如平行鏈的租約結束了且不再續租,或者他們關閉了通道,那麼在最後的一些消息可能會被丟棄。但在大多數情況下,只要兩條鏈都啟動了並且通道仍然打開,那麼消息就會到達,並且會在幾個區塊內到達。

所以你可以有任何類型的確認或回調或任何你需要在協議之上構建的東西。所以關於 XCM 的一個很酷的地方是,正如我所提到的,它是一種編程語言,所以你可以寫 If-Then,或者 If-Then-Else ,即我會嘗試做這件事,然後如果它成功了,我會做另一件事,也就是發回一條消息。或者你可以做 Else,即如果它失敗了,那麼就做另一件事。你可以將這些需要在某些遠程鏈上執行的長條件指令序列串在一起。所以本質上就像你正在對另一條鏈進行編程來做某些事情,並且可以在此之上構建一堆更復雜的協議。

AnnaRose:

哇,那是不是意味着你不必在兩端都編程了?我顯然還是習慣用智能合約的模式思考,是不是類似於你有一個智能合約平台,你已經創建了一個合約,它與 XCMP 交互。你可以在這個裏面編程,讓它在另一條鏈上做某件事,但你不用在另一套鏈上部署什麼東西。你是不是也可以僅使用這套編程語言去另一條鏈上做一些事情,並帶回你需要的任何東西。

Rob:

你可以用它來做很多事情,現在它還不是圖靈完備的。造成這種情況的原因之一是費用支付,因為這樣你就可以提前預測,你實際上需要向另一條鏈支付多少,才能執行你發送的所有指令,但你可以構建僅使用 XCM 的多功能應用程序。

AnnaRose:

無需在另一條鏈上部署某些東西。

Rob:

對。我的意思是,這就是它的目的,因為如果我們看看我們的設計理念,我們不希望每條鏈都有智能合約。那麼你需要有方法,去在不是智能合約平台的鏈上執行條件邏輯。

對於本身就是智能合約平台的鏈,你可能有不太複雜的 XCM 程序來與它們互操作,因為邏輯可以由你在接收鏈上發送消息的智能合約處理。但對於那些只是做基本的事情的鏈,你可以利用 XCM 來實現與那些確實有條件的鏈的更復雜的交互。