區塊鏈研究實驗室| 關於polkadot的substrate與runtime編譯教程-part2

json文件的chain spec

chainspec JSON是一個大的JSON對象,通過substrate build-spec命令生成。此命令通過引用節點的導入runtime模塊並查找需要定義的公開配置來工作。這些將是空值或提供默認值。

本質上,runtime模塊可以依賴於“創世配置”,換句話說,我們在區塊鏈首次初始化和構建其狀態時提供的配置。這一狀態是通過創世地塊-第一個生產的區塊鏈啓動的。chainspec json文件的任務是定義這個初始狀態。

一旦生成,我們可以在運行節點之前打開此chainspec chain並修改任何我們認爲必要的值。

注意:如果我們的鏈寫了我們不再需要的狀態呢?也許我們已經更新了一個模塊,或者任何鏈配置,並且想要反映來自Genesis塊的更改?我們可以清除鏈-刪除塊歷史-有效地重置節點。

您的節點爲此提供了purge-chain命令,通常用於開發工作流:

# optional --dev flag to specify development chain
substrate purge-chain --dev

除此之外,框架還提供了三個默認的chain“spec”(pre-filled configurations),它們根據我們是運行節點進行測試還是生產目的來定義一些基本值。

實際上,默認情況下提供了三個spec:dev,local和staging:

  • dev spec是離實際用例最遠的規範,主要配置爲幫助您使用鏈。我們爲您提供了一系列帳戶,併爲所有預打包的runtime模塊提供了配置。

  • local spec類似於dev規範,在private network substrate教程中使用,由parity託管。假設您希望在本地測試多用戶場景,它會爲多個帳戶提供“權限”。

  • staging是一個更保守的規範,定義了有限數量的帳戶,並省略了特定於模塊的配置。這是您在構建生產鏈時選擇的規範。


我們可以做的是使用substrate build-spec命令基於這些提供的選項之一構建新的chain spec,將結果輸出到單獨的文件。如果我想複製我自己的鏈的開發chain spec,我可以運行以下命令,在我的主目錄中的新my-chianspec.json文件中輸出規範:

substrate build-spec --chain=dev > ~/my-chainspec.json

在編輯器中打開此文件以查看可用的配置選項。

注意:您可能希望摺疊genesis.system.runtime區塊,其中包含一個無法讀取的運行時區塊。

id字段可以修改爲您自己的名稱,以及名稱字段,這是一個更易於理解的chain spec名稱。一些值得注意的常見選項包括:

遙測端點(Telemetry endpoints):通過遙測端點爲遙測服務提供端點。這將允許您使用已連接的節點填充UI,與Polkadot遙測不同。

在您的節點處理原生令牌的情況下,提供初始帳戶的餘額列表。

抵押配置(staking configuration):鏈支持該功能。配置選項,如初始驗證器帳戶、驗證器和存儲變量。

最終,根據runtime包含的模塊,還會有各種其他變量。幫助您熟悉chain spec文件的建議方法是參考主substrate節點chain spec。

substrate build-spec --chain ~/chainspec.json --raw > ~/mychain.json

最後,爲了運行我們的區塊鏈,我們提供了這種chain spec的substrate。從這裏我們將假設您正在運行自定義編譯的Substrate節點,我們將<node_path>替換爲該節點的運行時。

<node_path> --chain ~/mychain.json --validator

注意:您的鏈開始生成區塊需要驗證者標誌。

接下來讓我們看看初始化和編譯自定義Substrate節點。

初始化substate節點

到目前爲止,我們一直在使用通過安裝腳本獲得的已編譯substrate節點。這對於測試開發鏈是非常友好的。但是它限制了我們引入自己的runtime模塊和自定義配置。爲此,我們需要下載substrate源代碼。

我們有兩種方法可以開始使用我們自己的定製substrate鏈:

1、下載易於配置的節點模板(例如,從第一部分完整安裝中下載的測試網節點模板,或特定供的Substrate Kitties節點)。

2、使用Substrate Scripts,下載官方節點模板,一個簡單的Substrate節點腳本,其中包含準備好進行runtiem模板。我們可以使用我們之前安裝的Substrate Scripts來完成這項工作。

使用以下命令生成新節點模板:

// substrate-node-new <node_name> <author>
substrate-node-new my-node "Ross Bulat"

這可能需要一些時間,具體取決於您的系統 - 將獲取和編譯最新的Substrate源代碼。

完成後,節點的運行時現在可以通過lib.rs文件在runtime/src文件夾中編輯。其中還包括一個runtime模塊的模板,模板爲template.rs。接下來我們將查看一個runtime模塊。

構建自定義節點

在節點目錄中,使用附帶的build.sh腳本將節點編譯爲wasm,然後使用cargo編譯binary文件:

# build wasm
./scripts/build.sh
# build binary
cargo build --release

現在將在節點的./target/release/目錄中編譯節點。

在我們使用substrate調用特定於節點的命令的地方,我們現在可以參考我們新建的binary文件,在我們的定製鏈上運行命令。要清除鏈並重新運行它,我們將使用binary文件:

# clear chain state
./target/release/<node_name> purge-chain --dev
# run in dev mode
./target/release/<node_name> --dev

我們在這裏介紹的最後一個主題是runtime模塊。讓我們探討它們是什麼以及如何將它們包含在Substrate節點中。

介紹substrate的runtime模塊

什麼賦予Substrate實用性是一種通用的模塊化結構,允許開發人員將功能插入其runtime,從而創建符合其要求的自定義區塊鏈。

注意:Substrate運行時的另一個術語是狀態轉換函數或STF。這實際上是執行塊的函數,導致區塊鏈發生狀態更改。

這些功能包稱爲模塊,或者更具體地說,是runtime模塊。預先與Substrate一起打包的這些runtime模塊系列共同形成了一個模塊目錄,稱爲substrate的runtime模塊庫或SRML。

這些模塊非常有用。它們爲我們期望從其他區塊鏈框架獲得的一系列功能添加了功能,並且可以在github上瀏覽。讓這些模塊隨時可用可以避免開發人員重新發明輪子——在實現了全新功能的地方,它們也可以作爲runtime模塊開發。

以下是一些可用的模塊:

  1. assets:爲可替代資產提供支持的模塊——想想ERC20代幣。

  2. balance:爲管理賬戶餘額提供支持的模塊。

  3. Staking:一個模塊,提供管理網絡維護者所關注資金的功能。

您會注意到,每個模塊都被格式化爲Rust crate,旨在導入到Substrate runtime環境中。

每個SRML模塊都會被打包起來,並在模塊名稱前面加上srml_前綴,每個模塊都可以在Parity的crate庫的左側菜單中找到。

模塊結構概述

每個模塊都在自己的src / lib.rs文件中定義符合特定的結構。我們已經可以看到Substrate模塊的高級特性:

模塊可以定義爲一個文件、module-name.rs或更常見的lib.rs。模塊還可以有其他支持文件,通常都位於特定目錄中。

模塊必須符合特定結構,依賴於特定substrate API。

這最後一點究竟意味着什麼?嗯,這取決於你的模塊實際做了什麼。模塊爲區塊鏈提供了功能 - 我們已經知道了很多 - 但是這個功能可以以一系列組件的形式出現:

事件(event):模塊可以定義在滿足特定條件時要調用的自定義事件 - 當您製作新的不可替換的令牌時,可能是TokenCreated事件。事件包含在decl_event!marco:

存儲(storage):模塊可以定義要在鏈上持久化的數據結構,如映射、列表等。我們實際上可以存儲一系列數據類型,其中大部分都在這裏記錄。存儲項在decl_storage! macro:  

Dispatchable函數:可以在runtime通過JSON RPC調用執行的公共函數。所有可調度函數都包含origin參數,其中包含有關函數調用源的信息,例如調用者的公共地址和其他元數據。

如果我們查看Assets模塊可調度函數,我們可以看到爲我們定義了issue,transfer和destroy。可調度函數通過帳戶調用。我們將進一步使用特定工具管理帳戶。

public或private函數:模塊可以提供可以從runtime環境中的任何位置調用的公共函數,以及只能在模塊實現中調用的私有函數。這些都不是可調度的功能,例如它們無法通過JSON RPC協議從外部訪問,也不需要origin參數。

結構(Structs):模塊可以定義該模塊可能需要的結構。例如可能會爲用於跟蹤全球貨件的鏈定義ShipmentItem結構:

請注意,我們可以將其他類型引入結構中,就像我們在上面的示例中使用Hash和Balance一樣。

標準類型(如hash)在runtime原語庫中定義,但類型也通常在其他runtime模塊中定義,在這些模塊中我們引入了依賴關係的概念。

正如我們已經發現的,模塊可以是crates,因此可以作爲cargo.toml中的依賴項。這樣可以確保其他人依賴的模塊不會丟失。

回到即插即用的模擬,模塊定義了可在runtime內(執行)的可插入(導入)功能,爲您的鏈提供額外的功能。這個可插入的方面只是意味着將所需的模塊聲明並導入到Substrate運行時。

通過對substrate模塊實際是什麼的概念性理解,讓我們使用substrate-module-new用程序來生成一個簡單的模塊模板。

初始化新模塊

與substrate-node-new程序一樣,我們還下載了一個substrate-module-new程序,它可以提供最新的模塊模板供我們使用。

在節點runtime目錄中,使用以下命令準備新模塊:

substrate-module-new <module_name>

讓我們用my-module的名稱來運行它。輸出將提示我們將模塊添加到runtime / src / lib.rs文件中:

生成的文件my module將與最初包含在目錄中的template.rs文件相同。但是運行substrate module new是在事件模板中啓動新runtime模塊的首選方法同時rs已被編輯。

總結

這篇關於substrate的介紹已經介紹瞭如何安裝框架,以及如何使用包含的工具來幫助部署自定義節點和模塊。

我們使用了Polkadot JS程序,瞭解它如何作爲Substrate管理實用程序工作,同時充當鏈資源管理器和管理器。該應用程序旨在提供通用功能,不會假設您的鏈支持什麼 - 應用程序的UI將根據您的chain spec和您在runtime定義的模塊更新。

關於chain spec的主題,我們介紹瞭如何通過substrate構建規範生成規範JSON文件,其內容將根據鏈的runtime將runtime模塊而變化。還有三個預先配置的chain spec,用於填充開發或生產節點的規範。在編譯爲原始狀態並與運行時一起使用之前,可以編輯chain spec。

本文轉載公衆號:區塊鏈研究實驗室,專注區塊鏈技術,產品社羣,經濟模型等全方位的知識體系輸出,爲大家帶來不一樣的社羣學習體驗。歡迎加入作者微信社羣:csschan1120

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章