在近期的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:
好吧,舉例來說,在Polkadot 和Kusama 生態系統中,DOT 和KSM 的可信傳送者鍊是我們所說的系統級公共利益鏈,例如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 來實現與那些確實有條件的鏈的更複雜的交互。