Web3.0落地的必由之路:區塊鏈的可擴充套件性和互操作性

買賣虛擬貨幣

本文為萬向區塊鏈蜂巢學院第十三期,Parity亞洲區技術總監、區塊鏈和資訊保安技術專家賈瑤琪博士的演講內容(整理自現場速記)。賈博士在演講中介紹了Web3.0的定義和應用,並分享了實現Web3.0的技術和手段。

大家好!我是賈瑤琪,Parity亞洲區工程總監,主要負責技術研發和Substrate開發者生態建設。今天我將和大家分享區塊鏈裡難度比較大但很有意思的兩個話題,一個是可擴充套件性,另一個是互操作性。今天講的內容更偏技術一些,我會舉一些例子幫助大家去理解裡面的技術細節。

Web3.0定義和應用

Web3.0是目前一個比較熱門的概念,許多從事區塊鏈行業的人也會認為自己開發的應用是面向Web3.0的。究竟什麼是Web3.0呢?Web3.0有很多不同的定義,上圖採納了其中的一個。Web1.0時代,網頁是隻讀的,使用者只能蒐集資訊,瀏覽資訊。Web2.0時代是社交網路的時代,像臉書、推特、人人、新浪、微信,以及最新的快手、抖音等等。作為使用者的我們不僅可以瀏覽,還可以自己建立內容並上傳到網上。Web3.0更往前一步,除了可以釋出內容,未來可以去做更多去中介化的事情。這樣就不得不提到其中需要的一些方法,包括一些理念。

Web2.0時代資料被大公司控制,像谷歌、臉書以及亞馬遜。當你使用他們的服務的時候,協議中寫明可以免責使用你的資料。雖然谷歌早期的slogan是don’t do evil, 但是有時候卻把自己的資料提供給第三方。在Web 3.0的時代,我們不需要他們保證don’t do evil,而是透過程式碼使他們can’t do evil。

Web3.0時代,為了實現願景,需要什麼樣的技術呢?區塊鏈是一個基礎。區塊鏈可以提供的特性,一是不可篡改,二是公開透明,三是點對點的網路。

再具體到一些細節如Web3.0技術棧,簡單的可以劃分為這幾層,最上層是客戶端,比如去中心化的瀏覽器。在這之下包含了一些協議支援的開發工具,對應API和特定程式語言。臉書的Libra有自己的程式語言Move,以太坊也有自己的程式語言Solidity。再下一層是Layer2的協議,比如說Governance、State channels等。一個區塊鏈應用不能隨意獲取網際網路上的資訊,比如說想看天氣預報,區塊鏈不能直接提供這樣的資料,這裡我們就需要Layer2協議棧中預言機協議,透過協議本身預言機機制獲取網際網路上的資訊放在區塊鏈上。Layer1協議,就是廣為人知的區塊鏈底層協議,比特幣、以太坊等各種各樣的公鏈,聯盟鏈都採用了類似的底層協議,它提供了支撐整個Web3.0願景的基礎。再往下是網路層,如P2P網路傳輸。

有了這樣的技術棧,才使得web3.0之路變得更加現實。在眾多的Layer1協議中,Polkadot的跨鏈協議擁有很多優勢,比如共享安全、互操作性等。Polkadot本身是基於Parity開源的Substrate開發的。Substrate作為一個通用的區塊鏈開發框架,既可以用來開發Layer1協議如跨鏈操作,也可以用來實現Layer2協議如預言機。

基於以上介紹的技術棧實現的早期應用有哪些呢?上圖列出了一些典型的的Web3.0應用。除了大家熟悉的公鏈系統外,還有一些網路協議層的專案,更多的位於應用層,例如去中心的金融服務如借貸。但對於非區塊鏈領域的使用者,有沒有真正的主流應用呢?目前其實沒有。是什麼導致現在沒有主流的應用呢?在這裡舉幾個例子進行解釋。

案例一,以太小怪獸。這是一兩年前在以太坊上特別流行的遊戲應用。它的方法跟電子怪獸一樣,你去購買這樣一個怪獸去跟其它的怪獸進行打鬥,如果贏的話可以升級。遊戲在初期很火爆,但是後來發現這個遊戲太花錢了。如果把一個小怪獸升到四級要花15美金的交易費,一直支撐他打怪獸或者進行訓練。

案例二,以太貓。一兩年前比較火爆,大家可以購買各種各樣的加密貓,兩個加密貓可以再生成一個新的加密貓。最火爆的時候,有的加密貓價值十萬美金。但是也有問題。玩兒的人越多,手續費增加越高,因為以太坊的吞吐量只有這麼多,如果大家想玩,需要用更高的手續費買到這樣一個加密貓,同時出生費也相應增加。現在加密貓應用已經淡出人們的視線。

總結出來的一個結論是,目前對於區塊鏈行業,由於低吞吐量帶來的高手續費,給開發DApp帶來很多功能限制。

可擴充套件性

無論是學術界還是產業界都致力於解決區塊鏈低吞吐量的問題。其中一個方法是增加區塊大小。如果把區塊大小增加,吞吐量會有一個提升。但是由於頻寬限制,這不是個提升吞吐量的高效(100倍)解決方案。

方案二,透過鏈下交易。鏈下處理所有交易,將結算部分上鍊。因為可以使用中心化的伺服器處理交易,那麼可以輕鬆實現每秒上千/萬筆交易。透過這樣的方式可以有效提高吞吐量。但是也有劣勢,因為不是所有交易都在鏈上完成,那麼中心化的伺服器本身會不會進行一些作弊?透明度是個問題。

方案三,我們不再採用鏈式的資料結構,而是採用圖結構,不同的節點可以生產不同的區塊進行廣播。當一個節點想打包區塊的時候,可以基於過去的區塊,建立一個有向無環圖,再打包分發給其它節點。好處是可以包含多種交易,同時提高吞吐量。在圖結構裡面可能很多交易是有衝突的,對於最終要執行的智慧合約是有分歧的,這就是圖結構所遇到的難題。

方案四,代理人機制。參與共識協議的節點越少,跑起來越快,吞吐量越高。只有少量的超級節點參與共識協議可以達到一個高吞吐量,但是容易被大家垢病的是少量的代理節點能否代表整個社羣。如果節點越少,這些節點不太喜歡某一些交易或者某一些應用,其實可以拒絕這個應用提交的交易。這就回到了中心化的弊端。

還有,就是分片以及多鏈。這個解決方案代表了一個趨勢,在不損失很多去中心化特性的同時,可以達到比較好的吞吐量。大家看到最新的以太坊2.0和新的分片專案,還有一些跨鏈專案,大家會發現這中間的區別已經變得很模糊,很多時候可以把一個分片看成一個同構的鏈。在處理多鏈跨鏈交易的原子性協議和分片協議裡面提到的原子性協議區別不大,有的採用同樣的技術。只不過多鏈技術以及分片技術,有的時候會有一箇中繼鏈或者中繼分片來協調不同的分片或者不同的鏈。但是歸根到底,技術本身其實有很多相似的地方,這裡統一起來進行講解。

分片就是將交易分而治之,從而提高吞吐量。舉個例子,有一千道問題,同時有一百個人解決問題。現在可以分組,一百個人分成十個小組,將一千道問題分給十個小組,每個小組十個人處理一百道問題,根據絕大多數人的答案形成一個共識,那麼我們其實可以保證每個小組正確的解決一百道問題,這樣整個解決時間就從一千減小到一百。未來如果有更多的聽眾,例如一千個,我們可以把一千人分成一百個小組,一百小組解決一千個問題,一個小組只解決十個問題,最終只用解決十個問題的時間把一千個問題都解決了。然而可能會出現一些攻擊情形,假如如果有十個攻擊者,他們合謀分到第一個小組,達成共識的時候不遵循一些原則,例如把一分錢掰成一萬塊人民幣來進行雙花攻擊。如果攻擊者能控制一個分片,產生的攻擊在一些協議裡面其它分片是不能進行阻止的。

如何避免這樣的攻擊呢?

首先,要設立很高的門檻,讓攻擊者不容易加入到網路中,防止女巫攻擊。一個方法就是工作量證明,需要使用特定的礦機做足夠時間的計算,才能作為節點提交區塊。第二個方法,權益證明。

一旦有了一百個聽眾(或節點),進行隨機分組可以保證聽眾分到不同的小組。我們需要根據一個什麼樣的隨機數進行分組呢?一種方法是用上一個工作量證明的結果作為隨機數將大家分到不同的小組。另外一個方法,在權益證明中,使用隨機數生成協議(如VRF),讓大家分到不同的分片裡面。

如果已經有了比較合理的分組,且每個分組能保證正常節點佔絕大多數,那麼之後就是如何將上面提到的一千個問題分給不同組。為了保證不同的分片或者整個系統的資料一致性及有效性,我們需要一個方法來防止同一個交易被不同分片處理多次或者同一個資料被改變多次。常用解決方案是用兩段式提交協議保證資料一致性。

剛剛講到網路分片,節點可以安全的分到不同的分片或者鏈裡面,之後的交易也可以分到不同的分片裡,然後來進行交易處理,同時保證資料的有效性及一致性。如果做狀態分片例如ETH2.0.每個分片有自己的資料儲存,不同的分片儲存不同的資料,這樣會有單個分片資料丟失的風險。

比較直觀的解決方法,首先就是透過一些權益獎勵,鼓勵節點長期線上,而且要做大量交易驗證和共識協議來保證不會受到懲罰。如果長期掉線會被移出分片,而且抵押的權益會被系統拿走。當我們有了健壯的分片系統,那麼我們可以整合多個分片或者鏈的吞吐量,從而極大地提升整個系統的吞吐量。

有了分片和多鏈的方法之後,我們更多想的是對於單鏈有哪些方法可以進一步提高它的吞吐量呢?更快的解決方法就是透過更改共識協議。目前比特幣或者以太坊使用中本聰共識協議,節點透過工作量證明,每過一段時間生成一個區塊,並將區塊廣播給其它節點,其它節點看到這個區塊的時候,會選擇擁有最長鏈的區塊來進行確認。中本聰共識協議的優點是去中心化和非同步。即使有上萬個節點在網路裡面,而且有不同的網路延遲,中本聰共識協議還是可以很好的在全網達成共識。當然缺點就是吞吐量太低。

拜佔廷共識協議(BFT),是學術界產業界常用的共識協議。簡單來講,比如現在我要去買一張票,我要保證現場一百個人中的絕大多數都知道我要買票,大家都同意我買票。我的做法是廣播給所有人,我要去買票的資訊。其他人收到這樣一個訊息之後,同意這個資訊,再把這個資訊廣播出去。當每個人收到2/3節點的確認資訊之後,再廣播一個自己收到絕大都數人確認的確認資訊。當每個人收到2/3節點的最終確認資訊之後,就確定了全網已經同意並確認買票的這個訊息。

拜占庭共識協議的優勢是速度快,如果去實現這樣一個BFT控制協議很容易達到超過1000TPS,而且有絕對的最終性,一旦協議跑完,交易馬上可以確認最終性。

缺點是傳統拜占庭共識協議只能用於不到一百個節點,超過一百個節點,資訊交換量太過龐大使得網路擁塞不能提升吞吐量。與此同時,它不是完全非同步的。每個階段都有一個等待時間,例如中間可以等十秒,如果沒到就進行下一個階段。如果長時間協議沒有向前推進,就會進行檢視轉換,切換指揮者重新執行協議。

Polkadot整合和改進了中本聰共識協議和拜占庭共識協議。它採用了一個混合式的演算法, GRANDPA協議和BABE協議。BABE協議是負責區塊生成,GRANDPA協議是提供最終性的。BABE協議和傳統的比特幣、以太坊的協議一樣。每過幾秒鐘選擇一個節點進行出塊,節點出塊以後,進行一個廣播,再過幾秒選第二個節點進行一個出塊,不同的節點也是根據最長鏈原則選擇區塊進行確認。

GRANDPA演算法,它是根據BFT進行改進的版本,是非非同步的共識協議。BABE協議生成的區塊,GRANDPA協議最終會做一個敲定。BABE協議生成不同長度的鏈,GRANDPA協議會選擇這裡麵包含最多投票的有效鏈進行確認。以往的區塊鏈裡面,如果進行共識協議,通常是一個塊一個塊進行敲定,但是Polkadot是根據不同的鏈進行敲定。比如每過一段時間,生成十個區塊或者二十個區塊,那麼執行GRANDPA協議,將二十個區塊直接一次性的確認。這樣GRANDPA可以在有限的時間裡確認更多的區塊。

透過以上講解,我們可以看到想要吞吐量高的區塊鏈解決方案,同時擁有比較好的去中心化特性,最好的方法就是選擇高吞吐量的單鏈解決方案加上安全高效的分片或者跨鏈解決方案。

互操作性

除了從可擴充套件性的角度出發,我們也需要從實際角度出發思考,為什麼需要互操作性,或者為什麼需要跨鏈。傳統來講,區塊鏈可以解決信任的問題,如果可拓展性可以被解決,那麼效能的問題也將被解決。互操作性其實是在上面兩個問題被解決的情況下,可以解決更廣泛的信任問題。

目前不同的應用場景有不同的聯盟鏈和公有鏈。有了這些鏈之後,我們需要用互通性才能將有用的資料溝通起來。這裡會涉及到跨鏈或者互操作性的不同方法。未來會看到一個界限極其模糊的區塊鏈系統,就是私有鏈、聯盟鏈、公鏈透過某種方式來進行互聯。

區塊鏈領域的互操作性,為什麼在傳統的網際網路應用裡不明確提這樣的要求呢?因為現在的網際網路基礎設施已經把這些功能都提供好了,例如各種各樣的SDK和API。你如果做一個應用想呼叫微信上面的資料,那麼可以透過微信上面的SDK和介面把資料拿下來。如果想做支付,支付寶也有對應的支付通道,寫程式碼的時候可以把API呼叫一下就可以做支付了。目前在區塊鏈上無法做到的原因,是由於各種區塊鏈不同的共識協和區塊結構導致了我們的資料目前還是屬於孤島狀態。為了讓不同的孤島上面的資料進行溝通,我們必須透過互操作性以及跨鏈的系統將不同的區塊鏈連通起來。

互操作性以及跨鏈協議有哪些具體的方式呢?第一種方式就是公證人模式,不同鏈之間有一個公證人。相對比較去中心化的第二種方式就是側鏈模式。透過側鏈的方式,在鏈B上面可以驗證鏈A上哪些交易被寫到區塊裡,那麼鏈B就可以驗證A上面的操作並在B上面進行對應操作例如轉賬。第三種方式是雜湊時間鎖,這是相對一個比較複雜的協議,它是一個集去中心化以及透明交易的資產轉換為一體的跨鏈操作。簡單來講,如果我做比特幣兌換以太坊的交易,我在比特幣這邊放一個鎖,同時對方也要在以太坊放一個鎖。我把金鑰給他,同樣的金鑰我可以獲得對應的以太坊,同時他可以根據金鑰獲得對應的比特幣。還有一個時間鎖,保證雙方只能在限定時間內去解鎖以太坊和比特幣,否則協議會自動終止,雙方都沒有獲得對方的資產。

剛剛提到的方法都是很好的數字資產跨鏈的解決方案,無論是從效率還是去中心化的角度。如果想做到資料以及邏輯層面上的跨鏈,我們就需要更復雜的系統,例如多鏈系統裡面的中繼鏈。具體到Polkadot上,系統使用中繼鏈來協調不同平行鏈的跨鏈操作。根據不同的商業環境,開發者可以使用Substrate開發和搭建不同的平行鏈。中繼鏈的驗證節點用於驗證平行鏈區塊的正確性從而保證每條平行鏈具有相同的的安全性,與此同時協調不同平行鏈之間的通訊。一些已有的區塊鏈,例如以太坊、比特幣,暫時沒有基於Substrate的平行鏈版本。目前的方法是使用橋,將它們橋接到平行鏈當中,再透過中繼鏈與其它鏈進行溝通。

在這樣的框架結構中,最中心的是中繼鏈,它連線不同的平行鏈。剛剛提到橋接鏈,橋接鏈不是直接連到中繼鏈上,而是透過一個橋,先連線到平行鏈,之後透過中繼鏈跟其它鏈進行通訊。

每個平行鏈都有中繼鏈的輕節點,用來接收和驗證中繼鏈的訊息。同時平行鏈有自己的校對節點稱為collator。校對節點蒐集對應平行鏈上的資料,將這些資料傳遞給中繼鏈。中繼鏈會分派不同的驗證節點,去驗證平行鏈上的區塊是否是正確的,是否有雙花的攻擊,如果一些區塊有問題,中繼鏈會根據協議沒收對應平行鏈插槽,或者對一些節點進行懲罰。

上圖來自Polkadot的白皮書,將不同的角色都包含在裡面,包括不同的平行鏈以及平行鏈裡面是怎麼運作的,如處理交易、廣播交易以及最終交易寫成區塊,區塊最後要寫入到中繼鏈裡面等。

如果中繼鏈想要支撐成千上萬個平行鏈,那麼我們如何實現更高的橫向擴充套件呢?方法就是將二級中繼鏈作為一個平行連結入到中繼鏈裡面,構建出一個更加分散的連線中繼鏈的跨鏈平臺。

目前Parity正在開發三個至關重要的功能。第一個是Cumulus。平行鏈需要一個聯結器連線到中繼鏈,這個聯結器就是Cumulus。現在用Substrate開發出來的程式碼,未來只需要很少的改動,就可以使用Cumulus連線到中繼鏈,前提是拿到對應的插槽。

第二個是XCMP跨鏈資訊互動協議,不同的平行鏈如果想呼叫或者傳送訊息給其它的平行鏈,就需要透過這樣一個協議去傳輸。

第三個是SPREE。講到跨鏈,大家通常預設是資產跨鏈,資產A放在鏈B上面,做好一點可以做成去中心化的。再好一點就是現在提到的不同的鏈可以透過中繼鏈或者其它的方法將資訊傳送過去,對方鏈可以執行對應的交易,或者智慧合約。但前提是,不同的平行鏈他們是相對比較同態的架構。同構就是不同的平行鏈執行處理交易的邏輯是大致一樣的。

鏈A是用EVM處理智慧合約,鏈B也是用EVM處理交易,那麼鏈A傳送交易給鏈B,鏈B是可以處理的。如果鏈A是EVM,鏈B是WASM,那麼鏈B收到A的交易也不知道怎麼處理。SPREE可以支援跨鏈執行程式碼的互動。就是鏈A將自己的執行邏輯進行打包,打包以後生成一個可執行的runtime透過一些渠道傳送給鏈B,鏈B收到後可以去執行鏈A的交易。即使鏈A和B的處理交易的方式不同,因為B收到了A的程式碼和資料,那麼B就可以處理A上的交易了。這三個功能都在緊鑼密鼓的進行研發。之後有了這三個協議,我們進行任何的跨鏈交易和資料的處理操作。

在過去兩年間,Substrate已經有超過20萬行程式碼,還有很多的社羣貢獻者。在第一季度Substrate會從1.0升級到2.0版本,會有更好的效能以及更穩定的元件。同時,目前已經有超過80個團隊基於Substrate/Polkadot進行開發。歡迎大家共同在Substrate/Polkadot上構建有意思的聯盟鏈和平行鏈。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;