劉毅老師深入探討了 DApp 開發的現狀、公鏈的三種擴容思路、以太坊向 Serenity 的進程、Gavin Wood 的新徵程 Polkadot、殊途同歸 Cosmos、DApp 開發比較、網絡拓撲比較、辨析「跨鏈」、下一代 DApp 開發技術選擇等 9 個方面的內容。

原文標題:《萬字長文說透 Polkadot 架構》
分享:劉毅,Random Capital 合夥人、清華大學碩士、區塊鏈和大數據技術專家。20 年多種資本市場投資經驗,比特幣早期投資者。
來源:一塊 Plus 社區

兩萬字全解 Polkadot 架構及下一代 DApp 開發技術

本次分享的主標題是 Polkadot 架構解析,副標題是下一代 DApp 開發技術評述。其實副標題更能概括本次分享,因爲我們不只討論 Polkadot,而是要相對全面地評述平臺型公鏈,包括以太坊 2.0、Cosmos 等,當然 Polkadot 是重點。

我希望講清楚 DApp 開發技術的走向。這是區塊鏈行業發展的核心問題之一,它不僅對開發者重要,而且會影響到其他行業參與者。因此我儘量講得直白淺顯,爭取讓非技術背景的聽衆也能大體聽懂。

一、DApp 爲何重要?

兩萬字全解 Polkadot 架構及下一代 DApp 開發技術

我先從 DApp 本身說起,因爲來龍去脈很長。最後還是決定簡要地談談,否則邏輯上不完整。

DApp 是 Decentralized Application 去中心化的互聯網應用。例如比特幣就是一個 DApp,它是去中心化的價值存儲型加密貨幣。去中心化的概念比較複雜,V 神有篇文章說明了去中心化有架構、治理和邏輯三個維度,大家可以找來看看。

從使用者的角度看,去中心化可以簡單理解成,不能被個別或者少數參與者所控制,因此值得信任的應用屬性。區塊鏈是實現 DApp 的主流技術手段,或者說區塊鏈是 DApp 的基礎設施。

本次分享所說的區塊鏈,如果加不特殊說明,都是指公鏈。DApp 和普通的互聯網應用的差別就在於 D 去中心化。那麼去中心化爲什麼重要?爲什麼值得衆多 IT 互聯網從業者參與其中?它是不是個僞需求僞概念?

回答這個問題最清楚的,是 a16z 的合夥人 Chirs Dixon,他在 2018 年 2 月發表文章題爲《Why Decentralization Matters》,就是去中心化爲什麼重要。

要理解他的觀點,首先要了解什麼是網絡效應。網絡效應是指產品或服務的效用隨着用戶增長而增加的機制。

例如微信,用得人越多,它的功能就越強大,越不可或缺。互聯網應用的核心就是建立並維持網絡效應,谷歌、亞馬遜、BAT 等巨頭的業務,都是建立起了強大的網絡效應,使得後來者難以逾越。

Chirs 認爲互聯網平臺要建立網絡效應,都是要千方百計的吸引用戶、吸引開發者和商家等等。但是在突破了關鍵規模之後,平臺的吸引力越來越強,它的控制力也越來越強。

比如現在做電商,如果不依託於天貓、京東或者微信,幾乎不可能成功。因爲他們已經形成了巨大的網絡效應,用戶和商戶都被鎖定了。互聯網平臺的運營方都是企業,企業的使命就是利潤最大化。

當用戶和商戶離不開平臺的時候,平臺跟用戶商戶之間的關係就就發生變化。我們看上面這張圖,平臺最開始是吸引用戶,形成網絡效應之後,就開始儘量從用戶頭上賺錢。

平臺跟開發者、內容創造者和商戶之間,也從合作逐步走向競爭。例如大家都知道百度搜索結果不是按信息的真實性和重要性排序,而是誰給的錢多就排在前面。

最早百度廣泛聯繫各家公司,讓大家把信息提交給他,方便用戶搜索。現在如果不交錢,公司的官網在百度上就搜不到。百度爲了賺錢,把病患導流給莆田系醫院。但國內的用戶明知如此,還是離不開百度,因爲百度的數據最多,對用戶也最瞭解,想想是不是很可怕。

DApp 可以改變互聯網平臺壟斷的局面。因爲 DApp 是去中心化的,靠公開透明的共識維持的經濟體。網絡的參與者貢獻越大,相應的權利也就越大,但是沒有個體能控制全局。

任何參與方要損害其他人的利益,要麼是行不通,要麼就會引發分叉。DApp 可以長期保持開放、公平,所以大家不用擔心過河拆橋,所有人都儘自己最大努力參與建設,並獲得回報。有點類似於各盡所能、按勞分配的社會理想。

這纔是真正的開放網絡,是互聯網不應忘記的初心。所以衆多互聯網大咖都對 DApp 以及實現 DApp 的區塊鏈技術情有獨鍾,並寄予厚望。

二、DApp 發展困境

兩萬字全解 Polkadot 架構及下一代 DApp 開發技術

去中心化應用承載着重塑互聯網的偉大理想,但是其發展現狀非常窘迫,這個也大家都清楚,我簡單提一下。

首先是用戶極少,例如預測市場 Auger,DApp 領域的明星項目,融資數千萬美元,開發歷時三年多,上線之後日活用戶幾十人,而且 Auger 不是個案。

我們看上方的圖,來自 DAppReview,是以太坊 DApp 日活用戶的前 5 名,最高的也只有千用戶級,而互聯網的頂級應用日活用戶可以達到數億,差距是 5 個數量級。

爲什麼 DApp 情況如此可憐?主要是因爲區塊鏈基礎設施不給力,使得 DApp 使用門檻高、用戶體驗差。就好比以太坊是一條村級公路,收費高而且擁堵,當然就沒人願意走。

下方的圖展示的是以太坊的利用率,可以看到從 2017 年底到現在,以太坊一直是接近滿負荷運轉。也就是說 DApp 又慢又貴,但基礎設施已經全力以赴了,沒有再提升的空間。

在這樣的困境下,DApp 要突破關鍵規模、創造出網絡效應、跟中心化互聯網應用競爭,是不可能的,所以必須升級區塊鏈基礎設施。

三、又慢又貴的原因——區塊鏈極度冗餘結構

兩萬字全解 Polkadot 架構及下一代 DApp 開發技術

DApp 又慢又貴的根源是區塊鏈平臺的架構限制。這個架構限制可以簡單概括爲:區塊鏈是極度冗餘的計算架構。

冗餘就是重複,讓多臺計算機重複執行相同的計算、重複存儲相同的數據。冗餘是有意爲之的,不是浪費。適當的冗餘在企業計算和互聯網都普遍存在。

最典型的是主從結構,兩臺差不多的計算機一主一備,執行相同的計算、存儲相同的數據。主機出現故障,備機迅速頂上。雖然兩臺機器幹了一臺的工作,但是提高了系統的可用性。

但爲什麼說區塊鏈是極度冗餘呢?因爲區塊鏈把冗餘推到了極限,網絡中所有的計算機,不論是幾百臺還是上萬臺。都執行相同的計算,存儲相同的數據。冗餘的程度無以復加。極度冗餘意味着極度高昂的成本,成本高到什麼程度?

V 神給出過估算,就是在以太坊上執行計算或者存儲數據,比在商業雲平臺上完成相同計算或者存儲同樣的數據,成本高 100 萬倍。也就是在普通雲服務上花費 100 錢能完成的計算,放到以太坊上去做,需要 1 個億的成本。所以在考慮什麼業務可以做成 DApp,一定要考慮到成本。

不要僅僅爲了講故事圈錢,就把什麼阿貓阿狗都放到區塊鏈上來,那是資源的巨大浪費。那麼花 100 萬倍的成本,能得到什麼好處?高可用性當然不在話下。比特幣或者以太坊網絡,隨時都有計算機加入或者退出,對業務毫無影響。

但是高可用性顯然是不夠的,因爲它只需要適度冗餘就能實現,不需要極度冗餘。極度冗餘帶給我們的新屬性就是去中心化。具體地說,去中心化對用戶意味着 trustless、permissionless 和 censorship ressistancy,就是去信任、無許可和抗審查。

無許可很好理解,任何人想要使用比特幣、以太坊,都不需要向別人申請。抗審查也很清楚,沒人能阻止你使用區塊鏈。比如維基解密,世界上最強大的國家恨它入骨,欲除之而後快,但是維基解密仍然能獲得比特幣捐款。

含義比較模糊的是去信任,英文是 trustless、trust free 或者 trust minimal。我認爲最準確的說法是 trust minimal 信任最小化。使用去中心化應用,其實隱含了對區塊鏈網絡整體的信任。

例如使用比特幣和以太坊,就要信任比特幣和以太坊不會被 51% 攻擊。使用 Cosmos 和 Polkadot 就要相信惡意驗證人少於 1/3。所以去信任的準確含義是,在信任整個區塊鏈網絡的前提下,可以不必信任個別礦工或者驗證者,也無需信任交易對手。

對於某個應用,如果用戶從去信任、無許可和抗審查這三個方面獲得的好處,值得花費 100 萬倍的成本,那麼這個應用放在區塊鏈上就是合理的。有這樣的應用嗎?就我自己來看,目前能值這個成本的,只有價值存儲一項需求。

著名的比特幣最大化主義者 Jimmy Song 說,比特幣會成功,而法幣和所有的競爭幣都會失敗。原因是中心化的貨幣幹永遠不過去中心化的貨幣,而去中心化的產品永遠幹不過中心化的產品。

隱含的邏輯就是,相同的互聯網服務產品,成本差 100 萬倍,當然幹不過。他這個說法是有道理的,但是過於僵化。因爲 100 萬倍的成本差距不是必然的,是可以改變,可以拉近的。

能不能把 DApp 和中心化互聯網應用的成本差距,從 100 萬倍拉近到 10 萬倍,1 萬倍,甚至 1 千倍。同時仍然保持去信任、無許可和抗審查這三大好處。回答是完全可能,只要降低冗餘的程度,就能降低成本。方法有三類,也就是區塊鏈擴容的三個思路——代議制、分層和分片。

四、第一種擴容思路 —— 代議制

兩萬字全解 Polkadot 架構及下一代 DApp 開發技術

第一個擴容思路——代議制,源於人類的古老政治智慧。即民主是好的,但是全民直接民主效率太低。英國脫歐採用了全民公投的方式來決定,但是顯然不能所有的議題都搞全民公投。

代議制是人民選出代表,再由代表來議定法律或者重大決議。代議制提升決策效率有兩個原因,第一是參與共識的人數大爲減少,第二是代表通常是專職政治家,他們有更多的資源和知識來議定國家大事。

用代議制的方式來做區塊鏈擴容,最典型的是採用 DPoS 共識的 EOS。EOS 通證的持有者選出超級節點,21 個超級節點輪流出塊。跟以太坊相比,參與共識的計算機數量下降了 3 個數量級。

而且以太坊的節點計算能力高低不齊,協議參數設定要兼顧低端計算機。而 EOS 超級節點主機硬件配置和網絡帶寬有同一的高要求。所以毫不奇怪,EOS 能達到數千 tps,遠高於以太坊。

EOS 從誕生之日起,就一直處於風口浪尖。加密社區的一部分人嚴厲地批評 EOS,說它中心化的,甚至認爲它根本不算區塊鏈。而支持者認爲 EOS 的去中心化程度是足夠的。用戶仍然能夠享有去信任、無需許可和抗審查等好處。

那麼 EOS 的去中心化程度是否足夠呢?我的看法是:有些情況下夠,有些情況下不夠。取決於是什麼應用,誰在使用。

用戶和用戶差別巨大,只從國籍分,就有美國人、中國人、伊朗人、朝鮮人等等。還有性別、年齡、種族、地域、職業、宗教等等差別。

另外就是一個特定用戶,他的需求也是多樣化的,例如社交、娛樂、金融、協作等等。大類又分成很多小類,金融裏僅僅對貨幣就有價值存儲需求、大額轉賬需求、小額支付需求等等。

如果把是大部分身家都用加密貨幣來做長期價值存儲,我首選比特幣。如果是小額支付,或者打麻將、擲骰子,用 EOS 當然也沒問題。在區塊鏈世界,從去中心化程度最高的比特幣和以太坊,到中心化程度最低的 EOS 和波場。

可以看成是去中心化譜 decenralization spectrum。每條公鏈,包括後面重點介紹的 Polkadot 和 Cosmos,都在譜中佔據特定位置,都有機會適用於特定需求。不存在 one chain fit all 一鏈打遍天下的可能性。

做架構設計就是做折中,有所選擇必然就有所放棄。本次分享的核心理念,就是未來的區塊鏈世界是異構的、多鏈共存的。當然,我也不認爲需要幾百上千條公鏈,因爲合理的可選位置沒那麼多。在定位大體相似的情況下,網絡效應會消滅弱者。

五、第二種擴容思路 —— 分層

兩萬字全解 Polkadot 架構及下一代 DApp 開發技術

分層也稱爲二層擴容或者鏈下擴容,就是把一部分交易放到在區塊鏈以外執行,同時仍然保障交易安全。分層有狀態通道和側鏈兩類技術。還有一類二層技術,是把計算密集型任務轉移到鏈下執行,這塊與分享主題無關,不再提及。

狀態通道和側鏈是不同的技術隱喻,但是到了實現層面,其實非常相似。由於 Cosmos 和側鏈有很深的內在聯繫,所以我在這裏花點時間,講講側鏈的原理。

要理解側鏈,首先要明白 SPV 證明,SPV 是 Simplified Payment Verification 簡單支付驗證的縮寫。爲了讓計算和存儲能力有限的設備能夠使用比特幣的問題,纔有了 SPV,或者叫輕客戶端或者輕節點。

手機錢包就是輕客戶端,它不必同步全部區塊,只需要同步區塊頭,傳輸和存儲的數據量縮小了 1000 倍。左側圖是 SPV 證明的原理,利用了梅克爾樹。看不懂沒關係,只要記住梅克爾樹是區塊鏈最重要的數據結構。

利用它可以只需存儲極少的數據,就可以證明大量的事實曾經發生過,而且屬於特定集合。就區塊鏈來說,就是隻存儲區塊頭,未來就可以驗證交易是否存在於某個區塊。

側鏈方案就是把主鏈資產通證鎖定,在側鏈上對應地創造出通證承兌匯票,匯票交易在側鏈執行,在側鏈上得到匯票的人可以兌換主鏈通證。具體來看右圖的以太坊 Plasma MVP 側鏈方案。

首先要在以太坊主鏈上部署 Plasma 智能合約,假定有 Alice 和 Bob 兩個側鏈用戶。Alice 發起主鏈交易把通證存入 Plasma 合約,通證被合約鎖定。

側鏈的 Operator 發現 Alice 存入了通證,就會在側鏈裏創建出側鏈通證,也就是主鏈通證的承兌匯票。請注意側鏈本也是區塊鏈,它有自己的共識協議和礦工

在 Plasma MVP 方案中側鏈採用的共識是 PoA 權威證明,就是一個 Operator 說了算,由它記賬出塊。PoA 當然不是唯一選擇,Loom 的 Plasma 側鏈採用的 DPoS 共識。

存入之後,Alice 就可以在 Plasma MVP 鏈使用通證,進行支付或者轉賬。例如她可以跟 Bob 玩遊戲,輸贏通證,可能很快就玩了很多局,產生了大量轉賬交易。側鏈交易只需要側鏈的節點達成共識。而側鏈的規模通常比主鏈小得多,因此交易執行更快,成本也低。

側鏈區塊的區塊頭,都會由 Operator 提交給主鏈的 Plasma 合約。不論側鏈一個區塊含有多少筆交易,是 1 千筆還是 1 萬筆,主鏈只發生了記錄區塊頭一筆交易。所以主鏈上的 Plasma 合約,相當於是側鏈的 SPV 輕節點,它存儲了區塊頭,從而可以驗證側鏈交易是否存在。

例如 Alice 在側鏈上把通證轉給了 Bob,Bob 就可以向 Plasma 合約發請求,包含側鏈交易的 SPV 證明,表示 Alice 已經把這些通證給我了。

Plasma 合約可以驗證轉賬交易在側鏈確實存在,從而滿足 Bob 的取款要求。這個例子說明了分層方案如何把大量交易轉移到鏈下執行,或者說轉移到二層網絡執行。

六、第三種擴容思路 —— 分片

兩萬字全解 Polkadot 架構及下一代 DApp 開發技術

第三個擴容思路是分片,原理很簡單,就是別讓所有的節點都執行所有的交易。把節點分成很多組,或者說分成很多片。多個分片可以並行處理交易,總體的處理能力就提高了。

當然還需要一條特殊的鏈來看管所有的分片,這條一般稱之爲主鏈,它要做很多工作,後面再詳細介紹。粗略的解釋是,如果沒有主鏈,多個分片之間沒有聯繫,那就是完全獨立的多條區塊鏈,跟擴容無關了。

分片擴容的基本思路非常簡單,但實際做起來則面臨很多複雜難題。爲了理解後面要對比分析的幾個公鏈架構,你首先要大概瞭解這些難題。另外因爲這個公鏈都採用 PoS 共識,所以我們討論分片難題和解決方法基於 PoS 來討論。

七、分片的難題 —— 驗證人選擇

兩萬字全解 Polkadot 架構及下一代 DApp 開發技術

首先就是分片之後,每個分片都需要一組驗證人。大家看一下這張示意圖。

如果在單鏈上,惡意驗證人超過一半,可以攻擊系統。分片之後,只要在一個分片內佔據多數,就可以攻擊這個分片。所以片分得越多,攻擊成本越低,也就是安全性降低。

解決的方法是,分片的驗證人分組不是固定的,而是隨機選取,而且每隔一段時間就重新分組。這樣惡意的驗證人不能事先知道自己被分到哪個組,而貿然發送攻擊會受到懲罰,因此係統的安全性就不會隨着分片數量上升線性的下降。

驗證者隨機動態分組的關鍵,是要有可靠的隨機數,隨機數一直是計算機科學中複雜而有趣的問題。去中心化地拜占庭容錯地產生可靠隨機數難度非常大,也是區塊鏈研究的熱點問題。

八、分片的難題 —— 跨片交易完整性

兩萬字全解 Polkadot 架構及下一代 DApp 開發技術

在分片的方案中,每個分片上可以運行一到多個 DApp,不論 DApp 在不在同一分片,都要能互操作。首先要明確什麼是跨片互操作?因爲分片也都是區塊鏈,所以跨片等同於跨鏈。

大家知道區塊鏈可以看成是分佈式共識維護的狀態機,狀態機通過交易執行完成狀態轉移。跨鏈的互操作應該引發雙方的狀態轉移,也就是兩個互操作的鏈都執行了交易,而且執行交易之後的狀態具有一致性。

或者說一個跨鏈交易要引起兩條鏈乃至多條鏈的狀態改變,而且這些改變要麼都成功,要麼都不成功,不存在中間狀態。這跟企業計算裏分佈式交易的概念上非常類似。

只不過傳統分佈式交易的參與者通常是多個數據庫,而跨鏈交易的參與者是多條區塊鏈。非技術背景的同學可能不熟悉狀態機和分佈式交易的概念。因爲跨鏈交易的概念對理解本次分享的結論很重要,我再用非技術語言解釋一下。

假設你要從工行賬戶轉 1 萬塊錢到建行賬戶,這筆轉賬交易其實就是從工行賬戶上減掉 1 萬,在建行賬戶增加一萬。工行和建行各自都有數據庫存儲賬戶餘額,那麼就要有一個機制,保證兩個數據庫的操作,一加一減,在任何情況下要麼都成功,要麼都失敗。

如果沒有這樣的保證,工行賬戶減掉了,建行賬戶沒加上,你少了 1 萬塊錢,你肯定不幹。如果工行賬戶沒減掉,建行賬戶加上了,你多了 1 萬塊,銀行肯定不幹。

這就叫分佈式交易的完整性或者原子性。簡單吧?其實做起挺難的,因爲不論是工行建行哪家的服務器停電、斷網、軟件崩潰等等,各種極端條件,都要保證交易完整。在區塊鏈上,轉賬變成了轉通證。

某通證發行在 A 鏈上,通過跨鏈轉 10 個通證到 B 鏈,跨鏈交易完成後,A 鏈上的 10 個通證被凍結了,B 鏈上多了 10 個通證。這兩個狀態改變在任何條件下,要麼都成功,要麼都失敗。

由於區塊鏈可能分叉,跨片交易要比傳統的分佈式交易更復雜。我們看圖,如果跨片交易在分片 1 上的部分是在 A 塊裏被打包,在分片 2 上被 X’ 塊打包。兩個分片都可能出現分叉,A 塊和 X’ 塊也就可能成爲被廢棄的孤塊。也就是跨片交易可能部分成功部分失敗,完整性被破壞

怎麼解決這個問題呢?我們來分析一下,造成跨鏈交易完整性被破壞的根本原因是,交易的多個部分被打包進區塊,但是鏈可以重組,塊可以變成孤塊。

說白了就是交易進了區塊,但是靠不住,有可能反悔,正式說法是沒有明確最終性。最終性 finality 就是區塊必然被包含進區塊鏈。

在比特幣區塊鏈上,某個區塊後面連的區塊越多,它被逆轉或者說放棄掉的可能性就越低,但是永遠不能 100% 確定,所以稱爲概率最終性或者漸進一致性。解決這個問題的辦法就是,要有機制讓區塊具有明確的最終性,不能含糊。

九、分片的難題 —— 最終性 VS 活性

兩萬字全解 Polkadot 架構及下一代 DApp 開發技術

finalize 就是使區塊具有最終性,我翻譯成敲定。要使區塊具有最終性。簡潔的方法就是出塊即敲定。Cosmos 的 Tentermint 共識就是這樣。但是這個做法在特殊情況會出問題。

我們看圖,某條 Tendermint 共識的區塊鏈原本正常出口。突然海底光纜斷了,互聯網被分成了兩部分。兩部分各自包含一般驗證人節點。Tentermint 共識要求收集到 2/3 以上的驗證人簽名才能出塊。

被斷開後,兩部分網絡都最多收集到一半驗證人簽名,所以出塊停止了,或者說區塊鏈喪失了活性 liveness。有人認爲這可以容忍,本來就是特殊情況嘛,那就先停下來,等網絡恢復正常再繼續工作。

海底光纜斷了,上網、打電話、視頻會議都受影響,憑什麼區塊鏈就不能暫停呢?還有人認爲停止出塊不可接受,要始終保持區塊鏈的活性。那怎麼辦呢?辦法就是把出塊和敲定分開,也稱爲混合共識。

在剛纔說的網絡中斷情況,在兩個分開的網絡,節點可以繼續出塊,但是沒有足夠的驗證人蔘與進來,所以不能敲定。等網絡恢復了,再決定哪些塊被敲定,從而活性和最終性兼得。

而且混合共識可以讓個別節點輪番快速出塊,於此同時,敲定過程可以慢一些,讓大量節點參與進來,確保去中心化,提高攻擊和共謀的難度,也就是保障了安全。所以混合共識也兼顧了性能和安全。以太坊 2.0 和 Polkadot 都採用混合共識。

十、分片的難題 —— 交易有效性

兩萬字全解 Polkadot 架構及下一代 DApp 開發技術

還有個分片難題是交易有效性。交易有效性問題就是防止無效交易進入區塊,成爲區塊鏈維護的歷史真相的一部分。

舉比特幣的例子,假如我是超級大礦工,掌握了大部分算力。我想僞造一筆交易,把別人地址上的比特幣轉給我,能不能做到呢?答案是做不到。

因爲這筆交易沒有地址對應的私鑰簽名,是無效的,包含這筆交易的區塊也是無效的,不會被其他節點所接受。即便我掌握了大部分算力,可以挖出最長的鏈,但也只是構建了一個很長的分叉。

衆多的比特幣錢包、交易所都不會認可我這個分叉。所以 51% 攻擊,並不能把誰的 btc 偷走,或者憑空創造出比特幣。最多是雙花攻擊,雙化不展開談了。總而言之,比特幣網絡不存在交易有效性問題。

那麼這樣一個十年前就被完美解決的問題,怎麼又會出現呢?原因是 btc 等公鏈的節點都擁有全部數據,因此能完全獨立地驗證交易有效性。現在變成了多個分片,節點只存儲部分數據,也就無法獨立驗證交易有效性。

我們看左側的圖,有兩個分片,分片 1 已經被惡意的驗證人所控制,在 B 區塊裏打包了無效交易,例如給自己的地址上憑空創造了很多通證。在下一個區塊 C,攻擊者發起跨片交易,要把通證轉到分片 2 上的 DApp,可能是去中心化交易所。分片 2 看到的 C 區塊裏面的交易都沒有問題,而且分片 2 也沒有 C 區塊之前的數據,所以無法驗證交易有效性。

下面我們介紹一個在分片環境下解決交易有效性的方案,叫舉報獎勵。其實還有別的方案,但跟主題無關,就略去不提。

看右側圖,分片 1 雖然被惡意驗證人控制了,但是還有至少一個誠實的驗證人。分片 2 不能驗證跨鏈交易的有效性,就選擇相信分片 1,打包了跨鏈交易。這時候分片 1 裏的誠實節點可以要跳出來舉報,說區塊 B 是非法的,我有證據。

系統接受了舉報,就會懲罰分片 1 裏的惡意驗證人,沒收他們質押的通證,並向舉報者提供獎勵。所以爲什麼有的區塊鏈,驗證人要收回質押的通證,都需要等幾個月。主要的原因就是給舉報和證實舉報留出足夠的時間。

以上我們介紹了四個分片的難題,和相應的解決方案。其實分片擴容的難題不止這些,限於時間,就不再列舉了。

十一、以太坊正朔 —— Serenity

兩萬字全解 Polkadot 架構及下一代 DApp 開發技術

下一代以太坊的 lay1 擴容思路就是分片。關於下一代以太坊,信息很混亂,連名稱都不統一,有以太坊 2.0、Serenity、Shasper、Casper 以太坊等,我們統一稱爲 Serenity。

大家看 Serenity 架構圖,是臺灣資深以太坊研究員王韶爲女士製作的。從上往下看,最上面是 PoW 主鏈,也就是目前運行的以太坊。Serenity 不會取代掉 PoW 鏈,而是以側鏈的方式上線部署。

但是長期而言,Serenity 並不依賴 Pow 鏈,PoW 下面的三層都屬於 Serenity,而且恰好對應 Serenity 演進的三個階段。

首先是 Beacon Chain 信標鏈,主要功能是管理驗證人。信標鏈上線後,如果希望成爲 Serenity 的驗證人,就把 eth 從 Pow 鏈轉入信標鏈。還是用側鏈的方式,信標鏈在 PoW 主鏈上部署智能合約。

eth 轉入信標鏈是單向的,不能再從信標鏈轉回 PoW 鏈。在信標鏈上擁有 eth,進行質押並運行節點,就可以成爲驗證人。爲了達到充分的去中心化,做 Serenity 驗證人的門檻很低,只需要質押 32 個 ETH,驗證人集合會很大,可以達到幾萬到幾十萬這個數量級。

信標鏈還負責產生隨機數,用於驗證人分組和出塊人選擇。信標鏈執行 PoS 共識協議,包括它自己的共識和所有分片鏈的共識,對驗證人進行獎勵和懲罰。還有就是作爲跨片交易的中轉站。信標鏈預計在今年年底或明年年初上線。

目前有多個團隊在進行信標鏈節點軟件開發,有幾個團隊已經部署了測試網。下一階段會部署公共的、長期運行的測試網,把各團隊開發的節點放在一起進行測試。

信標鏈往下是多條分片鏈,圖上畫的是 100 個 分片。分片鏈被看成 Serenity 的數據層,負責存儲交易數據,維護數據的一致性、可用性還有活性,也就是確保總是能出塊,不會被鎖住。分片鏈的上線時間還不確定。

分片鏈的下方是虛擬機,虛擬機負責執行智能合約和轉賬交易,改變狀態,也就是對分片鏈數據進行讀寫。Serenity 很重要的設計決策是把數據層分片鏈和邏輯執行引擎虛擬機解耦。

解耦帶來了很多好處,例如可以分頭開發,單獨上線或升級等等。Serenty 虛擬機將用 wasm,可以提高性能,並支持多種編程語言。

Serenity 如何前面所說的四個分片難題呢?首先是在信標鏈上管理驗證人池,爲每個分片鏈隨機指定一組驗證人。採用混合共識,驗證人輪流出塊,採 Casper FFG 敲定最終性。用舉報獎勵方法保障交易有效性。

十二、Gavin Wood 的新徵程 —— Polkadot

兩萬字全解 Polkadot 架構及下一代 DApp 開發技術

分享已到中途,終於輪到主角 Polkadot 出場。Gavin Wood 是 Polkadot 的靈魂人物,大部分同學對他已經很瞭解,不瞭解的上網搜一搜,我就不介紹了。

Gavin Wood 是 web3 基金會的創始人,也是現任總裁,Polkadot 是 Web3 基金會的核心項目。類似於以太坊和以太坊基金會的關係。

關於 web3,有必要介紹一下。在 web3 基金會和 Polkadot 等項目文檔中,對 web3 願景的文字表述不太一樣。但是都包含兩層意思。

第一層:web3 是無服務器的、去中心化的互聯網。serverless 無服務器也是去中心化的意思,因爲在 web3 憧憬的網絡計算架構裏,參與者或者說節點是平等的,沒有服務器和客戶端的區別,所有節點都或多或少參與網絡共識的形成和記錄。去中心化的互聯網有什麼用呢?

就是 web3 的第二層含義:每個人都能掌握自己的身份、資產和數據。

掌握自己的身份,意味着不需要其他人或者組織賦予身份,其他人或者組織也無法冒用或者凍結身份。掌握自己的資產,意味着不會被剝奪資產,可以自由處置資產。掌握自己的數據,意味着每個人可以按自身的意願生成、保存、隱匿、銷燬個人數據,未經他的允許,任何人任何組織都不能使用其個人數據。

web3 願景並非 web3 基金會或者 Polkadot 項目所獨有。很多區塊鏈項目,包括比特幣、以太坊,都有類似的願景。名稱五花八門,包括開放網絡,下一代互聯網等等。叫什麼名字不重要,你應該思考 web3 願景的內涵,那是不是你想要的互聯網?

甘地說過:Be the change you want to see in the world. 我翻譯成:邁向你想要的世界。如果 web3 也是你認同的願景,那麼就參與進來,爲之努力。

Polkadot 是 web3 的骨幹網,是 web3 的基礎設施,是 Gavin Wood 和 web3 基金會指出的,通向 web3 願景的道路。

Substrate 是 Polkadot 項目開發過程中形成的開源區塊鏈開發框架,可以用來搭建 Polkadot 生態,也可以用於構建其他目的的區塊鏈。

十三、Polkadot 架構

兩萬字全解 Polkadot 架構及下一代 DApp 開發技術

接下來我們介紹 Polkadot 架構,這兩張圖片都來自於嶽利鵬翻譯的 Polkadot 白皮書中文版。

先看右邊的大圖,Polkadot 的基本網絡結構是星型的,或者稱爲輪輻型。星型的中心是 Polkadot Relay 中繼鏈,外圍是衆多的 Parachain 平行鏈。

再看左側的小圖,Polkadot 網絡的參與者有四種角色:Validator 驗證人、Nominator 提名人、Collator 收集人或者覈對人,Fisherman 釣魚人或者漁夫。

DApp 可以是部署在平行鏈上的智能合約,或者整個平行鏈就一個 DApp。用戶在平行鏈發起交易,交易被收集人收集,打包成區塊,交給一組驗證人去驗證。

這組驗證人並不是來自平行鏈,而是來自中間鏈統一管理的驗證人池,通過隨機分組指定給平行鏈。每條平行鏈都有一個出口隊列和一個入口隊列。如果用戶發起的是跨鏈交易,交易就會被放進出口隊列。再被目標平行鏈的收集人放入其入口隊列。

目標平行鏈的收集人執行交易,生成區塊,由驗證人組敲定。Polkadot 採用混合共識協議,出塊協議的英文縮寫是 BABE,小孩子;敲定協議的縮寫是 GRANDPA,老爺爺。

剛纔講混合共識,有同學可能會問:出塊快、敲定慢,那等待敲定的區塊會不會越來越多?不會的,GRANDPA 每個輪次可以敲定多個區塊,從而追上進度。所以小孩子是活潑好動、步履輕盈;老爺爺是大步流星、一言九鼎。一老一小相得益彰。

除了平行鏈,還有兩類外圍區塊鏈接入中繼鏈。一類是轉接橋,它把現存的、不能直聯的區塊鏈接入中繼鏈,例如以太坊和比特幣等。從中繼鏈的角度看,轉接橋是一條平行鏈。

從以太坊或者比特幣的角度看,轉接橋是一條側鏈。此外,爲了讓系統具有無限的可擴展性,還可以有二級中繼鏈。不過二級中繼目前還只是設想,沒有具體的設計。

我們已經介紹了收集人和驗證人在系統中的作用,那麼提名人和漁夫是做什麼的呢?提名人是 Polkadot 基礎通證 DOT 的持有者,他希望質押 DOT 獲得收益。但是要麼是因爲 DOT 數量少,要麼是缺少運行維護驗證人節點的專業技能。

因此係統提供了另一個參與途徑,就是持幣者選擇他信任的驗證人,把自己的 DOT 通過驗證人來質押,分享驗證人收益。這樣做的好處是,提高整體質押比例,提升系統安全性,同時也使收益分配更加公平。關於 Polkadot 的經濟模型,是個很複雜很有趣的話題,我們就不多說了。

剛剛介紹過分片架構的交易有效性問題,以及舉報獎勵的解決方案,所以漁夫的作用不難理解。他就是監控和舉報非法交易,賺取獎金的角色。聽起來挺簡單,但是做起來極其複雜。

可能有些同學想象中的舉報是這樣的:給 web3 基金會發郵件:我發現有人打包了非法交易,證據見附件,盼復。過些天 web3 基金會回信:您的舉報已被證實,作惡者已伏法,獎金將發到你的地址,非常感謝您對我們工作的支持。

但區塊鏈上的舉報完全不是這個樣子。漁夫是個軟件進程,它監控網絡上的非法行爲,一旦發現就會向區塊鏈提交舉報交易。舉報交易也要經過共識過程,通過 2/3 以上驗證人驗證,打包進區塊,懲罰和獎勵也都是區塊鏈交易。

整個過程是自動地、去中心化地執行。這裏就有很多複雜問題,例如如何對漁夫提供激勵。漁夫就像警察,你可能會認爲那很簡單,抓住一個壞人就發一筆獎金。

那麼有一堆警察天天盯着網絡,沒人敢作惡,警察就一直拿不到獎金。警察有運營成本,要驗證並存儲大量的數據,沒有收入就幹不下去了。警察全改行了,壞人就會出現。那你可能會想,給警察發工資吧,底薪加提成。

好,那我可以聲明自己做警察,領一份底薪。但是我根本不驗證和存儲交易數據,成本就是 0,底薪就是我的利潤。等壞人出現的時候,我說抱歉哈,我沒看到,或者說我硬盤恰好壞了,那麼系統應該怎麼懲罰我呢?

還有就是不能隨便舉報,系統處理舉報需要成本,隨便舉報就成了可以粉塵攻擊的漏洞。另外能否對舉報交易進行舉報,應該怎麼處理等等。所以在去中心化環境中,舉報機制很複雜。Polkadot 的漁夫工作機制,目前我還沒看到具體的說明。

在 Polkadot 網絡中,平行鏈各自承擔交易執行、數據存儲,同時平行鏈之間能夠互操作,也就實現了分片的目標。因此我把 Polkadot 看成是分片擴容方案。可以跟 Serenity 初步比較一下。你會發現 Polkadot 比 Serenity 在技術上更復雜。

Serenity 的分片是同構,採用相同的共識協議,容量也整齊劃一。就像是提供給 DApp 使用的標準集裝箱,規格都一樣,開發者選一個分片,把自己的 DApp 放進去就好了。

Polkadot 是 web3 骨幹網,它不能也不應該要求平行鏈是整齊劃一的。平行鏈可以自行決定使用什麼共識協議、什麼樣的經濟模型和治理模型,自己決定硬件和網絡配置等等。簡而言之平行鏈是自治的,Polkadot 可以看成是平行鏈的聯盟或者聯邦。

Polkadot 中繼鏈要支持異構的平行鏈接入,進而實現互聯互通,複雜度超過 Serenity 的信標鏈。這一技術複雜度帶來的好處是,平行鏈開發的靈活性,無需千鏈一面,可以根據具體的需求和約束,設計開發最優的平行鏈。

十四、殊途同歸 —— Cosmos

兩萬字全解 Polkadot 架構及下一代 DApp 開發技術

下面我們來介紹 Cosmos,從側鏈開始談起。看左上方的圖,A 和 B 是兩條鏈互爲側鏈。也就是說,A 鏈包含 B 鏈的 SPV 輕客戶端,從而 A 鏈能驗證 B 鏈的交易。 反過來 B 鏈也包含 A 鏈的 SPV 輕客戶端,從而 B 鏈能驗證 A 鏈的交易。

互爲側鏈的結果是,發行在 A 鏈和 B 鏈上的通證可以互轉。如果從兩條鏈擴展到多條鏈,A 和 B 變成 A/B/C/D/E/F,一種外推的想法是仍然沿用兩兩互爲側鏈的做法,就形成了左下方的結構。

但是這樣做會到來很多問題,每條鏈都要內置其他所有鏈的輕客戶端,同步其他所有鏈的區塊頭,這當然是很大的負擔。而且每增加一條鏈,都需要在其他所有鏈上做修改。隨着區塊鏈數量的增加,複雜度以 n*(n-1)/2,指數型增長,這顯然是不可行的。

解決的辦法就是改成右上方圖片顯示的結構,中間放一個 Hub,Hub 本是也是區塊鏈,它跟其他所有鏈都互爲側鏈。就是說,每條鏈上的通證都可以轉到 Hub 上,然後通過 Hub 轉到其他鏈上,網絡互聯的複雜度跟區塊鏈數量是線性關係。

這就是 Cosmos 的做法,在 Cosmos 的定義裏,接入 Hub 的鏈稱爲 Zone 分區。分區要接入 Hub 需要兩個條件,第一是符合 Cosmos 標準協議,即 IBC 鏈間通信協議。第二是要求 Zone 具有即時最終性,以確保跨鏈的一致性。

而且 Cosmos 可以支持多個 Hub 的互聯。對於現存的公鏈,可以通過協議適配接入 Cosmos Hub,Cosmos 把協議適配網關稱爲 Peg Zone 錨定分區。最終形成的結構就是右下方圖片展示的樣子。

我們從側鏈出發推演 Cosmos 架構。但是回過頭來看,Cosmos 分區各自承擔交易執行、數據存儲,同時分區之間還能夠互操作,也實現了分片的目標。因此我也把 Cosmos 看成是分片擴容方案。

可能有人對會對這樣分類不贊同。但是沒有關係,Cosmos 就是 Cosmos,分類是爲了更好地理解它。從不同角度理解和闡釋,可以用不同的分類方法,沒有絕對的對和錯。

Cosmos Hub 以及其他用 Cosmos SDK 開發的分區都採用 Tentermint 共識協議,出塊和敲定過程是合一的,只要出塊,就是得到了 2/3 以上驗證人的簽名驗證。這樣做的好處是簡潔快速,出塊時間可以達到秒級甚至亞秒級,而且具有即時最終性。

但是在網絡發生分區的情況下,Tentermint 共識有可能暫停出塊。Cosmos Hub 和分區都有各自的驗證人組,不需要驗證人動態隨機分組。那麼 Cosmos 如何保障跨鏈交易有效性呢?根據我的理解,Cosmos 迴避了這個問題。

Hub 並不能驗證交易有效性,只能驗證存在性。如果某個分區被惡意驗證人控制,那麼用戶在這個分區上的資產是不安全的,可能被盜取。但是這不應該看做是 Cosmos 的漏洞,而是它的設計選擇。

Cosmos 經常被拿來跟 Polkadot 比較,但其實 Polkadot 與 Serenity 在架構上更爲相似。前幾天橙皮書的文章做了三個村莊的比喻,非常貼切。但是從 DApp 開發的角度,尤其是今年和明年的重量級 DApp 開發,主要會從 Polkadot 和 Cosmos 二選一。

從技術上說,Cosmos 要比 Polkadot 或者 Serenity 簡單得多。我這裏說的簡單並非貶義,在滿足需求的前提下,技術方案應該是越簡單越好。那麼 Cosmos 用相對簡單的方案也實現了分片擴容的目的,不是很好嗎?

確實很好,因此我也很看好 Cosmos,它會非常適合某些類型的 DApp。但是正如我們反覆強調的,有所得,必有所失。Cosmos 選擇了簡潔,但在安全性上有所犧牲。PoS 區塊鏈的安全等級是由總市值和質押比例決定。

Polkadot 上線之後,假設 Dot 總市值是 10 億美元,其中一半質押在網絡上,那麼要對 Polkadot 主網進行雙化攻擊,理論上最少需要 1.67 億美元,實際需要的會多得多。顯然是一筆鉅款,因此 Polkadot 網絡非常安全,跨鏈交易有很高的安全保障。

Cosmos 主網上線之後,Atom 通證也會很高的市值,但是網絡質押的 Atom,只保證 Cosmos Hub 的安全。分區和其他 Hub 會發行自己的通證來建立經濟模型,獲得安全保障。

但是分區通常是特定的去中心化應用,其應用規模和市值達不到 Cosmos/Polkadot 這樣的大平臺的等級。因此可以預期,Cosmos 分區的安全等級會低於 Cosmos Hub。

你在 Cosmos 上執行跨鏈交易。需要信任交易的發起分區,目標分區和 Hub,如果跨鏈交易中間經過多個 Hub,那麼經過的每個 Hub 都要值得信任。

一方面是需要信任的區塊鏈變多了,而且其中有些鏈的安全等級可能不高。所以說 Cosmos 沒有做到信任最小化。安全水平降低了,但是降低之後夠不夠用?也許夠也許不夠,還是因人而異、因應用而異。

Cosmos 當然瞭解自身的短板,據說會在未來版本爲分區提供安全保障。但是實現難度會很大。要爲分區提供安全保障,需要大量的驗證人,只能修改共識協議,把出塊和敲定分開,當然還要處理驗證人隨機動態分組、交易有效性等問題。這一番改動下來,Cosmos 和 Polkadot 的複雜度也就差不多了。

十五、對 DApp 的支持對比

兩萬字全解 Polkadot 架構及下一代 DApp 開發技術

那麼 Serenity、Polkadot 和 Cosmos 哪個更適合做 DApp 開發呢?我們來比較一下。

首先 DApp 開發方式,三個鏈都可以用智能合約。Polkadot 和 Cosmos 帶來了新的 DApp 開發方式,就是開發特定應用的區塊鏈。Cosmos 爲應用鏈提供的工具是 Cosmos SDK,目前支持 Go 語言開發。Polkadot 爲應用鏈提供的工具是 Substrate,目前支持 Rust 語言開發。

Substrate 是完整的應用鏈開發工具,具備完整的應用鏈框架,Gavin Wood 演示了在一臺全新的電腦上,15 分鐘發佈出一條應用鏈。另外,Substrate 所有模塊都可以定製或者替換,功能強大而且非常靈活。

相比較而言,Cosmos SDK 要單薄一些,它主要提供 Tendermint 共識引擎、IBC 鏈接通信協議和通證等核心模塊,大部分上層建築需要自行開發。

關於性能,Serenity 每個分片大約是 100tps,仍然是優先處理 gas price 高的交易。Polkadot Hub 應該能達到上千 tps,平行鏈可以自己決定共識算法、硬件和網絡,理論上說沒有性能限制。Cosmos Hub 和絕大多數分區都採用 Tendermint,能夠達到數千 tps。

關於互操作。Serenity 跟以太坊 1.0 是一樣的,智能合約可以相互調用。Polkadot 平行鏈通過 Relay 與其他平行鏈互操作,通過 Bridge 與其他鏈互操作。

Cosmos 分區通過 Hub 可以互轉通證,通過錨定分區與其他鏈互轉通證。IBC 消息也數據字段,就像電子郵件的附件,通過擴展數據字段,分區之間也可以傳遞通證以外的數據。

接入方式 Serenity 跟以太坊 1.0 相同,開發者自行部署智能合約。Polkadot Relay 接入要拍賣插槽,質押數量不菲的 DOT。Cosmos 與 Polkadot 類似,是質押 Atom 拍賣接入資格。

然後是安全性,前面說過 Serenity 的分片就像是標準集裝箱,DApp 放進就行了,安全性由系統保障。與之相對的是 Cosmos,應用鏈不論是否接入 Hub,都是自己保障安全。Substrate 開發的應用鏈是兩個選項,要麼接入 Relay 成爲平行鏈,由 Polkadot 保障安全;要麼獨立運行,自己保障安全。

最後是 DApp 升級,Serenity 和以太坊 1.0 一樣,不支持智能合約升級。可能很多人對此已經習慣了,但我認爲不支持升級是很大的缺陷,而且可能帶來嚴重的安全問題。首先是代碼不可能沒有 bug。

Solidity 等智能合約開發語言對形式化驗證並不友好,即便做形式化驗證,達到 100% 的邏輯路徑覆蓋也不現實。其次 DApp 是互聯網應用,互聯網應用應該隨需應變、迭代進化。

有人會認爲智能合約是約定,所以不能改。其實真實世界的合同,都有經雙方同意可以取消或者修改的條款。想想兩個公司簽了合同,現在雙方都同意修改合同,結果合同本身限制了不可更改,是多麼荒謬的情形。

更不要扯什麼代碼即法律,法律也不是一成不變,可以廢止可以修訂,代碼反而不行,不是很奇怪嗎?結果就是很荒謬,一方面 DApp 有強烈的升級需求;另一方面平臺不支持升級。於是開發者自己想辦法,用 delegateCall 等 rudimentary 的方法,彆彆扭扭地實現了可升級,還美其名曰可升級設計模式。

有了這個辦法,開發者可以不經過用戶同意,甚至在用戶不知情的情況下修改智能合約。那麼代碼即法律還有什麼意義?用戶怎麼才能知道智能合約可升級還是不可升級,哪些邏輯會變哪些不會變?只能自己看代碼。所以難怪以太坊只有這麼少的用戶。反正我自己不夠格使用以太坊 DApp。fomo3d 的合約我研究過,就沒看出來有隨機數漏洞。

Parity 的多重簽名錢包合約的一個小 bug,鎖住了上億美元資金,坑了自己和好多人。如果要透徹研究代碼才能信賴並使用 DApp,那全世界的 DApp 目標用戶,大概也就是數以千計吧。

要開發能夠跟中心化互聯網應用競爭的 DApp,可升級是必須的。而且必須是平臺支持的規範的升級,不能 DApp 各顯神通。類比 Android 平臺,手機 App 就經常升級,但是用戶必須知情並同意,新版本 App 增加了權限需求,要顯示給用戶。

這些都是平臺控制的,手機 App 只能遵循不能饒過。DApp 的升級應該更加規範也更加嚴格,因爲 DApp 管理的是加密資產,而且沒有可信任的中心。Polkadot 和 Cosmos 都允許應用鏈升級,Cosmos 的分區是自己處理升級,Polkadot 的平行鏈可以安全升級。

Polkadot 如何實現平行鏈安全升級,我還沒搞明白。幾周前 Gavin wood 中國行,講了 Trust Wormhole 可信蟲洞,我也沒太聽懂。誰瞭解這部分內容希望能指點一下我。

總而言之,在去中心化的區塊鏈上,實現規範的安全的應用升級非常困難,但是沒有別的選擇,必須支持升級,而且是平臺保障的規範的安全的升級。我認爲在可升級性方面,只有 Polkadot 的方向選擇是正確的。

十六、網絡拓撲比較

兩萬字全解 Polkadot 架構及下一代 DApp 開發技術

下面來談談,Serenity、Polkadot 和 Cosmos 這三個區塊鏈生態在充分發展之後,會形成什麼樣的網絡拓撲。注意邏輯網絡,不是物理網絡。另外網絡充分發展需要時間,這裏討論的是大概 5 年後的圖景,有些內容是根據架構設計所做的推測。

首先看左側,Serenity 網絡像是一個儀仗隊方陣。信標鏈是旗手或者領隊,方隊的每列是一個標準分片。每個分片都可以承載一些 DApp。中間的圖是 Polkadot。Polkadot 網絡是一顆樹,樹根是中繼鏈,可連接多個平行鏈。平行鏈可能是特別業務的應用鏈,也可以是支持智能合約的 DApp 平臺。

另外其他類型的區塊鏈可通過橋接入中繼。分析 Polkadot 架構可知,由於驗證人數量等限制,單箇中繼能支持的平行鏈數量有限。大概是幾十到一百這個量級,很難達到幾百個。

當然即便達到幾百,也不能充分實現 Web3 願景。所以 Polkadot 未來會支持中繼級聯。也就是一級中繼接入根中繼,二級中繼接入一級中繼,從而具有無限擴展能力。

右側圖是 Cosmos。Cosmos 的多個 Hub 可以互聯,每個 Hub 連接多個分區。還有錨定分區對接其他類型的區塊鏈。Cosmos 網絡拓撲與 Polkadot 粗看上去很像,都是樹形結構。但是 Cosmos 的 Hub 和 Hub 之間,沒有誰向誰提供安全保障的問題,所以沒有層級高低。

如果把層級關係看作是連接的方向,那麼 Polkadot 是有向無環圖,Cosmos 是則是無向無環圖。其實 Cosmos 網絡拓撲是可以成環的,應該是爲了避免出現跨鏈消息路由選擇問題,選擇了無環的設計。

相比較而言,我認爲 Serenity 的增長方式和資源分配有點僵化。系統是自上而下式的增長,通過迭代支持更多的分片。DApp 選擇哪個分片上,面臨一些不確定性。例如某個 DApp 非常成功,它需要的處理能力超出了單一分片的容量上限怎麼辦?

目前看是沒有辦法。另外,DApp 上線的時候你選擇了一個相對空閒的分片。結果同一分片土壤出現特別受歡迎的 D App,那麼你的用戶就只能忍受高成本和擁堵。

簡單概括就是區塊鏈計算資源做不到對 DApp 按需分配。Cosmos 和 Polkadot 的增長是自下而上的,不斷有新應用鏈加入,也會有應用鏈退出,資源分配也更加靈活。

Cosmos 跟另外兩個平臺的最大區別是不共享安全性,一定程度上犧牲了信任最小化,這個在前面已經講過了。這麼說 Polkadot 兼具了共享安全和自下而上式地有機增長,是不是就是最好的?Polkadot 確實有這些優點,但是它也有自己的劣勢。

最大的問題我認爲就是平行鏈的接入門檻會很高。按照目前公佈的拍賣計劃,到 2020 年底,只有 24 個接入插槽。你如果開發平行鏈,希望明年上線,就要跟全球衆多團隊競爭這 24 個名額。

當然,未來 edgeware 等智能合約平臺上線後,能夠一定程度上降低 DApp 門檻。相比之下,在 Serenity 上部署 DApp 沒有門檻。Cosmos 也會好很多,因爲 Cosmos Hub 可以支持更多插槽,另外生態系統中會有多個 Hub,形成賣方市場競爭。

從更大的圖景上看,Serenity、Polkadot 和 Cosmos 互聯是可行的,也一定會發生。EOS 等採用 DPoS 的區塊鏈也都可以連接進來,再加上側鏈等二層網絡,異構區塊鏈的互聯網絡將會形成。

十七、辨析「跨鏈」

兩萬字全解 Polkadot 架構及下一代 DApp 開發技術

本次分享已經接近尾聲了,我們纔開始討論跨鏈概念。原因是我認爲「跨鏈」概念有歧義,容易產生誤導。至少我自己被誤導了很長時間。以前看關於 Cosmos 和 Polkadot 的 材料,都是把它們當作跨鏈方案來介紹。

我就想爲什麼要跨鏈?跨鏈能幹什?雖然現在有幾百上千公鏈,但是有幾個有用的?比特幣算一個,有人會加上以太坊 / EOS,有人會加上 ZCash/Monero,反正也就是三五條吧。

就這麼幾條有用的鏈,有什麼可跨的?感覺就是脫了褲子放屁——多此一舉。所以以前我看到介紹 Cosmos 和 Polkadot 的文章,掃一眼標題就過去了,不點進去看。

直到去年 Gavin Wood 在慕尼黑演示 Substrate,我才弄明白 Polkadot 是分而治之的新一代公鏈架構,是 DApp 的新形式。從那以後,我纔開始關注這個領域。

Polkadot 和 Cosmos 設想的區塊鏈未來圖景,不是 one chain fit all 一鏈打遍天下,也不是 one chain rule them all 一鏈君臨天下,而是由衆多異構區塊鏈互鍊形成的網絡。互聯就是區塊鏈之間能夠跨鏈交易,所以跨鏈是異構區塊鏈互聯網的基礎能力。

比特幣、以太坊等公鏈加入到區塊鏈互聯網,是成果之一,而不是跨鏈的全部內涵。所以我的看法是,跨鏈概念沒有錯,但是如果理解成爲跨而跨,就沒有抓住重點。

把異構區塊鏈實現跨鏈交易定義爲跨鏈。那麼我們來說說什麼不是跨鏈,或者說市面上有哪些所謂的跨鏈是在掛羊頭賣狗肉。首先跨鏈必須是參與的兩條或者多條區塊鏈的狀態發生了一致性的改變,都是寫操作。

如果一邊是讀,另一邊是寫,或者說是根據一個區塊鏈的數據去修改另一個區塊鏈的狀態,這不叫跨鏈。當然從多個鏈讀數據,更加不是跨鏈。

還有一個要求,不但要實現跨鏈交易,而且跨鏈交易應該是去信任的。還是拿 Cosmos 通證跨鏈轉帳舉例,從 A 分區經過 Hub 轉 10 個通證到 B 分區,你需要相信 A 分區、Hub 和 B 分區三個區塊鏈網絡。

這三個網絡到底值不值信任呢?你需要自己判斷,如果去中心化程度高, PoS 質押通證的總價高,被攻擊的難度大,就值得信任。有些所謂的跨鏈方案,Hub 本身不是區塊鏈,而是個網關,那麼網關值得信任嗎?

答案是不知道,網關是單一實體運營的計算設備。信任網關的前提是信任運營實體。例如我們把錢存在工商銀行,通過支付寶來花錢,也沒什麼不妥。阿里和工商銀行都值得信任,所以他們運營的網關也值得信任。

但是無論網關是否值得信任,都不屬於我這裏所談的跨鏈。我們說的跨鏈,Hub 要採用分佈式賬本技術,而且是去中心化的運營,從而實現信任最小化。

以後再看到所謂的跨鏈項目,可以自行分辨,是不是支持異構區塊鏈的去中心化跨鏈交易。如果不能支持,那麼它所說跨鏈跟 Cosmos 和 Polkadot 不是同一類概念。

十八、下一代 DApp 開發技術

兩萬字全解 Polkadot 架構及下一代 DApp 開發技術

我個人認爲目前已經落地的 DApp 只有一個,就是比特幣。比特幣是去中心化的價值存儲型貨幣,或者叫數字黃金。因爲是價值存儲型的,所以它對性能的要求很低。

在未來幾年,去中心化的支付結算型貨幣和交易所很有可能落地。支付結算型貨幣的幣值,應該跟直接或者間接地跟購買力掛鉤。那麼現在 usdt、tusd、摩根大通幣,以及未來的 facebook 幣、央行加密法幣,都是中心化的。做不到去信任、無許可和抗審查。

閃電網絡和 MakerDAO 是重要的嘗試,有可能帶來突破。貨幣、借貸、資產發行、資產交易、保險、衍生品 … 我們離顛覆傳統金融、改變世界也只隔着幾個真正落地的 DApp。隨着區塊鏈擴容,基礎設施給力了,DApp 就可能迎來真正的爆發。

程序員要怎樣才能成爲 DApp 弄潮兒,我們梳理下一代 DApp 開發技術。注意 DApp 是互聯網應用。互聯網開發的後端、前端、移動端、瀏覽器、桌面端技術仍然有效,但不在討論範圍之內,我們只談實現去中心化的技術。

三個擴容思路,每個都有多種實現,我只列出代表性項目。代議制擴容的代表是 EOS 和波場。分層擴容分爲狀態通道和側鏈兩個分支,狀態通道的方案有 Celer Network、Counterfactual 等,側鏈有 Loom、OmiseGo 等。分片的三個典型方案,Serenity、Polkadot 和 Cosmos 已經逐一介紹過了。

這麼看來,下一代 DApp 開發技術似乎有很多中。其實不是,DApp 開發目前只有種,就是智能合約。智能合約有兩個主流的方案,EVM 和 Wasm。我們列出的項目,基本都支持 EVM,現在或者未來會支持 Wasm。

EVM 的主力開發語言是 Solidity,圍繞 Solidity 已經形成生態,包括 Truffle/Remix/OpenZepplin 等工具、大量的技術資料、實例、社區討論答疑等等,而且也有相當一批程序員會 Solidity 語言。所以掌握了 Solidity,可以確保在大多數公鏈上開發 DApp。

目前唯一的例外是 EOS,EOS 不支持 EVM,而是一步到位使用 wasm。wasm 會是未來智能合約開發的標準,可以支持用多種編程語言開發智能合約,包括 java\\c++\\go\\rust 等等。

Cosmos 和 Polkadot 提供了開發 DApp 的第二種方式,就是開發應用區塊鏈。與智能合約相比,應用鏈的優勢是具有極大的靈活性。開發者可以自行選擇或者定製共識算法、治理模型、經濟模型等等,並根據實際需求配置硬件和網絡。

但是另一方面,應用鏈開發、運營的成本會顯著高於智能合約。例如要部署 Cosmos 的分區鏈,至少需要 4 臺以上的主機,而且要質押相當數量的 Atom 通證,才能接入 Hub。可以預計,達到一定規模的團隊,纔有足夠的資源開發並運營 Cosmos 或者 Polkadot 的應用鏈。

簡單總結就是:下一代 DApp 有兩類開發技術,輕量級的智能合約,和重量級的應用鏈。個人或者小型創業團隊會主要使用智能合約。大型企業或者有充裕資源支持的創業項目,會使用應用鏈。

還有一種合理的做法是,先用智能合約實現 DApp,在獲得驗證和反饋之後,再開發功能更完善、使用體驗更好的應用鏈。

十九、開發者如何選擇?

兩萬字全解 Polkadot 架構及下一代 DApp 開發技術

後端或者全棧工程師如何選擇 DApp 開發技術呢?我認爲未來的區塊鏈世界會是異構區塊鏈互聯的網絡,多個平臺都有會各自的生存空間,不必輕言誰將取代誰。

所以我的建議是:主要考慮當下的條件來選擇技術路線,例如當前可用平臺的能力,團隊成員的技能等等。而不必過於糾結未來的不確定性。

如果項目已經啓動,那就沿既定路線繼續走下去。如果還未開始,首先明確是開發公鏈 DApp 還是開發企業解決方案。如果是開發公鏈 DApp,那麼是否需要跟現存 DApp 互操作。如果是,那麼應該選擇在現存 DApp 相同的公鏈上開發。

就是說你需要互操作的 DApp 在以太坊上,你就在以太坊上開發。在 EOS 上,你就在 EOS 上開發。有人可能會問,不是可以跨鏈嗎?跨鏈是非常複雜的技術,而且肯定不是免費的。在滿足需求的前提下,實現方案應該儘量簡單。所以能避免跨鏈,當然應該避免。

那如果不需要與現有的 DApp 互操作呢?這裏隱含了一個問題是,你的 DApp 會不會跟未來的 DApp 互操作?或者別人的 DApp 會不會要跟你的 DApp 互操作。

舉個例子,你開發一個通證合約,作爲公司業務積分系統。如果你們公司的積分使用範圍很大,是不是可以在去中心化交易所進行交易,是不是可以作爲資產抵押給貸款 DApp?成功的 DApp 應該儘量融入價值互聯網的大生態。所以 DApp 互操作不是一個選項,而是 DApp 的基本需求,只是不一定要跟現存的 DApp 互操作。

下一個問題是:DApp 是不是隻需要管理加密通證?如果回答是肯定的,應該優先選擇 Cosmos,如果回答是否定的,則應該選擇 Substrate。爲什麼呢?我們前面講過,Cosmos 能夠實現跨鏈通證轉移,而 Polkadot 能實現任意形式的 DApp 互操作。

有人可能會說,Polkadot 多強大靈活啊。這個我同意,但是大家應該理解,世界是公平的,沒有免費的午餐。強大靈活的代價就是複雜和高成本。

Cosmos 在架構上比 Polkadot 要簡單很多。因此我可以有把握地推斷,至少在前期 Cosmos 會比 Polkadot 更可靠,而且使用成本更低。所以如果 Cosmos 滿足需求,就應該選它。

如果業務需求超出了加密通證的範疇,可以選擇 Substrate。另外前面有個分支,就是開發企業區塊鏈應用,或者說開發聯盟鏈應該選什麼?我認爲也應該選擇 Substrate。

爲什麼不選 Hyperlegder Fabric 或者以太坊呢?因爲商業公司推動的技術平臺,註定競爭不過主流的開放平臺。至於說用以太坊開發聯盟鏈,我認爲靈活性不夠。

企業業務通常很複雜,對性能、可管理性等有很高的要求,而且常常需要快速迭代。Substrate 是完整的區塊鏈框架,高度模塊化和可定製化。Rust 語言側重安全和性能,也非常適合開發關鍵業務系統。

二十、Rust 語言

兩萬字全解 Polkadot 架構及下一代 DApp 開發技術

做 Polkadot/Substrate 開發,繞不開的問題是 Rust 語言。在我二十多年的開發生涯中,遇到過極少數能快速掌握新語言的程序員。但是絕大多數程序員,包括我自己,掌握一門開發語言,熟悉標準庫和開發框架,都需要很長時間。

所以學習一門新語言,對我來說,是個艱難的決定。近些年湧現出了很多開發語言,其中 Rust 語言以學習曲線陡峭而著稱。到底值不值得花大量的時間來學習掌握 Rust 語言呢?作爲一名 Rust 語言的初學者,我談談自己的看法。

首先是 Rust 語言很棒,但是尚未流行。這不是我個人的看法。2019 年 Stack Overflow 的調查顯示,按流行程度排名,Rust 只能排在第 21 名,左邊這張圖只顯示了前 16 名,所以看不到 Rust。

另外 Tiobe 編程語言指數排名,Rust 目前排在第 34 名。再看右邊的圖,在 Stack Overflow 調查最受程序員喜愛的開發語言排行榜上,Rust 高居第一。而且這是 Rust 第連續四年排名第一,考慮到 Rust1.0 版是 2015 才發佈,可以說 Rust 正式面世以來,一直是最受程序員喜愛的語言。

而且大家知道,一門編程語言,追求高性能,和讓開發者輕鬆愜意,通常不可兼得。比如 Java 和 Python 程序員不需要考慮內存管理,當然降低了學習和開發的負擔,但是系統就要處理垃圾回收,帶來性能上問題。

反之,c/c++需要程序員自己管理內存,性能可以達到最優,但是前提是要把程序寫對,增大了開發的難度。但是 Rust 似乎魚和熊掌兼得,即達到了跟 c/c++相同等級的性能,還能受到程序員的喜愛。

第二個看法是,Rust 語言適合高級程序員開發平臺型的項目。Rust 語言非常重視性能和安全,它試圖通過語言規範,或者說編譯器,來引導程序員寫出高效安全的代碼。熟悉了 Rust 的用法,能自然而然地開發出高性能和高度可靠的系統,不妨稱爲 Rust 之道。

Rust 之道認爲實現某個目的通常有一種最好的方式,Rust 試圖在語言級別引導或者強制你採用最好的方式。如果不按照 Rust 之道來編碼,它就讓你連編譯都通不過。不像 Javascript 等語言,總是有很多種選擇,可以按自己的習慣,怎麼寫都可以。

當然代碼質量可能良莠不齊,而且可維護性很差。學習並掌握 Rust 之道,需要理解一些重要的編程概念,比如對象的所有權等等。沒有堅實的開發經驗,很難掌握。這也就是大家認爲 Rust 語言學習曲線陡峭的原因。

如果不是開發對性能和安全要求很高的平臺級項目,用 Rust 有點殺雞用牛刀。因爲項目在性能和安全上的收益,不一定能抵消採用新開發語言導致的成本。

如果要開發平臺級系統或者關鍵業務系統,Rust 就值得考慮。另外學習 Rust 語言可以帶動自己加深對內存、線程、異步、閉包、函數式等高級開發概念的理解,對開發能力的提升有莫大好處。

所以簡單總結一下,就是如果你有一定的開發經驗,未來可能或者有志於開發平臺型的系統,當然就包括區塊鏈開發,那麼 Rust 語言就值得你投入時間去學習掌握。

兩萬字全解 Polkadot 架構及下一代 DApp 開發技術

我用羅素的名言作爲本次分享的結束語——須知參差多態,乃幸福本源。真正理解並欣賞 Polkadot 和 Cosmos 設計理念的人,都不會是最大化主義者,也不會認爲 Polkadot 的目標是替代以太坊。

至少以太坊基金會和 Parity 公司都不這麼認爲。Parity 公司一直是以太坊生態的重要支柱之一,他們也在積極參與 Serenity 開發。

前些時候,以太坊基金會向 Parity 公司支付了 500 萬美元,即是對 Parity 多年支持以太坊的感謝,也是資助他們繼續開發維護以太坊節點軟件。我對比特神教已經見怪不怪了,至少我能理解他們爲什麼那麼想那麼說。

但是現在以太坊生態裏,也開始出現以太神教的趨向,就有點不可理喻。開放是以太坊願景的基礎,以太坊也帶領我們看到了去中心化價值互聯網的可能性。所以我認爲支持以太坊,但是反對其他區塊鏈,是一種自相矛盾。

前面也談過,人們對去中心化應用的需求是多樣化的。Serenity、Polkadot、Cosmos 和 EOS,還有其他 DApp 平臺公鏈,都做了不一樣的設計選擇,或者說是不同的折中。因此他們會非常適用於某些需求,而不太適用於其他需求。

互聯互通是大勢所趨,任何一個生態如果選擇孤立發展,就會被區塊鏈互聯網產生巨大的網絡效應所擠壓,最終被淘汰。因此我們可以期待,區塊鏈的未來會百花齊放,更加參差多態,希望區塊鏈和去中心化應用成爲人類的幸福之源。