乾貨 | 什麼是 Substrate?
如果你實時關注了 Polkadot 的進展狀況,你可能會經常看到“Substrate”這個詞。它是 Polkadot 專案的重要組成部分,但是關於它的資訊卻非常貧乏。白皮書裡沒有,黃皮書裡也沒有,至少沒有用 “Substrate” 這個名字,且其細節也在不斷變動。從比較抽象的層面來看,Substrate 是一個通過最新研究的區塊鏈技術建立加密貨幣和其他去中心化系統的框架。但這對於理解它,並沒有幫助,至少對我來說沒有幫助。
我認為理解 Parity Substrate 最重要的一步是, Parity Substrate 是獨立於 Polkadot 的專案。儘管 Polkadot 是基於 Substrate 的專案,而且那些基於 Substrate 其他專案也能在 Polkadot 上執行,你現在就可以用 Substrate 構建新的一條區塊鏈,不用等待 Polkadot 開發完成,甚至不用等概念驗證的釋出,就可以開始使用此框架開發區塊鏈。
Substrate 幫您解決了哪些問題
那麼什麼是 Substrate 呢?你可以將其看作類似於 Express 或其他 Web 應用程式的框架,但它是用於構建分散式或去中心化的系統的框架,可以構建例如加密貨幣專案,或訊息匯流排系統。正如大多數 We b應用程式不需要重新實現自己的 HTTP 協議一樣,我們認為,對於每一個團隊建立新鏈時,也不需要從頭實現網路和共識的程式碼,這浪費精力的。更不用提為了實現業務邏輯,必須僱用的密碼學家、安全研究員、網路工程師、開發人員(以協調更新)等等了。如果你想使用 Substrate 來構建一個新專案,只需要在程式碼中實現少量的函式回撥,然後就能獲得以下特性:
- 共識機制,確定性(Finality),出塊投票機制。即使你不需要加密貨幣,甚至是構建不需要區塊鏈的專案,這些特性也是可用的——這意味著你將獲得ofollow,noindex">拜占庭容錯特性 ,也就是說網路中部分節點宕機、失效或者被惡意控制時,你的整個網路系統仍然可以繼續正常工作。
- 網路,節點發現、同步等等。
- 一個有效的、確定的、沙箱式的WebAssembly 執行時,可以用於執行智慧合約,以及其他基於 Substrate 的專案。當然你也可以不用 WebAssembly ,自己寫虛擬機器直譯器,但是我們堅信使用 WebAssembly 執行時的好處,能讓你利用我們全球社群開發的工具與我們在 WebAssembly 的工作成果。
- 流暢執行一個瀏覽器節點,並具有與其他型別的節點通訊的能力。
- 跨平臺的資料庫/檔案儲存系統,還支援瀏覽器環境;
- 客戶端平滑更新——任何可能影響共識的更新都是通過將程式碼編譯成 WebAssembly 的執行檔案,然後把它作為網路上的一條訊息進行部署。不僅如此,你可以儲存多個你想編譯為本地的不同版本的共識程式碼,Substrate 會去處理複雜的正在執行的本機程式碼與釋出的 WebAssembly 部署環境的差異。你將獲得原生代碼所擁有的速度,但是因為 WebAssembly 有回退機制,可以以自己的速度部署本地版本,而且不會有硬分叉或者共識問題。
- 能在 Polkadot 釋出時立即執行你自己的專案。儘管基於 Substrate 的專案可以編譯成一個專案對應一個獨立的客戶端程式(就像現有的區塊鏈專案一樣),但是因為 Polkadot 實現了 Substrate API,你可以利用 Polkadot 提供的安全性和鏈之間的互操作性。Polkadot 本身就是基於 Substrate 構建的,允許我們快速獲得 Substrate 框架中任何漏洞的反饋,允許我們執行 Polkadot 測試網,甚至再啟動第二個 Polkadot 鏈作為側鏈。如果你不知道 Polkadot ,或者你還沒有充分了解 Polkadot 的優點,你可以看Polkadot 的這篇部落格 (中譯本見文末超連結《區塊鏈創新者的利器》)。
您需要自己實現的部分
那你需要自己實現哪些內容呢?本質上來說,Substrate 只是你的狀態機,包含交易之類的東西。為了使 Substrate 儘可能的通用,它本身沒有交易。相反,它有我們所謂的能夠儲存任何資料的、只是二進位制塊的“外部交易(extrinsics)”。對於大多數鏈而言,這些 extrinsics 包含交易,但是你並不需要那樣去實現。你完全可以從網路中去掉貨幣的概念,然後基於 Substrate 建立一個去中心化的 Erlang 模式的 actor 模型併發系統,併為網路初始化一組可信的機構,驗證網路的正確行為。假設你確實需要貨幣和交易,但是,交易格式可能並不重要——只需要一個交換格式和可以訪問的一個數據庫。甚至 Substrate 比其他分散式體系結構(就像微服務)更容易——因為程式碼和資料儲存在同一個位置,你不需要實現交易的後向相容,僅實現儲存就好。對於有私有交易的鏈來說,實現起來可能會更加複雜,所有東西都沒有最終確定,你會在不同的地方看到不同的表述,但是,關於你需要實現什麼來啟動並執行一個完整的區塊鏈,下面有一個簡單的解釋:
-
基於上一區塊的區塊頭,構造區塊的函式。區塊頭包含:
- 區塊高度;
- 區塊狀態的加密確認,對於輕客戶端驗證區塊是否正確十分重要。加密確認的作用類似於雜湊,使用者無法在不作廢加密確認的情況下改變區塊狀態;
- 區塊中所有交易的加密確認,可以防止交易被更改;
- 父塊的雜湊值;
- 一些額外的任意資料。可以用於客戶端的更新——因為輕客戶端只同步區塊頭,如果你想更新,你不能以交易的形式傳送,輕客戶端收不到
- 一個把交易加到區塊裡的函式。這個函式也要同時更新鏈的狀態(例如賬戶餘額);
- 生成新區塊的函式,新生成的區塊可以在網路中傳播
- 驗證區塊的函式。由全節點執行,在接收這些狀態改變之前,用來確認收到的塊都是合法的。例如,在一個價值鏈中,可以檢查有沒有人嘗試傳送超出他們餘額的交易。
這種設計的一個缺點是,你必須手動確認在建立塊時完成的狀態轉換與驗證現有塊時完成的狀態轉換保持同步。如果你不這樣做,會產生共識錯誤。雖然將來可能會改變該方式,但現在還需要這麼做,不過在實踐中可能不是什麼大問題,因為你可以將交易執行委託給一個公共函式來處理。
此外,你需要自己維護一個驗證者集合。包含 PoA 和 PoS 共識驗證,不過我們目前還沒有支援 PoW 的驗證。驗證者集合是一個公鑰的列表,其對應的私鑰應被視為可對給定區塊簽名的有效私鑰。該集合可以變,但每個區塊都由它建立時選擇的集合進行驗證。你不必處理驗證者投票的困難問題,甚至不必處理他們對每個“區塊”的投票,這是由 Substrate 自動處理的。驗證者集合可大可小,但是這裡有一個權衡:在區塊達到確定性(即不可逆)之前,驗證者越少,它們之間就越容易勾結越容易通過驗證,驗證者越多,驗證耗費越多。
我們不能讓 Substrate 自動處理 PoS 共識,因為 PoS 依賴於具體專案,例如包含價值代幣的,但並非所有專案都包含。測試網的代幣可能就故意設計成沒有價值的,而基於 Substrate 實現訊息匯流排的專案可能根本沒有代幣。然而,基於 Substrate 編寫一個強制使用代幣的庫將很容易,並自動為您提供交易處理和 PoS 共識。關於 Substrate 的一點是,在它上面構建更高階的庫相對容易。即使用 Substrate 構建新的區塊鏈時也可以得到很多,但是它仍然是一組相對最小的原語,並不真正打算直接使用。相反,它應該作為一個專案模組,其他功能可以被分解成幫助庫。雖然細節尚未得到證實,但 Polkadot 並不是唯一一個基於 Substrate 的鏈;隨著 Substrate 平臺的成熟,開發人員可以構建更多的庫,使得構建新鏈像開發 web 應用程式一樣簡單。
我知道科技文章中的“即將到來”就跟政客的承諾一樣不值得信賴,但我還是要以即將到來作為結束語。雖然基於 Substrate 的專案已經成為可能,但我們目前缺少學習材料。現在,如果你還不是 Polkadot 團隊的成員,很難理解本文講的東西。不過,我們正致力於此,所以如果你對其中任何一項感興趣的話,那麼請密切關注即將到來的 Substrate 教程和文件。
深度資源
視訊:Gavin Wood 在視界 2018 中介紹 Substrate
視訊:Rob Habermeier 在柏林的 Truebit Meetup 中介紹 Substrate
注 1:當然,實際上,你可能希望最終強制實現向後相容,外部工具可以輕鬆地與你的鏈進行互動,但是當你在開發時,可以按照自己的喜好來快速地實現相容性。即使你確實需要向後相容,實現也不會很困難,你可以通過 protobuf 免費獲得有效的向後相容儲存。
注 2:作為這種效應退化的一個例子,像比特幣或 Ethereum 這樣的純 PoW 鏈根本不能具有 Finality,因為驗證者的可能集合是無限的。
注 3:例如,一個簡單的 PoS 鏈,可能每一個區塊就設定一次驗證者集合:選擇 100 個保證金最高的賬戶,並且在你有不正當行為時,罰沒他們的保證金。
原文連結:https://www.parity.io/what-is-substrate/
作者:Jack Fransham
翻譯&校對:劉豔安 & Elisa