参考:https://docs.substrate.io/tutorials/v3/private-network/
这里我们学习:
这里,我们将基于节点模板里缺省有的两个账户Alice和Bob,来启动两个Substrate节点,并让这个两个节点相互连接,形成一个链网络。因此,经过这部分学习后,我们应掌握基于Substrate构建多节点链网络的基本步骤。
./target/release/node-template purge-chain --base-path /tmp/alice --chain local
该命令会提示,敲入y
Are you sure to remove "/tmp/alice/chains/local_testnet/db/full"? [y/N]
注:如果希望新建的链是纯净的,就应清除之前启动过的链的数据。
./target/release/node-template \
--base-path /tmp/alice \
--chain local \
--alice \
--port 30333 \
--ws-port 9945 \
--rpc-port 9933 \
--node-key 0000000000000000000000000000000000000000000000000000000000000001 \
--telemetry-url "wss://telemetry.polkadot.io/submit/ 0" \
--validator
下面是该命令用到的选项的含义:
:Option | :Description |
---|---|
--base-path |
Specifies the directory for storing all of the data related to this chain. |
--chain local |
Specifies the chain specification to use. Valid predefined chain specifications include local , development , and staging . |
--alice |
Adds the predefined keys for the alice account to the node’s keystore. With this setting, the alice account is used for block production and finalization. |
--port 30333 |
Specifies the port to listen on for peer-to-peer (p2p ) traffic. Because this tutorial uses two nodes running on the same physical computer to simulate a network, you must explicitly specify a different port for at least one account. |
--ws-port 9945 |
Specifies the port to listen on for incoming WebSocket traffic. The default port is 9944 . This tutorial uses a custom web socket port number (9945 ). |
--rpc-port 9933 |
Specifies the port to listen on for incoming RPC traffic. The default port is 9933 . |
--node-key |
Specifies the Ed25519 secret key to use for libp2p networking. You should only use this option for development and testing. |
--telemetry-url |
Specifies where to send telemetry data. For this tutorial, you can send telemetry data to a server hosted by Parity that is available for anyone to use. |
--validator |
Specifies that this node participates in block production and finalization for the network. |
如果想更详细地了解这些选项,可以输入以下的命令
./target/release/node-template --help
Initializing Genesis block/state (state: 0x7384…0308, header-hash: 0xd2dc…3cc2)
, 它表示节点应完成初始化,而且生成了创世区块,后面再启动节点,并要与该节点,连成一个网络,这里的信息就应一样; Local node identity is: 12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp
它指定了该节点的唯一ID:
--node-key
决定的; Idle (0 peers), best: #0 (0xd2dc…3cc2), finalized #0 (0xd2dc…3cc2), ⬇ 0 ⬆ 0
, 这个信息中的0 peers
表示链网络中没有其它的节点;后面的两个#0
则分别表示没有区块产生和确认。❌ Error while dialing /dns/telemetry.polkadot.io/tcp/443/x-parity-wss/%2Fsubmit%2F: Custom { kind: Other, error: Timeout }
, 这是由于连接遥测服务器失败。这个错误,我们后面再分析。
https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A9945#/explorer
./target/release/node-template purge-chain --base-path /tmp/bob --chain local -y
./target/release/node-template \
--base-path /tmp/bob \
--chain local \
--bob \
--port 30334 \
--ws-port 9946 \
--rpc-port 9934 \
--telemetry-url "wss://telemetry.polkadot.io/submit/ 0" \
--validator \
--bootnodes /ip4/127.0.0.1/tcp/30333/p2p/12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp
peers
都是1
了,也就是双方都看到了对方,它们俩组成了一个链网络。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DmixwKtR-1656495046021)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\1652081062719.png)]
--bootnodes
中的ID,应与Alice那个节点一致;--port --ws-port --rpc-port
指定的端口号,应与Alice节点不一样,也应与机器中其它应用占用的端口号不一样。如果是一条私有链,肯定不能用模板代码里缺省的Alice、Bob、Charly等的账户密钥。所以这个章节里来学习如何为私有定制的链创建自有的账户密钥组。
生成Substrate的密钥组,有两种方式:
node-template
的子命令key
来生成。由于Subkey具有密钥生成功能,还有密钥解析等功能。所以这里我们将通过Subkey这个工具来生成Substrate的密钥工具。
git clone https://github.com/paritytech/substrate.git
cd substrate
# Run this in the Substrate working directory
cargo build -p subkey --release
# 查看命令帮助
subkey -h
# 查看具体子命令帮助
subkey <sub-command> -h
# 查看版本
subkey --version
注:上编译生成的二进制可执行文件在./target/release/subkey
subkey inspect "caution juice atom organ advance problem want pledge someone senior holiday very"
该命令的输出如下:
Secret phrase: caution juice atom organ advance problem want pledge someone senior holiday very
Network ID: substrate
Secret seed: 0xc8fa03532fb22ee1f7f6908b9c02b4e72483f0dbd66e4cd456b8f34c6230b849
Public key (hex): 0xd6a3105d6768e956e9e5d41050ac29843f98561410d3a47f9dd5b3b227ab8746
Account ID: 0xd6a3105d6768e956e9e5d41050ac29843f98561410d3a47f9dd5b3b227ab8746
Public key (SS58): 5Gv8YYFu8H1btvmrJy9FjjAWfb99wrhV3uhPFoNEr918utyR
SS58 Address: 5Gv8YYFu8H1btvmrJy9FjjAWfb99wrhV3uhPFoNEr918utyR
subkey inspect 0xc8fa03532fb22ee1f7f6908b9c02b4e72483f0dbd66e4cd456b8f34c6230b849
该命令的输出是:
Secret Key URI `0xc8fa03532fb22ee1f7f6908b9c02b4e72483f0dbd66e4cd456b8f34c6230b849` is account:
Network ID: substrate
Secret seed: 0xc8fa03532fb22ee1f7f6908b9c02b4e72483f0dbd66e4cd456b8f34c6230b849
Public key (hex): 0xd6a3105d6768e956e9e5d41050ac29843f98561410d3a47f9dd5b3b227ab8746
Account ID: 0xd6a3105d6768e956e9e5d41050ac29843f98561410d3a47f9dd5b3b227ab8746
Public key (SS58): 5Gv8YYFu8H1btvmrJy9FjjAWfb99wrhV3uhPFoNEr918utyR
SS58 Address: 5Gv8YYFu8H1btvmrJy9FjjAWfb99wrhV3uhPFoNEr918utyR
subkey generate
该命令的输出:
Secret phrase: cheese member coin boring actual vehicle mountain obtain obey expect together chat
Network ID: substrate
Secret seed: 0xacc29d509e2ccbdc2e3e6e40f7793c2186133b0f50a5b90de3fa4c8f12b8e7ba
Public key (hex): 0x90917068a441d2ea0e1aed40fb30d57d290efe705e937ef2c52f3bfb82aa3e4f
Account ID: 0x90917068a441d2ea0e1aed40fb30d57d290efe705e937ef2c52f3bfb82aa3e4f
Public key (SS58): 5FLFxTafwbAHxBmKs1pS3MVcfFFDo9N3Vpo23eGzddxS6itx
SS58 Address: 5FLFxTafwbAHxBmKs1pS3MVcfFFDo9N3Vpo23eGzddxS6itx
该命令缺省用的助记词是12个。为了安全,可以用选项--word 24
来选择用24个助记词。除了12与24这两个参数,还支持15、18、21。
subkey generate --scheme ed25519
这里使用了--scheme
来指定所用的密钥格式。
该命令的输出:
Secret phrase: enact acoustic logic soap witness hurt knee web gravity bid hawk project
Network ID: substrate
Secret seed: 0xa30dd474ade0684aa08f6cf28370613c193d92a1215b98a6ed0248dbe60d68f5
Public key (hex): 0xdf12dc2da06e364c6bfe6bac80afe74356e9784d10ad1d72df41183c5b7aa5df
Account ID: 0xdf12dc2da06e364c6bfe6bac80afe74356e9784d10ad1d72df41183c5b7aa5df
Public key (SS58): 5H7C8xgztQ5AyiXN36LXMygcy7AcAsUbrkY9AAbcF4R6p8JJ
SS58 Address: 5H7C8xgztQ5AyiXN36LXMygcy7AcAsUbrkY9AAbcF4R6p8JJ
一条链区别与其它的链,关键在于创世区块不同。而创世区块的生成,又依赖于链的Spec配置。因此,这里将讲讲基于Substrate,链的Spec获取与定制。
在这个Spec定制中,我们将使用上面生成的两个密钥组,以便两组密钥账户成为该私有链的Validators。
执行以下的命令,将模板节点local
链的Spec,导致指定文件customSpec.json
./target/release/node-template build-spec --disable-default-bootnode --chain local > customSpec.json
下面就是基于上面导出的Spec文件customSpec.json
,进行修改。
name
配置为下面的内容。"name": "My Custom Testnet",
aura
域的对应地址。grandpa
域的对应地址。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5BUHIMKa-1656495046023)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\1652170469802.png)]
./target/release/node-template build-spec --chain=customSpec.json --raw --disable-default-bootnode > customSpecRaw.json
这里则讲讲如何使用定制的链Spec业启动这条具体的链。
./target/release/node-template \
--base-path /tmp/node01 \
--chain ./customSpecRaw.json \
--port 30333 \
--ws-port 9945 \
--rpc-port 9933 \
--telemetry-url "wss://telemetry.polkadot.io/submit/ 0" \
--validator \
--rpc-methods Unsafe \
--name MyNode01
下面是上面命令,几个选项的含义:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MOOkKyzh-1656495046024)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\1652171979593.png)]
./target/release/node-template key insert --base-path /tmp/node01 \
--chain customSpecRaw.json \
--scheme Sr25519 \
--suri <your-secret-seed> \
--password-interactive \
--key-type aura
./target/release/node-template key insert --base-path /tmp/node01 \
--chain customSpecRaw.json \
--scheme Ed25519 \
--suri <your-secret-key> \
--password-interactive \
--key-type gran
其中,应替换为你生成一个密钥对时的助记词,或密码种子。
ls /tmp/node01/chains/local_testnet/keystore
该命令将输出如下
617572611441ddcb22724420b87ee295c6d47c5adff0ce598c87d3c749b776ba9a647f04
6772616e1441ddcb22724420b87ee295c6d47c5adff0ce598c87d3c749b776ba9a647f04
./target/release/node-template \
--base-path /tmp/node02 \
--chain ./customSpecRaw.json \
--port 30334 \
--ws-port 9946 \
--rpc-port 9934 \
--telemetry-url "wss://telemetry.polkadot.io/submit/ 0" \
--validator \
--rpc-methods Unsafe \
--name MyNode02 \
--bootnodes /ip4/127.0.0.1/tcp/30333/p2p/12D3KooWLkg3xZFTf6YEyonVjQheBWQgFJ6x29bpKuJJYb5ysWFv \
--password-interactive
这主要是网络所致。所以请通过以下几步,来确保网络通畅:
由于我们的节点是本地定制开发的,可能存在不安全的情形。因此就通过这两个选项,告诉远端服务器本地节点的相应接口调用,可能存在不安全的情形。
我这边确认上面步后,也许由于网络本身的问题,可能会存在超时的问题,但总体的工作正常。
按告警提示,执行以下命令,将Ubuntu的最大打开文件数,设置为10000。
ulimit -SHn 10000
执行完命令,不妨再执行以下的命令查验一下
ulimit -n