Parity 科技公司研發的 Substrate 框架,讓我們擁有了可以幾乎不受限制的快速的開發出一個完整、高性能、安全的區塊鏈項目。
今年 6 月份,一塊鏈習與 Polkadot 社區大使陳錫亮老師傾力打造了《Substrate 快速入門與實戰開發》課程。
目前第三期已經開課兩週,同學們平常會在班級羣將學習中遇到的難題或不解向老師、助教提問、討論,現在將第一週班級羣日常優質的討論內容分享給大家。具體內容如下:
Q&A
01
Q: 高超 @ 高校教師:
編譯出這個錯誤怎麼回事?
A: Ratentlan @ 程序員:確保沒有 SKIP_WASM_BUILD, 你現在需要編譯 wasm。
你這不是相當於
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:小賈 @ 程序員:
這裏好像沒講,怎麼樣才能 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 該填什麼呢,能否舉個具體例子一下?
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 。
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:村上香菜子 @ 程序員:嗯嗯,好的。
在 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:曼曼 @ 程序員:
A:Li Smith@ 助教: 你在編譯 substrate 的項目吧,不像是 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@ 項目經理 :
這些語法哪裏有介紹呀?看不懂。
A:黃志光 @ 助教:這是宏裏面定義的語法,在編譯的時候會被展開成標準的 rust 語法,算是 0 成本抽象的一個應用。
A:陳錫亮 @ 講師:decl_xxx 裏面的都是自定義語法。
Q:oldlee@ 項目經理 :所以我應該去找 rust 有關宏的使用 相關資料,對吧?
A:陳錫亮 @ 講師:你想學習這個語法的話就直接看 substrate 源代碼,從例子中學習就好了。
17
Q:2012@ 程序員:
上圖中,當我們在 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 文件在哪呢?
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:陳錫亮 @ 講師:
也可以試着加斷點調試追蹤下。
19
Q:2012@ 程序員:老師,該怎麼理解 executor 這個包扮演的角色呢?是僅僅作爲 runtime 代碼的解釋器嗎?
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),一所開發者的在線學習與技術實戰社區。這裏有成體系的線上課程,有挑戰的線下實戰活動,以及有深度的區塊鏈技術觀察+評論。
更多閱讀:
▎爲什麼 Rust 已成爲最先進的主流通用語言之一?