Subdev 討論 | 從命令頻繁報錯開始的第一個 Substrate 項目

Parity 科技公司研發的 Substrate 框架,讓我們擁有了可以幾乎不受限制的快速的開發出一個完整、高性能、安全的區塊鏈項目。

今年 6 月份,一塊鏈習與 Polkadot 社區大使陳錫亮老師傾力打造了《Substrate 快速入門與實戰開發》課程。

Subdev 討論 | 從命令頻繁報錯開始的第一個 Substrate 項目

目前第三期已經開課兩週,同學們平常會在班級羣將學習中遇到的難題或不解向老師、助教提問、討論,現在將第一週班級羣日常優質的討論內容分享給大家。具體內容如下:

Q&A

01

Q: 高超 @ 高校教師:

Subdev 討論 | 從命令頻繁報錯開始的第一個 Substrate 項目

編譯出這個錯誤怎麼回事?

A: Ratentlan @ 程序員:確保沒有 SKIP_WASM_BUILD, 你現在需要編譯 wasm。

Subdev 討論 | 從命令頻繁報錯開始的第一個 Substrate 項目

你這不是相當於

export skip_wasm_build=true 嗎 . 當然沒有 wasm binary 出來了。

02

Q:二向箔 @ 高校教師:

curl https://raw.githubusercontent.com/paritytech/substrate-up/4f3d476d2271a1cae6014a22255d0c7aa85692e7 /substrate-node-new -sSf | sh -s ‹項目名› ‹

這命令對嗎?怎麼報錯?

A:陳錫亮 @ 講師 :換 bash 試試。

A:黃志光 @ 助教 :老師的意思是 sh 換成 bash,curl 不要換。

03

Q:小賈 @ 程序員

Subdev 討論 | 從命令頻繁報錯開始的第一個 Substrate 項目

這裏好像沒講,怎麼樣才能 wasm 目標使用 release, native 目標使用 debug 呢?

還有兩個小問題:

1. 看到提到 substrate 可以支持不同共識機制,這個機制選擇是在 runtime,還是 client 呢, 可以選擇有 pos 和 pow 混合的機制嗎?

2. 那麼多幣單位是什麼意思,1 DEV 是最小單位?

A:陳錫亮 @ 講師:

WASM_BUILD_TYPE=release cargo build 就是。你想的話也可以 WASM_BUILD_TYPE=release cargo build –debug

共識算法是在 client 實現,runtime 負責存儲相關的數據,比如 pos 就是誰壓了多少錢,現在有 pos, pow,混合的話需要你自己寫。DEV 是測試網的貨幣單位,14 個 0。

04

Q:Ting A Lin@ 程序員 :wasm 目標使用 release, native 目標使用 debug, 其實我不太理解這句話的意思。

A:Ratentlan@ 程序員 :wasm 部分用 release 的方式編譯 , 提高性能 . 不然開發測試的時候 , 出塊都是問題。native 部分用 debug 的方式編譯 , 允許調試 . 你要不想調試可以都用 release 的方式。

05

Q:Ting A Lin@ 程序員 :有個很傻的問題哦,每次說 Native 指的是 local 環境哦,不是 react native 的意思吧?那我也試用這個命令?

A:Ratentlan@ 程序員 :你電腦上跑的二進制叫 native. wasm 解釋器也在 native 裏面 .。local, dev, 等是 substrate 鏈種類 , 用於自己測試。react 是說的那個 web 框架 ? 跟這個 substrate 沒關係。

A:陳錫亮 @ 講師:native 就是編譯過的機器碼直接跑的。對比下 wasm 就是解釋器裏面執行。

06

Q:小賈 @ 程序員:老師,看了你演示 toolbox 裏面的功能,這個 rpc.state.call(method) 是能直接調用 module 裏面的 dispatchable 函數嗎? 但是 method:Text 和 data: Bytes 該填什麼呢,能否舉個具體例子一下?

Subdev 討論 | 從命令頻繁報錯開始的第一個 Substrate 項目

A:陳錫亮 @ 講師:這個 rpc 是歷史遺留的,基本沒法用。

Q:小賈 @ 程序員:謝謝老師,那請教一下 現在是要如何才能通過哪個 rpc 調用到 module 裏面的 dispatchable 函數了?

A:陳錫亮 @ 講師:

author submitExtrinsic 不過這個是底層方法,一般是用 extrinsics 頁面。

07

Q:村上香菜子 @ 程序員:我打 SKIP_WASM_BUILD = cargo check,系統表示 command not found。

A:Li Smith@ 助教 :這樣纔有效的 SKIP_WASM_BUILD= cargo check 。
Subdev 討論 | 從命令頻繁報錯開始的第一個 Substrate 項目

Q:村上香菜子 @ 程序員:

就是這個 = 號必須挨着前面的 SKIP_WASM_BUILD 就嗎?差別就在這裏是不是?確實是有效了,就是 = 號的位置是嗎?

A:Li Smith@ 助教 :是的。

A:陳錫亮 @ 講師:這個是 shell 裏面設置環境變量的語法。

08

Q:村上香菜子 @ 程序員:我剛纔跑了一下 SKIP_WASM_BUILD= cargo check ,結果顯示 build failed. 我需要重新生成一個 wasm 文件嗎?

A:Li Smith@ 助教 :要呀, 運行可以執行 WASM_BUILD_TYPE=release cargo run — –dev 。

Q:村上香菜子 @ 程序員:嗯嗯,好的。

Subdev 討論 | 從命令頻繁報錯開始的第一個 Substrate 項目

在 polkadot.js 上面,沒有看見我的加密貓項目。

A:Li Smith@ 助教 :加密貓是另外一個前端。加密貓的項目教程在這裏 https://substrate.dev/substrate-collectables-workshop/,但是 github 我找找看。

09

Q:曼曼 @ 程序員:我 cargo run 編譯出錯,還看不到這一步。error:could not compile ‘node-Cli’.

A:Li Smith@ 助教: error:could not compile ‘node-Cli’.=》看起來像 nodejs 問題 .@ 曼曼-學員-蘇州 前面執行的命令和步驟貼出來看看。

Q:曼曼 @ 程序員:

Subdev 討論 | 從命令頻繁報錯開始的第一個 Substrate 項目
Subdev 討論 | 從命令頻繁報錯開始的第一個 Substrate 項目

A:Li Smith@ 助教: 你在編譯 substrate 的項目吧,不像是 substrate 應用鏈的工程文件。

Subdev 討論 | 從命令頻繁報錯開始的第一個 Substrate 項目

Subdev 討論 | 從命令頻繁報錯開始的第一個 Substrate 項目

跑這個指令創建一個應用鏈的工程 curl

https://raw.githubusercontent.com/paritytech/substrate-up/9c966504b4a60c2e6b9187b118926a12d2da9448/substrate-node-new -sSf | bash -s mysubstrateproject testusername

Q:曼曼 @ 程序員:我直接去 build 和 run 加密貓那個項目?

A:Li Smith@ 助教: 我直接去 build 和 run 加密貓那個項目?先自己創建一個示例項目來 build, 作業是提交自己創建的自定義項目。

10

Q:於超 @ 程序員: 從新項目啓動節點測試網絡,跟直接 cargo run 有什麼區別?

A:周洋 @ 助教:cargo run 是啓動項目的一種方式,應該是一個意思。

A:陳錫亮 @ 講師:一個是啓動 Substrate 節點,一個是啓動新的項目的節點。

11

Q:曉聰 @ 程序員:爲啥少了個 .maintain 文件?

A:陳錫亮 @ 講師:substrate 項目纔有,創建的新項目沒有。點開頭的文件 finder 默認不顯示,作爲隱藏文件處理,命令行裏面 ls -a 就能看到。

12

Q:2012@ 程序員:–dev (單節點)啓動的時候,爲什麼系統一直在出塊呢?出的快都是系統自己的測試快嗎?

A:周洋 @ 助教:是的,–dev 出的塊是本地的測試塊,供開發時使用。

13

Q:alan poon@ 程序員 :

https://github.com/kulupu/kulupu 這是 PoW substrate, token 叫 kulu, 我能寫自己的 substrate, 用 kulu 嗎?as balance 交易嗎?

A:陳錫亮 @ 講師:如果你要你的鏈用其他的鏈的 token 的話,需要 XCMP 的跨鏈支持。

14

Q:xuhehui@ 產品經理 :我先來一個小白的,想問下第二課作業的代碼拉下來之後,是要先執行 ./scripts/init.sh 嗎?然後執行生成的 build.sh 文件吧。運行 init.sh 時候,在 downloading component \’rustc\’ 這一直提示超時。

A:陳錫亮 @ 講師:如果之前跑過 init 了,就不用再跑了,沒有 build.sh 文件啊,下載超時是網絡原因,可以試試搭梯子。不然也可以關了試試。不過你要之前能編譯的話,說明你環境都搭好了,也不用再安裝更新了。

15

Q:alan poon@ 程序員 :cumulus, 只是特別 register 到 polkadot, 是吧?還沒有看到能改 cross blockchain\’s state 的代碼。

A:陳錫亮 @ 講師:parachain to relaychain 的在 polkadot 有一些了,relaychain to parachain 的還沒有。

16

Q:oldlee@ 項目經理 :

Subdev 討論 | 從命令頻繁報錯開始的第一個 Substrate 項目

Subdev 討論 | 從命令頻繁報錯開始的第一個 Substrate 項目

這些語法哪裏有介紹呀?看不懂。

A:黃志光 @ 助教:這是宏裏面定義的語法,在編譯的時候會被展開成標準的 rust 語法,算是 0 成本抽象的一個應用。

A:陳錫亮 @ 講師:decl_xxx 裏面的都是自定義語法。

Q:oldlee@ 項目經理 :所以我應該去找 rust 有關宏的使用 相關資料,對吧?

A:陳錫亮 @ 講師:你想學習這個語法的話就直接看 substrate 源代碼,從例子中學習就好了。

17

Q:2012@ 程序員:

Subdev 討論 | 從命令頻繁報錯開始的第一個 Substrate 項目

上圖中,當我們在 node-template 根目錄下執行:cargo run — –dev 的時候,一個鏈就起來了。那麼這個過程中 ,runtime 包是否會被編譯爲 wasm?如果編譯了,那是怎樣加載到鏈上執行的呢?

A:陳錫亮 @ 講師:是。作爲創始區塊狀態一部分。

Q:2012@ 程序員:哦,就是說每次 run 的時候都會編譯 runtime 包的,是怎樣利用 wasm32-unknow-unknow 來編譯的啊?

A:陳錫亮 @ 講師:cargo 和 rust 工具包負責 wasm 編譯,和一般的 rust 或 c++項目沒有太大區別。

Q:2012@ 程序員:在這個目錄執行 cargo build 的時候,編譯出來的 wasm 文件在哪呢?

Subdev 討論 | 從命令頻繁報錯開始的第一個 Substrate 項目

A:陳錫亮 @ 講師:target 目錄裏面,位置比較不好找,項目跟目錄裏面有個 target。可以用 WASM_TARGET_DIRECTORY 指定 wasm 文件位置,第四節課中我會介紹。

18

Q:2012@ 程序員:我們通過 node-template 生成一個自己的項目後,直接 cargo run 啓動項目。此時,作爲鏈上的一個節點已經具備了區塊鏈的基本功能了,那 runtime 包的作用是?cargo run 的時候應該是沒有執行到 runtime 包裏面的代碼的。

A:陳錫亮 @ 講師:有執行的啊。

Q:2012@ 程序員:是不是項目啓動後,也啓動了 wasm 的解釋器,然後 runtime 的代碼被 wasm 解釋器執行的呢?

A:陳錫亮 @ 講師:對。

Q:2012@ 程序員:1. 啓動 wasm 解釋器的代碼大概在哪呢?

2.runtime 代碼是怎麼加載,然後被 wasm 解釋器執行的呢?

A:陳錫亮 @ 講師:

https://github.com/paritytech/substrate/blob/7ba240f1d49d856471ed52ca8200fa37563dc87a/bin/node-template/hide/service.rs

https://github.com/paritytech/substrate/blob/7ba240f1d49d856471ed52ca8200fa37563dc87a/client/executor/hide/native_executor.rs

https://github.com/paritytech/substrate/blob/7ba240f1d49d856471ed52ca8200fa37563dc87a/client/executor/hide/wasm_runtime.rs

也可以試着加斷點調試追蹤下。

19

Q:2012@ 程序員:老師,該怎麼理解 executor 這個包扮演的角色呢?是僅僅作爲 runtime 代碼的解釋器嗎?

Subdev 討論 | 從命令頻繁報錯開始的第一個 Substrate 項目

A:陳錫亮 @ 講師:就是執行鏈上邏輯的執行器。

Q:2012@ 程序員:代碼裏面,service 包和 executor 包是怎樣關聯起來的啊?

**
**

A:陳錫亮 @ 講師:service 負責啓動各種服務,包括 executor。

Q:2012@ 程序員:代碼裏面沒找到 service 初始化 executor 的地方,也沒找到 service 加載 wasm 的地方呢。

A:陳錫亮 @ 講師::service.rs 裏面有引用。wasm 由 executor 加載。

20

Q:2012@ 程序員:陳老師,executor 是要執行 runtime 代碼的,那 runtime 代碼主要應該包含哪幾塊內容呢?

比如,達成共識這類操作應該是 network 包來處理,runtime 負責哪些功能呢?

A:陳錫亮 @ 講師:所有鏈上狀態的修改,比如賬戶金額,誰當驗證人,所有達成共識的狀態的修改都是 runtime 完成。

以上便是第一週優質的討論內容,在這裏已經全部分享給你。想成爲他們中的一員嗎?更多內容,請關注一塊+(微信公衆號 ID: yikuailianxi),一所開發者的在線學習與技術實戰社區。這裏有成體系的線上課程,有挑戰的線下實戰活動,以及有深度的區塊鏈技術觀察+評論。

Subdev 討論 | 從命令頻繁報錯開始的第一個 Substrate 項目

更多閱讀:

▎爲什麼 Rust 已成爲最先進的主流通用語言之一?

▎Subdev 分享 |Substrate 背後的密碼學選擇

▎Subdev 週記 |Substrate 最吸引開發者們的四大原因

Subdev 討論 | 從命令頻繁報錯開始的第一個 Substrate 項目