溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何理解Substrate區(qū)塊鏈開發(fā)框架

發(fā)布時(shí)間:2021-11-23 10:58:10 來源:億速云 閱讀:162 作者:柒染 欄目:互聯(lián)網(wǎng)科技

本篇文章給大家分享的是有關(guān)如何理解Substrate區(qū)塊鏈開發(fā)框架,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

如何構(gòu)建一個(gè)可以支持自己的運(yùn)行時(shí)模塊的Substrate鏈。

1、關(guān)于Rust

Substrate和運(yùn)行時(shí)模塊都是使用Rust開發(fā)的。

Rust是一種底層靜態(tài)類型語言,它的特點(diǎn)在于速度保障與可靠性,但是學(xué)習(xí)難度比較高。在區(qū)塊鏈開發(fā)中一個(gè)非常重要但卻經(jīng)常被忽略的話題是:如何掌握Rust。在這個(gè)教程中我們不會(huì)分析Rust代碼,但是對(duì)于希望使用Susbtrate進(jìn)行區(qū)塊鏈開發(fā)的工程師來說,掌握Rust是一個(gè)前提條件。

作為一種程序開發(fā)語言,Rust的學(xué)習(xí)曲線是比較陡峭的。部分原因在于Rust所采用語法規(guī)范,極其依賴于像泛型、特性萃取、生命周期和宏這樣的特性,以及其他一些考慮例如作用于和不變性。

其他的Substrate學(xué)習(xí)資源,例如Substrate Kitties collectibles workshop 生成Rust非常容易掌握,但這不是真實(shí)的情況,除非你已經(jīng)有比較多的底層語言的開發(fā)經(jīng)歷,例如C++,而且接觸過比較多的涉及系統(tǒng)級(jí)管理的API。

實(shí)際上,如果你是剛接觸Rust,那么需要一點(diǎn)耐心,需要花時(shí)間來了解這門開發(fā)語言的核心概念和特性。在掌握Rust之后,Substrate的開發(fā)將變得令人享受。這本Rust書寫的很好,很適合新手學(xué)習(xí),也適合有經(jīng)驗(yàn)的用戶溫習(xí)Rust。

2、安裝Susbtrate

安裝Substrate只需要調(diào)用Parity網(wǎng)站上的一個(gè)bash腳本。Substrate提供了兩種安裝方式:

如果希望快速掌握區(qū)塊鏈應(yīng)用的開發(fā),推薦匯智網(wǎng)的區(qū)塊鏈應(yīng)用開發(fā)系列教程, 內(nèi)容涵蓋比特幣、以太坊、eos、超級(jí)賬本fabric和tendermint等多種區(qū)塊鏈, 以及 java、go、nodejs、python、php、dart等多種開發(fā)語言

2.1 快速安裝

快速安裝將安裝預(yù)構(gòu)建的Substrate開發(fā)鏈、Substrate腳本、Substrate鏈命令行配置工具和運(yùn)行時(shí)模塊。

使用--fast標(biāo)志來運(yùn)行Substrate安裝腳本會(huì)跳過安裝那些對(duì)運(yùn)行Sbustrate來說并非必要的工具:

~$ curl https://getsubstrate.io -sSf | bash -s -- --fast

上面的命令將拉取Susbtrate的依賴項(xiàng),包括Rust、OpenSSL、LLVM等等,然后進(jìn)行安裝。

2.2 完整安裝

完整安裝除了包含上面的內(nèi)容,還將安裝以下兩個(gè)工具:

  • SubKey:用于創(chuàng)建或恢復(fù)Substrate密鑰的命令行工具,當(dāng)你需要在命令行管理賬戶時(shí)會(huì)比較有用

  • Substrate node:預(yù)配置的Substrate節(jié)點(diǎn),可以直接接入Substrate測(cè)試網(wǎng)絡(luò)

運(yùn)行下面的命令進(jìn)行完整安裝:

// full Substrate installation
~$ curl https://getsubstrate.io -sSf | bash

一旦安裝腳本執(zhí)行完畢,更新你的cargo環(huán)境以便調(diào)用新安裝的程序:

~$ source ~/.cargo/env

現(xiàn)在使用substrate命令就可以訪問預(yù)編譯好的Substrate節(jié)點(diǎn)了。要驗(yàn)證Substrate node和SubKey是否正確安裝,可以檢查這兩個(gè)程序的版本:

~$ substrate --version
~$ subkey --version

注意:Polkadot JS 應(yīng)用已經(jīng)在其賬戶管理界面中實(shí)現(xiàn)了subkey的功能 —— 可以在瀏覽器中管理賬戶而無需subkey,這也是subkey是可選安裝的原因。

默認(rèn)情況下,Substrate和工具程序安裝在 ~/.cargo/bin目錄中。你可以看一下具體的 安裝內(nèi)容:

~$ cd ~/.cargo/bin
~/.cargo/bin$ ls

你會(huì)注意到除了substrate和subkey,還有substrate-node-new和substrate-module-new這兩個(gè)程序,接下來我們將使用這些程序來創(chuàng)建新的定制節(jié)點(diǎn)和運(yùn)行時(shí)模塊。

3、更新Substrate腳本

更新Substrate腳本需要克隆最新版本,然后使用下面的命令替換cargo的二進(jìn)制程序:

~$ f=`mktemp -d` 
~$ git clone https://github.com/paritytech/substrate-up $f 
~$ cp -a $f/substrate-* ~/.cargo/bin 
~$ cp -a $f/polkadot-* ~/.cargo/bin

現(xiàn)在我們已經(jīng)安裝好了Substrate工具,可以運(yùn)行Substrate開發(fā)節(jié)點(diǎn)了。這個(gè)節(jié)點(diǎn)會(huì)開始出塊,但是對(duì)于開發(fā)而言沒什么用。

在任何情況下,我們可以使用下面的命令啟動(dòng)Substrate開發(fā)鏈:

~$ substrate --dev

節(jié)點(diǎn)現(xiàn)在就起來了,你可以看到開始出塊。要查看區(qū)塊鏈的更多信息,例如每個(gè)支持模塊的狀態(tài),我們將使用Polkadot JS應(yīng)用。

要查看substrate的命令行選項(xiàng),可以查看--help的輸出:

~$ substrate --help

熟悉一下help命令的輸出,是了解命令行程序的功能的得到驗(yàn)證的方法。目前的版本包含了一些對(duì)測(cè)試有用的標(biāo)志,例如預(yù)配置的賬戶--alice、 --bob等等。--light標(biāo)志可以按輕量模式運(yùn)行節(jié)點(diǎn),在框架中內(nèi)置了對(duì)輕量客戶端的支持。

在我們開始定制構(gòu)建之前,然我們回顧一下如何查看Substrate鏈?;镜姆椒ㄊ鞘褂肞olkadot JS應(yīng)用,該應(yīng)用使用Typescript和react開發(fā)。

4、使用Polkadot JS App

Polkadot JS應(yīng)用提供了基本的區(qū)塊鏈瀏覽器功能,同時(shí)也提供了管理Substrate模塊的API和接口。正如其名稱所示,這個(gè)應(yīng)用也支持Polkadot區(qū)塊鏈。我們有兩種途徑來使用Polkadot JS:

  • 使用一個(gè)Parity托管的應(yīng)用,訪問地址:https://polkadot.js.org/apps

  • 克隆項(xiàng)目倉庫,在本地機(jī)器運(yùn)行應(yīng)用

讓我們克隆項(xiàng)目在本地運(yùn)行,一旦安裝完成,我們可以指向我們的Susbtrate鏈的節(jié)點(diǎn),在我們機(jī)器上的另一個(gè)運(yùn)行進(jìn)程。

首先克隆并運(yùn)行Polkadot JS應(yīng)用:

~$ git clone https://github.com/polkadot-js/apps.git
~$ mv apps polkadot.js
~$ cd polkadot.js && yarn start

然后在另一個(gè)終端啟動(dòng)substrate開發(fā)鏈:

substrate --dev

在瀏覽器中訪問localhost:3000。為了讓JS App連接到我們本地的開發(fā)鏈,在側(cè)欄菜單中選擇Settings,然后切換到Local Node endpoint,類似下圖:

如何理解Substrate區(qū)塊鏈開發(fā)框架

點(diǎn)擊Save & Reload,你將注意到側(cè)欄菜單中的許多鏈接激活了,具體哪些鏈接會(huì)激活取決于你的鏈的支持。

讓我們看一下幾乎所有鏈都會(huì)支持的特性 - 賬戶。進(jìn)入到應(yīng)用的Accounts部分 - 在My Account選項(xiàng)頁你將看到一組賬戶,這些都是預(yù)配置的含余額的賬戶,我們也可以在這些賬戶之間轉(zhuǎn)賬、刪除賬戶以及備份賬戶密鑰。這表明了Plokadot JS App的定位 —— 在UI層與你的Substrate鏈交互。

在繼續(xù)之前,我們要提一下Polkadot UI可以完成的任務(wù):

  • 可以上傳wasm編譯的Ink智能合約

  • 作為一個(gè)POS共識(shí)鏈,Staking區(qū)域允許你抵押資金以成為交易驗(yàn)證人。

  • 設(shè)計(jì)Democracy區(qū)域的目的是處理鏈上的投票和管理

  • 在Toolbox區(qū)域可以測(cè)試Substrate的JSON RPC

你可以會(huì)困惑,哪些預(yù)配置的賬戶是哪里來的。事實(shí)上,這些賬戶,包括運(yùn)行時(shí)邏輯自身的編譯代碼,都是保存在一個(gè)Chain Specification文件中,也被稱為chain spec。

使用Chain Spec JSON文件配置鏈

鏈配置是一個(gè)大型JSON對(duì)象,使用substrate的build-spec命令生成。該命令將提取節(jié)點(diǎn)引入的運(yùn)行時(shí)模塊的配置項(xiàng),有些是空值,有些則提供了默認(rèn)值。

基本上,運(yùn)行時(shí)模塊可以依賴于創(chuàng)世配置,也就是在區(qū)塊鏈初始化時(shí)我們提供的配置。區(qū)塊鏈狀態(tài)是由創(chuàng)世區(qū)塊 —— 鏈的第一個(gè)區(qū)塊 —— 來初始化的。chain specJSON文件的工作,就是定義這個(gè)初始狀態(tài)。

一旦生成配置文件,我們就可以打開該文件,根據(jù)我們的需要進(jìn)行修改。

節(jié)點(diǎn)提供了purge-chain命令來復(fù)位區(qū)塊鏈,這通常用于開發(fā)中:

~$ substrate purge-chain --dev

框架提供了三個(gè)默認(rèn)的鏈規(guī)格,也就是配置:dev、local和staging。

  • dev:dev規(guī)格提供了主要用于開發(fā),該配置中包含了一組賬戶以及運(yùn)行時(shí)模塊

  • local:local規(guī)格類似于dev,主要用于私有鏈。

  • staging:staging規(guī)格更加保守一些,定義了有限數(shù)量的賬戶,需要自己定義 模塊相關(guān)的配置。當(dāng)構(gòu)建產(chǎn)品鏈時(shí),應(yīng)當(dāng)選擇這個(gè)規(guī)格。

我們現(xiàn)在要做的,就是使用build-spec命令創(chuàng)建一個(gè)新的chainspec,將輸出結(jié)果存入單獨(dú)的文件。例如,將規(guī)格寫入當(dāng)前用戶主目錄的my-chainspec.json文件:

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

在文件編輯器里打開這個(gè)文件,查看可用的配置選項(xiàng)。

  • id:可以改為你自己的名字

  • name:給人看的名字

  • telemetryEndpoints:提供Telemetry服務(wù)的訪問端結(jié)點(diǎn)

  • ...

一旦修改完chainspec文件,我們可以用--raw標(biāo)志將其轉(zhuǎn)化為原始編碼狀態(tài):

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

最終,我們使用這個(gè)鏈規(guī)格文件來啟動(dòng)我們的substrate鏈。以下假設(shè)你運(yùn)行了一個(gè)自定義編譯的substrate節(jié)點(diǎn),使用節(jié)點(diǎn)的路徑替換下面的<node_path>

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

接下來讓我們看看如何初始化并編譯自定義的Substrate節(jié)點(diǎn)。

初始化Substrate節(jié)點(diǎn)

到目前位置,我們已經(jīng)使用了預(yù)編譯的Substrate節(jié)點(diǎn)。對(duì)于測(cè)試一下開發(fā)鏈很好,但是這限制了我們使用自己的運(yùn)行時(shí)模塊以及自定義配置。為解決此問題,我們需要下載Substrate源代碼。

有兩種方法來著手我們的自定義Substrate鏈:

  • 下載一個(gè)已經(jīng)配置好的節(jié)點(diǎn)模板,例如使用下載腳本完整安裝時(shí)包含的測(cè)試網(wǎng)節(jié)點(diǎn)模板

  • 使用Substrate腳本,下載官方的節(jié)點(diǎn)模板

基本上所有的Substrate項(xiàng)目都會(huì)基于官方的節(jié)點(diǎn)模板展開,除非一些特殊情況。

用下面的命令生成一個(gè)新的節(jié)點(diǎn)模板:

~$ substrate-node-new my-node "Ross Bulat"

命令執(zhí)行需要花點(diǎn)時(shí)間 —— 要拉取最新的Substrate源碼并且進(jìn)行編譯。

一旦完成,可以修改runtime/src目錄下的lib.rs文件。同時(shí)也包含了運(yùn)行時(shí)模塊的模板template.rs。 接下來我們看一下運(yùn)行時(shí)模塊。

構(gòu)建自定義節(jié)點(diǎn)

在節(jié)點(diǎn)目錄中,在使用cargo編譯出二進(jìn)制程序之前,使用build.sh腳本將節(jié)點(diǎn)編譯為wasm:

# build wasm
./scripts/build.sh

# build binary
cargo build --release

節(jié)點(diǎn)程序現(xiàn)在位于./target/release/ 目錄。

之前我們已經(jīng)使用substrate調(diào)用了一些命令,現(xiàn)在可以使用我們新編譯出來的程序。要復(fù)位區(qū)塊鏈并重新運(yùn)行,執(zhí)行如下命令:

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

# run in dev mode
./target/release/<node_name> --dev

我們要介紹的最后一部分內(nèi)容,是運(yùn)行時(shí)模塊。讓我們看看什么是運(yùn)行時(shí)模塊以及如何在substrate節(jié)點(diǎn)中引入運(yùn)行時(shí)模塊。

Substrate運(yùn)行時(shí)模塊:區(qū)塊鏈的插件機(jī)制

Substrate的通用和模塊化結(jié)構(gòu)使其實(shí)用性大大增強(qiáng),開發(fā)人員可以將功能以插件形式加載到節(jié)點(diǎn)運(yùn)行時(shí),從而可以輕松地創(chuàng)建滿足個(gè)性化需求的區(qū)塊鏈。

這些插件化的功能包被稱為模塊,或者更確切地說,運(yùn)行時(shí)模塊。Substrate預(yù)置的運(yùn)行時(shí)模塊集合被稱為Substrate運(yùn)行時(shí)模塊庫 —— SRML。

這些模塊非常有用,它們實(shí)現(xiàn)了其他區(qū)塊鏈框架中的很多功能,可以在github瀏覽這些模塊的代碼。有了這些模塊,開發(fā)人員不需要重新發(fā)明輪子,可以節(jié)省大量時(shí)間。當(dāng)實(shí)現(xiàn)新特性時(shí),也是以運(yùn)行時(shí)模塊的形式開發(fā)的。

SRML模塊由Substrate統(tǒng)一維護(hù),因此可靠性得到保障。下面是現(xiàn)在可用的一些模塊:

  • Assets:提供類似ERC20代幣支持的資產(chǎn)模塊

  • Balances:管理賬戶余額的模塊

  • Staking:: 網(wǎng)絡(luò)維護(hù)者管理抵押資金的模塊

你會(huì)注意到這些模塊都是Rust crate格式,該格式被設(shè)計(jì)用于Substrate運(yùn)行時(shí)環(huán)境。

每個(gè)SRML模塊都打包為crates,并在模塊名前加以srml_前綴,在Parity的crate庫的左側(cè)菜單中,可以找到這些模塊。

運(yùn)行時(shí)模塊結(jié)構(gòu)概述

每個(gè)模塊都是定義在它自己的src/lib.rs文件中,遵循約定的結(jié)果。我們可以看一下一個(gè)substrate模塊的頂層特征:

  • 一個(gè)模塊通常自身是一個(gè)crate,但不是必須要求

  • 一個(gè)模塊可以定義為單一文件module-name.rs,或者更常見的lib.rs,如果模塊 是一個(gè)crate。一個(gè)模塊也可以有其他支持文件

  • 一個(gè)模塊必須遵守特定的結(jié)構(gòu),依賴于特定的Substrate API

最后一點(diǎn)指的是什么?一個(gè)模塊為你的區(qū)塊鏈增加功能,功能可以多種形式的組件提供:

事件:一個(gè)模塊可以聲明自定義事件,當(dāng)特定條件滿足時(shí)觸發(fā),例如,當(dāng)你鑄造非同質(zhì)化通證時(shí),可能是一個(gè)TokenCreated事件。事件被封裝在 decl_event! 宏里:

decl_event!(
    pub enum Event<T>
    where
        <T as system::Trait>::AccountId,
        <T as system::Trait>::Hash
    {
        TokenCreated(AccountId, Hash),
    }
);

存儲(chǔ):一個(gè)模塊可以定義鏈上的持久化數(shù)據(jù)結(jié)構(gòu),例如映射表、列表等等。存儲(chǔ)條目定義 在decl_storage!宏里:

decl_storage! {
    trait Store for Module<T: Trait> as NFTStorage {
        TokenToOwner get(token): map T::Hash => Token<T::Hash, T::Hash>;
        TokenIndex get(get_token_by_index): map u64 => T::Hash;
        TotalTokens get(total_tokens): u64;
        ...
   }
}

可分發(fā)函數(shù):JSON RPC可以調(diào)用的函數(shù)。

公開/私有函數(shù):模塊可以提供在運(yùn)行時(shí)環(huán)境中可調(diào)用的公開函數(shù),以及只可以在模塊中調(diào)用的私有函數(shù)。

結(jié)構(gòu):模塊可以定義結(jié)構(gòu),例如,在一個(gè)跟蹤全球運(yùn)輸?shù)膮^(qū)塊鏈實(shí)現(xiàn)中,可能會(huì)定義一個(gè)ShipmenItem結(jié)構(gòu)。

#[derive(Encode, Decode, Default, Clone, PartialEq)]
pub struct ShipmentItem<Hash, Balance> {
    id: Hash,
    container_id: Hash,
    price: Balance,
    weight: u64
}

初始化模塊

類似于substrate-node-new工具,我們也下載了substrate-module-new工具。在節(jié)點(diǎn)運(yùn)行時(shí)目錄,使用下面的命令準(zhǔn)備一個(gè)新的模塊:

substrate-module-new <module_name>

讓我們將其命名為my-module:

cd runtime/src
substrate-module-new my-module

> SRML module created as ./my-module.rs and added to git.
> Ensure that you include in your ./lib.rs the line:

> mod my_module;

結(jié)果文件my-module,將和最初目錄中包含的template.rs文件一致。但是使用substrate-module-new是初始化一個(gè)新的運(yùn)行時(shí)模塊的官方推薦的方式。

現(xiàn)在我們可以開發(fā)這個(gè)模塊,打包稱create,甚至分發(fā)到github以便大家都可以維護(hù)。

以上就是如何理解Substrate區(qū)塊鏈開發(fā)框架,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI