如果你實時關注了 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),出塊投票機制。即使你不需要加密貨幣,甚至是構建不需要區塊鏈的項目,這些特性也是可用的——這意味著你將獲得拜占庭容錯特性,也就是說網絡中部分節點宕機、失效或者被惡意控制時,你的整個網絡系統仍然可以繼續正常工作。
網絡,節點發現、同步等等。
一個有效的、確定的、沙箱式的 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 比其他分布式體系結構(就像微服務)更容易——因為代碼和數據存儲在同一個位置,你不需要實現交易的后向兼容 [1],僅實現存儲就好。對于有私有交易的鏈來說,實現起來可能會更加復雜,所有東西都沒有最終確定,你會在不同的地方看到不同的表述,但是,關于你需要實現什么來啟動并運行一個完整的區塊鏈,下面有一個簡單的解釋:
基于上一區塊的區塊頭,構造區塊的函數。區塊頭包含:
區塊高度;
區塊狀態的加密確認,對于輕客戶端驗證區塊是否正確十分重要。加密確認的作用類似于哈希,用戶無法在不作廢加密確認的情況下改變區塊狀態;
區塊中所有交易的加密確認,可以防止交易被更改;
父塊的哈希值;
一些額外的任意數據。可以用于客戶端的更新——因為輕客戶端只同步區塊頭,如果你想更新,你不能以交易的形式發送,輕客戶端收不到
一個把交易加到區塊里的函數。這個函數也要同時更新鏈的狀態(例如賬戶余額);
生成新區塊的函數,新生成的區塊可以在網絡中傳播
驗證區塊的函數。由全節點運行,在接收這些狀態改變之前,用來確認收到的塊都是合法的。例如,在一個價值鏈中,可以檢查有沒有人嘗試發送超出他們余額的交易。
這種設計的一個缺點是,你必須手動確認在創建塊時完成的狀態轉換與驗證現有塊時完成的狀態轉換保持同步。如果你不這樣做,會產生共識錯誤。雖然將來可能會改變該方式,但現在還需要這么做,不過在實踐中可能不是什么大問題,因為你可以將交易執行委托給一個公共函數來處理。
此外,你需要自己維護一個驗證者集合。包含 PoA 和 PoS 共識驗證,不過我們目前還沒有支持 PoW 的驗證。驗證者集合是一個公鑰的列表,其對應的私鑰應被視為可對給定區塊簽名的有效私鑰。該集合可以變,但每個區塊都由它創建時選擇的集合進行驗證。你不必處理驗證者投票的困難問題,甚至不必處理他們對每個“區塊”的投票,這是由 Substrate 自動處理的。驗證者集合可大可小,但是這里有一個權衡:在區塊達到確定性(即不可逆)之前,驗證者越少,它們之間就越容易勾結越容易通過驗證,驗證者越多,驗證耗費越多 [2]。
我們不能讓 Substrate 自動處理 PoS 共識,因為 PoS 依賴于具體項目,例如包含價值代幣的,但并非所有項目都包含。測試網的代幣可能就故意設計成沒有價值的,而基于 Substrate 實現消息總線的項目可能根本沒有代幣。然而,基于 Substrate 編寫一個強制使用代幣的庫將很容易,并自動為您提供交易處理和 PoS 共識[3]。關于 Substrate 的一點是,在它上面構建更高級的庫相對容易。即使用 Substrate 構建新的區塊鏈時也可以得到很多,但是它仍然是一組相對最小的原語,并不真正打算直接使用。相反,它應該作為一個項目模塊,其他功能可以被分解成幫助庫。雖然細節尚未得到證實,但 Polkadot 并不是唯一一個基于 Substrate 的鏈;隨著 Substrate 平臺的成熟,開發人員可以構建更多的庫,使得構建新鏈像開發 web 應用程序一樣簡單。
我知道科技文章中的“即將到來”就跟政客的承諾一樣不值得信賴,但我還是要以即將到來作為結束語。雖然基于 Substrate 的項目已經成為可能,但我們目前缺少學習材料。現在,如果你還不是 Polkadot 團隊的成員,很難理解本文講的東西。不過,我們正致力于此,所以如果你對其中任何一項感興趣的話,那么請密切關注即將到來的 Substrate 教程和文檔。
注 1:當然,實際上,你可能希望最終強制實現向后兼容,外部工具可以輕松地與你的鏈進行交互,但是當你在開發時,可以按照自己的喜好來快速地實現兼容性。即使你確實需要向后兼容,實現也不會很困難,你可以通過 protobuf 免費獲得有效的向后兼容存儲。
注 2:作為這種效應退化的一個例子,像比特幣或 Ethereum 這樣的純 PoW 鏈根本不能具有 Finality,因為驗證者的可能集合是無限的。
注 3:例如,一個簡單的 PoS 鏈,可能每一個區塊就設置一次驗證者集合:選擇 100 個保證金最高的賬戶,并且在你有不正當行為時,罰沒他們的保證金。
原文鏈接: https://www.parity.io/what-is-substrate/
作者: Jack Fransham
翻譯&校對: 劉艷安 & Elisa
稿源(譯):以太坊愛好者,原文鏈接(https://ethfans.org/ajian1984/articles/35948)
领取专属 10元无门槛券
私享最新 技术干货