相信很多朋友已經在使用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和節點模板啟動了一個私有區塊鏈網絡。
撰文:ParkerLewis,UnchainedCapital業務拓展負責人編譯:PerryWang 來源:鏈聞 一談到比特幣的普及,有兩個規則似乎永不會錯.
1900/1/1 0:00:00尊敬的用戶: WBF將聯合ATC、ULAM、BAB、HM、CCM、SBTC項目方盛大回饋新老用戶。喜迎元宵,歡樂空投。活動期間,在WBF平臺參與邀請或交易,即可瓜分多重好禮.
1900/1/1 0:00:00尊敬的用戶:為滿足杠桿交易用戶更精細化的借貸需求,現CEO全球站杠桿交易已新增多個幣種資產與交易對.
1900/1/1 0:00:00作者:郝天 父輩一代總把春節稱之為“年關”,以往我們并不解其中味,但隨著武漢疫情的持續發酵蔓延,一個史無前例的大“年關”擺在了全體華夏兒女的眼前.
1900/1/1 0:00:00截至02月12日10時,巴比特綜合指數報15925.95點,24小時漲跌為6.39%,點位高于納斯達克綜合指數,自發布日起全球Token市場表現好于證券市場表現.
1900/1/1 0:00:00Gate.io的理財和借貸市場是一個用戶對用戶的借貸平臺,平臺不參與任何借貸和放貸。市場出現大幅波動的時候,就會出現因為市場借貸需求增長同時提供理財借出的資金不足而造成的市場無幣可借的問題.
1900/1/1 0:00:00