相信很多朋友已經在使用Substrate2.0構建自己的runtime模塊,但官方Substrate開發者中心還沒有2.0版本的教程。
在本文中,我整理總結了如何使用Substrate2.0啟動一個區塊鏈網絡,并使用你選擇的驗證者/管理者集合。
你需要:
一個Linux或Mac操作系統下的命令行客戶端
Git
你將學習到:
從源代碼編譯一個Substrate節點
為區塊鏈網絡中的驗證人生成ed25519密鑰對
創建和編輯chainspecjson文件
編譯所需工具
Substrate是一個開源區塊鏈開發框架,用來構建你自己的區塊鏈,以及可以用來開發各種各樣的去中心化應用程序。
目前Substrate沒有提供二進制安裝包,因此必須從源代碼中編譯它,這可能是一個耗時的過程。
Substrate倉庫會經常更新,請確保參加此網絡的每個節點都有同樣版本的Substrate以保證成功。在實踐中,類似但不完全相同的版本通常可以正常工作,但是依靠這個通常會讓人感到沮喪。
我們將使用master分支的這個commit來獲取更多的一致性。
首次操作
首先,我們將通過gitclone下載Substrate代碼。目前還沒有v2.0的分支。
gitclonehttps://github.com/paritytech/substrate
cdsubstrate
倉庫中包含一個名為subkey的工具,我們需要用它來生成和檢查密鑰對。讓我們先編譯它。--force選項意味著我們將移除之前安裝的版本,重新安裝此版本。
cargoinstall--force--pathsubkeysubkey
現在讓我們編譯我們將要運行的區塊鏈節點。由于Substrate是一個框架,使用它編寫自定義的runtime代碼。之前寫過文章詳細涵蓋了這方面的內容。
Substrate倉庫本身已經有兩個隨時可以運行的節點環境。
第一個在node目錄,它包含了許多功能,可以構建實際可運行的區塊鏈。事實上,它看起來和Polkadot類似,它也是基于Substrate構建的。
第二個是在node-template目錄下的最小化runtime代碼。我們將在本文中使用節點模板node-template,因為它比較簡單,通常是編寫自定義runtime的起點。
#切換到node-template目錄
cdnode-template
#確保你的rusttoolchain是最新的
./scripts/init.sh
#編譯本地節點版本
cargobuild
下次更新
更新或改變Substrate版本時,這個過程類似,但構建速度更快。
cdnode-template
./scripts/init.sh
cargobuild
提示:如果想要node-template安裝在可執行文件路徑下,你可以在上一步使用cargoinstall代替cargobuild。
Alice和Bob啟動區塊鏈
在我們生成自己的密鑰并啟動一個真正特定的Substrate網絡之前,讓我們了解下基礎知識,首先使用一個預先定義的網絡規范,稱為local,使用兩個預先定義的密鑰,稱為Alice和Bob。
Alice首先啟動
Alice應該從Substrate倉庫的根目錄運行此命令。
#如果你仍然在node-template/目錄
cd..
#啟動節點
./target/debug/node-template
--base-path/tmp/alice
--chain=local
--alice
我們了解一下這些命令選項的含義:
--base-path指定一個目錄,Substrate用它來存儲與此鏈有關的所有數據。如果目錄不存在,將創建它。如果已經存在其它區塊鏈的數據,啟動將會報錯。這種情況下,要么清除目錄,要么選擇不同的目錄。
--chain=local指定要使用的鏈規范。有幾個預先準備的選項,包括local,dev等,但我們要指定自己的chainspec文件。
--alice指定我們正在使用預定義的Alice密鑰作為此節點的驗證者。這里是和v1.0的不同之處,v2.0使用這個快捷方式替代v1.0中--nameAlice--validator,同時Alice的會話密鑰會被添加到keystore文件中。
chainspec文件和keystore文件,這兩個我們將在稍后階段說明。
當節點啟動后,你應該看到類似下面的輸出:
2019-09-0407:25:11SubstrateNode
2019-09-0407:25:11version2.0.0-d8589ad-x86_64-macos
2019-09-0407:25:11byAnonymous,2017,2018
2019-09-0407:25:11Chainspecification:LocalTestnet
2019-09-0407:25:11Nodename:Alice
2019-09-0407:25:11Roles:AUTHORITY
2019-09-0407:25:11InitializingGenesisblock/state(state:0x2b2e…9b06,header-hash:0x7d3d…f9e9)
2019-09-0407:25:11LoadingGRANDPAauthoritysetfromgenesisonwhatappearstobefirststartup.
2019-09-0407:25:11Loadedblock-time=BabeConfiguration{slot_duration:10000,c:(1,4),median_required_blocks:1000}secondsfromgenesisonfirst-launch
2019-09-0407:25:11CreatingemptyBABEepochchangesonwhatappearstobefirststartup.
2019-09-0407:25:11Highestknownblockat#0
2019-09-0407:25:11UsingdefaultprotocolID"sup"becausenoneisconfiguredinthechainspecs
2019-09-0407:25:11Localnodeidentityis:QmbqmYrUEMcPFqnKjBAjZXgZBgpFs9Xsp5zhpbPXtENngE
2019-09-0407:25:16Idle(0peers),best:#0(0x7d3d…f9e9),finalized#0(0x7d3d…f9e9),?0?0
你可以通過節點在命令行中產生的輸出了解很多信息。需要注意的幾行:
Nodename:Alice顯示指定的節點名稱,這里是預定義的Alice
Localnodeidentityis:QmbqmYrUEMcPFqnKjBAjZXgZBgpFs9Xsp5zhpbPXtENngE節點ID,Bob節點啟動時需要依賴此ID
還有一些選項,大家可以通過./target/debug/node-template--help去了解,比如:
--port30333指定節點將監聽的p2p端口。默認是30333,如果Bob的節點在同一物理機上運行,就需要明確指定一個不同的端口。
--ws-external默認情況下,節點監聽9944端口上的RPC連接,只有本地主機的連接會被接受,但你可以通過指定它改變此行為。你也可以通過指定--ws-port12345更改端口。
--rpc-cors指定允許訪問HTTP和WSRPC服務器的瀏覽器來源Origins。它是以逗號分隔的來源列表。all值將禁用來源驗證。默認是允許localhost,https://polkadot.js.org和https://substrate-ui.parity.io這些來源。此處有個坑!在--dev模式下運行時,默認設置為允許所有來源。
連接UI
有一個很好的圖形用戶界面,稱為PolkadotJsAppsUI,可以用它連接你的節點。之前寫過文章詳細涵蓋了這方面的內容。
點擊鏈接會跳轉到該UI的官方頁面,非常方便,但與你正在運行的Substrate版本相比可能已經過時。在UI頁面過期的情況下,你可以通過從github獲取代碼在本地運行該應用。一般來說,其倉庫中的指令將是你的最佳指南,但大致過程應該是這樣的。
#抓取代碼
gitclonehttps://github.com/polkadot-js/apps
cdapps
#安裝依賴
yarn
#啟動項目
yarnrunstart
你會注意到,在命令行和用戶界面中,還沒有產生任何塊。一旦另一個驗證者加入網絡,將開始生成區塊。
Bob加入
現在,Alice節點已經啟動并運行,Bob可以通過引導節點來加入網絡。他的啟動命令類似下面:
./target/debug/node-template
--base-path/tmp/bob
--chain=local
--bob
--bootnodes/ip4//tcp//p2p/
上面已經解釋了大多數這些選項,但有幾個要注意的地方:
如果這兩個節點在同一物理機器上運行,Bob必須指定一個不同的路徑--base-path和端口--port。
--bootnodes選項,Bob必須正確指定以下三項:
Alice的IP地址,格式192.168.1.1
Alice的端口,可能為30333
Alice節點ID,從上面日志輸出中復制(QmbqmYrUEMcPFqnKjBAjZXgZBgpFs9Xsp5zhpbPXtENngE)
如果所有進展順利,在幾秒之后,節點應該相互連接,開始生成區塊。你應該看到類似下面的內容:
Idle(1peers),best:#1(0x9f1b…9b57),finalized#1(0x28be…45e5),?1.7kiB/s?1.4kiB/s
此行顯示,Bob有對等節點Alice(1peers),它們產生了一個區塊(best:#1(0x9f1b…9b57)),并且區塊已被最終確定/敲定(finalized#1(0x28be…45e5))。
這也是v2.0和v1.0的區別之處。v2.0的節點模板中增加引用了Grandpa模塊來做最終一致性,而在v1.0的網絡中,只有創世區塊會被最終敲定,v1.0的節點模板中沒有最終一致性模塊。
生成密鑰
現在我們知道了基本原理和命令行選項,是時候生成我們自己的密鑰而不是使用眾所周知的Alice和Bob密鑰。
每個想要加入這個區塊鏈網絡的人,都可以使用我們之前提到的subkey工具,或PolkadotJSAppsUI生成自己的密鑰。在本文中,我們將使用RPC調用。該小節是本文更有價值的一部分內容。
生成key
對于大多數想要運行驗證節點的用戶,可以使用author_rotateKeys這個RPC調用。該RPC調用將生成會話密鑰sessionkey,并返回其公鑰publickey。命令如下:
curl-H'Content-Type:application/json'--data'{“jsonrpc”:“2.0”,“method”:“author_rotateKeys”,“id”:1}'localhost:9933
導入keystore
如果會話密鑰需要匹配固定種子seed,則可以按類型單獨設置它們。RPC調用需要密鑰種子和密鑰類型。此處列出了Substrate中默認支持的類型。命令如下:
curl-H'Content-Type:application/json'--data'{"jsonrpc":"2.0","method":"author_insertKey","params":,"id":1}'localhost:9933
KEY_TYPE-需要用4個字符的類型標識符替換,比如:ed25
SEED-是密鑰的種子seed
PUBLIC-給定密鑰的公鑰
啟動你的私有區塊鏈
上一次,我們使用--chain=local這是一個預定義的chainspec,它將Alice和Bob指定為驗證人以及許多其他的默認值。本節將介紹如何創建自己的chainspec。
創建chainspec
我們不是從頭開始完全編寫chainpec,而是對我們之前使用的那個進行一些修改。
首先,我們需要將chainspec導出到json文件。
./target/debug/node-templatebuild-spec--chain=local>customSpec.json
我們剛創建的文件包含幾個字段,人們可以通過探索它們來學習很多東西。目前,最長的字段是一個十六進制編碼的數據,它是我們runtime的wasm的二進制。
我們感興趣的部分,是像這樣的驗證人地址:
"consensus":{
"authorities":[
"5FA9nQDVg267DEd8m1ZypXLBnvN7SFxYwV7ndqSYGiN9TTpu",
"5GoNkf6WdbxCFnPdAnYYQyCjAKPJgLNxXwPjwTh6DGg6gN3E",
],
"code":
}
我們需要做的就是將列出的驗證人地址更改為我們在上一步中生成的地址。
注意:應該由一個人執行這些步驟,并共享生成的文件給其他驗證人。因為從rust->wasm的構建不是“可重現的”,每個人都會得到一個略有不同的wasmblob,如果每個參與者自己生成文件,這將破壞共識。
準備好chainspec后,將其轉換為“raw”chainspec。regular和raw之間的區別只是所有字段在"raw"chainspec中編碼為了十六進制。
./target/debug/node-templatebuild-spec--chaincustomSpec.json--raw>customSpecRaw.json
最后與網絡中的所有其他驗證人共享customSpecRaw.json。
啟動鏈
你已完成所有必要的準備工作,現在準備好啟動鏈。此過程非常類似于之前以Alice和Bob的身份啟動鏈。
從干凈的目錄開始非常重要,如果你打算使用之前的目錄,請刪除該目錄中的所有內容。
第一位參與者啟動節點:
./target/debug/node-template
--chain./customSpecRaw.json
--validator
--namelester
以下是我們啟動Alice時的一些不同之處。
--validator表示節點將參與出塊而不是僅僅同步網絡數據。
--name給節點取個可讀性高的名字。
后續驗證人現在可以像Bob之前一樣加入網絡,確保使用新的chainspec和密鑰。你可以使用網絡中任意已有的節點引導,而不僅是之前的節點。
小結
恭喜你!你已啟動了自己的區塊鏈!
在本文中,你學會了編譯節點模板,生成自己的公私鑰對,創建一個自定義的鏈,使用這些密鑰對,并根據自定義chainspec和節點模板啟動了一個私有區塊鏈網絡。
最近疫情影響 大星被強制禁足 但是禁的了我的jio 禁不了我一顆關注鏈圈的心! 所以從今天開始 大星決定給因為在家閑出p而竟然想了解區塊鏈的同學們嘮點鏈圈的細細碎碎、家長里短 各位關注大星的朋友.
1900/1/1 0:00:00作者:彭波 來源:旗點教育 編者注:原標題為《網信辦原副主任彭波:“新冠肺炎”會給互聯網帶來什么變化》因為“新冠肺炎”,各地紛紛推遲上班上課時間,但這可這不代表所有職員和學生們的假期也可以延長.
1900/1/1 0:00:00周EOS看漲期權代碼周EOS看漲0217期權標的EOS合約類型歐式看漲期權計價單位USDT最小價格單位0.0001USDT合約比例1:2.
1900/1/1 0:00:00今天是立春,二十四節氣之一,又名立春節、正月節、歲節、歲旦等。立,是“開始”之意;春,代表著溫暖、生長。立春意味著新的一個輪回已開啟,乃萬物起始、一切更生之義也.
1900/1/1 0:00:00月ETH看漲期權代碼月ETH看漲0305期權標的ETH合約類型歐式看漲期權計價單位USDT最小價格單位0.0001USDT合約比例40:1.
1900/1/1 0:00:00“牛市總在悲觀中誕生,在懷疑中成長。” ——鄧普頓 ★去年11月份,盡管大家都覺得后期還有很多利好,比如減半等,但還是阻擋不了期望過高之后帶來的猛烈下跌.
1900/1/1 0:00:00