跳到主要内容

02-substrate入门之模拟网络

模拟网络

本教程提供了有关如何使用一组权威的私有验证器启动私有区块链网络的基本介绍。

Substrate 节点模板使用权威共识模型,将块生产限制为授权账户的轮换列表。 授权账户(权威机构)负责以循环方式创建区块。

在本教程中,您将通过使用两个预定义的帐户作为使节点能够生成块的权限来了解权限共识模型在实践中的工作原理。 在这个模拟网络中,两个节点使用不同的帐户和密钥启动,但在单台计算机上运行。

在你开始之前 在开始之前,请验证以下内容:

  • 通过安装 Rust 和 Rust 工具链,您已经为 Substrate 开发配置了环境。

  • 您已完成构建本地区块链并在本地安装了 Substrate 节点模板。

  • 您通常熟悉软件开发和使用命令行界面。

  • 您通常熟悉区块链和智能合约平台。

教程目标

通过完成本教程,您将实现以下目标:

使用预定义的帐户启动区块链节点。

了解用于启动节点的关键命令行选项。

确定节点是否正在运行并产生块。

将第二个节点连接到正在运行的网络。

验证对等计算机产生并最终确定块。

启动第一个区块链节点

在生成密钥以启动您自己的私有 Substrate 网络之前,您可以使用称为本地的预定义网络规范并在预定义的用户帐户下运行来学习基本原理。

本教程通过使用名为 alicebob 的预定义帐户在单个本地计算机上运行两个 Substrate 节点来模拟专用网络。

启动区块链:

1.在您的计算机上打开终端shell。

2.切换到编译 Substrate 节点模板的根目录。 小Y注 参照第一节substrade入门之构建本地区块链

3.通过运行以下命令清除旧链数据:

./target/release/node-template purge-chain --base-path /tmp/alice --chain local

该命令会提示您确认操作:

Are you sure to remove "/tmp/alice/chains/local_testnet/db"? [y/N]:

4.键入 y 以确认您要删除链数据。

启动新网络时,您应该始终删除旧的链数据。

通过运行以下命令,使用 alice 帐户启动本地区块链节点:

./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

查看命令行选项

在继续之前,看一下如何使用以下选项来启动节点。

选项描述
--base-path指定用于存储与此链相关的所有数据的目录。
--chain local指定要使用的链规范。 有效的预定义链规范包括local, development,staging。
--alicealice 帐户的预定义密钥添加到节点的密钥库。 使用此设置,alice 帐户用于块生产和最终确定。
--port 30333指定要侦听对等 (p2p) 流量的端口。 由于本教程使用在同一台物理计算机上运行的两个节点来模拟网络,因此您必须为至少一个帐户显式指定不同的端口。
--ws-port 9945指定要侦听传入 WebSocket 流量的端口。 默认端口为 9944。本教程使用自定义 Web 套接字端口号 (9945)。
--rpc-port 9933指定侦听传入 RPC 流量的端口。 默认端口为 9933。
--node-key <key>指定用于 libp2p 网络的 Ed25519 密钥。 您应该只将此选项用于开发和测试。
--telemetry-url指定将遥测数据发送到何处。 对于本教程,您可以将遥测数据发送到 Parity 托管的任何人都可以使用的服务器。
--validator指定此节点参与网络的块生产和最终确定。

有关可用于节点模板的命令行选项的更多信息,请通过运行以下命令查看使用帮助:

./target/release/node-template --help

查看显示的节点消息

如果节点成功启动,终端会显示描述网络操作的消息。 例如,您应该看到类似于以下的输出:

2021-03-10 17:34:27  Substrate Node
2021-03-10 17:34:27 ✌️ version 3.0.0-1c5b984-x86_64-linux-gnu
2021-03-10 17:34:27 ❤️ by Substrate DevHub <https://github.com/substrate-developer-hub>, 2017-2021
2021-03-10 17:34:27 📋 Chain specification: Local Testnet
2021-03-10 17:34:27 🏷 Node name: Alice
2021-03-10 17:34:27 👤 Role: AUTHORITY
2021-03-10 17:34:27 💾 Database: RocksDb at /tmp/alice/chains/local_testnet/db
2021-03-10 17:34:27 ⛓ Native runtime: node-template-100 (node-template-1.tx1.au1)
2021-03-10 17:34:27 🔨 Initializing Genesis block/state (state: 0xea47…9ba8, header-hash: 0x9d07…7cce)
2021-03-10 17:34:27 👴 Loading GRANDPA authority set from genesis on what appears to be first startup.
2021-03-10 17:34:27 ⏱ Loaded block-time = 6000 milliseconds from genesis on first-launch
2021-03-10 17:34:27 Using default protocol ID "sup" because none is configured in the chain specs
2021-03-10 17:34:27 🏷 Local node identity is: 12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp
2021-03-10 17:34:27 📦 Highest known block at #0
2021-03-10 17:34:27 〽️ Prometheus server started at 127.0.0.1:9615
2021-03-10 17:34:27 Listening for new connections on 127.0.0.1:9945.
2021-03-10 17:34:32 💤 Idle (0 peers), best: #0 (0x9d07…7cce), finalized #0 (0x9d07…7cce), ⬇ 0 ⬆ 0
2021-03-10 17:34:37 💤 Idle (0 peers), best: #0 (0x9d07…7cce), finalized #0 (0x9d07…7cce), ⬇ 0 ⬆ 0
...

特别是,您应该注意输出中的以下消息:

  • 🔨 Initializing Genesis block/state (state: 0xea47…9ba8, header-hash: 0x9d07…7cce) 标识节点正在使用的初始块或genesis block。 当您启动下一个节点时,请验证这些值是否相同。
  • 🏷 Local node identity is: 12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp指定唯一标识此节点的字符串。 此字符串由用于使用 alice 帐户启动节点的 --node-key 确定。 当您启动第二个节点时,您可以使用此字符串来标识要连接的节点。
  • 2021-03-10 17:34:37 💤 Idle (0 peers), best: #0 (0x9d07…7cce), finalized #0 (0x9d07…7cce), ⬇ 0 ⬆ 0表示网络中没有其他节点并且没有块正在生成。 另一个节点必须加入网络,然后才能开始产生块。

向区块链网络添加第二个节点

现在您开始使用 alice 帐户密钥的节点正在运行,您可以使用 bob 帐户将另一个节点添加到网络中。 因为您要加入一个已经在运行的网络,所以您可以使用正在运行的节点来识别新节点要加入的网络。 这些命令与您之前使用的命令相似,但有一些重要区别。

要将节点添加到正在运行的区块链:

1.在您的计算机上打开一个新的终端sehll。 2.切换到编译 Substrate 节点模板的根目录。 3.通过运行以下命令清除旧链数据:

./target/release/node-template purge-chain --base-path /tmp/bob --chain local -y

4.通过运行以下命令,使用 bob 帐户启动第二个本地区块链节点:

./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

请注意此命令与上一个命令之间的以下差异:

  • 因为这两个节点在同一台物理计算机上运行,所以您必须为 --base-path--port--ws-port --rpc-port 选项指定不同的值。

  • 此命令包含 --bootnodes 选项并指定单个引导节点,即由 alice 启动的节点。

--bootnodes 选项指定以下信息:

  • ip4 表示节点的 IP 地址使用 IPv4 格式

  • 127.0.0.1 指定运行节点的 IP 地址。 在这种情况下,本地主机的地址。

  • tcpTCP 指定为用于对等通信( peer-to-peer )的协议。

  • 30333 指定用于点对点通信( peer-to-peer )的端口号。 在这种情况下,TCP 流量的端口号。

  • 12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp 标识该网络要与之通信的运行节点。 在这种情况下,节点的标识符开始使用 alice 帐户。

验证块已生成并最终确定

启动第二个节点后,节点应作为对等节点相互连接并开始生成块。

验证区块是否被连接:

1.验证您是否在启动第一个节点的终端中看到类似于以下内容的行:

2021-03-10 17:47:32  🔍 Discovered new external address for our node: /ip4/127.0.0.1/tcp/30333/p2p/12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp
2021-03-10 17:47:32 🔍 Discovered new external address for our node: /ip4/<your-computer-LAN-IP>/tcp/30333/p2p/12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp
2021-03-10 17:47:33 💤 Idle (1 peers), best: #0 (0x9d07…7cce), finalized #0 (0x9d07…7cce), ⬇ 1.0kiB/s ⬆ 1.0kiB/s
2021-03-10 17:47:36 🙌 Starting consensus session on top of parent 0x9d07d1757a9ca248e58141ce52a11fca37f71007dec16650b87a853f0d4c7cce
2021-03-10 17:47:36 🎁 Prepared block for proposing at 1 [hash: 0x727826a5e6fba9a13af11422d4677b5f0743cc733c382232328e69fd307d1d2f; parent_hash: 0x9d07…7cce; extrinsics (1): [0x768a…a9e2]]
2021-03-10 17:47:36 🔖 Pre-sealed block for proposal at 1. Hash now 0x4841d8b2e62483fa4702b3ddcd1b603803842374dcdc1e9533ad407708b33dd8, previously 0x727826a5e6fba9a13af11422d4677b5f0743cc733c382232328e69fd307d1d2f.
2021-03-10 17:47:36 ✨ Imported #1 (0x4841…3dd8)
2021-03-10 17:47:36 ✨ Imported #1 (0xb241…2ae8)
2021-03-10 17:47:38 💤 Idle (1 peers), best: #1 (0x4841…3dd8), finalized #0 (0x9d07…7cce), ⬇ 0.8kiB/s ⬆ 0.8kiB/s
2021-03-10 17:47:42 ♻️ Reorg on #1,0x4841…3dd8 to #2,0x8b6a…dce6, common ancestor #0,0x9d07…7cce
2021-03-10 17:47:42 ✨ Imported #2 (0x8b6a…dce6)
2021-03-10 17:47:43 💤 Idle (1 peers), best: #2 (0x8b6a…dce6), finalized #0 (0x9d07…7cce), ⬇ 0.8kiB/s ⬆ 0.7kiB/s
2021-03-10 17:47:48 🙌 Starting consensus session on top of parent 0x8b6a3ab2fe9891b1af008ea0d92dae9bc84cfa5578231e81066d47928822dce6
2021-03-10 17:47:48 🎁 Prepared block for proposing at 3 [hash: 0xb887aef2097eff5869e38ccec0302bce372ad05ac2cdf9cc4725c38ec071fb7a; parent_hash: 0x8b6a…dce6; extrinsics (1): [0x82ac…2f20]]
2021-03-10 17:47:48 🔖 Pre-sealed block for proposal at 3. Hash now 0x34d608dd8be6b82bef4a7aaae1ec80930a5c4b8cf9bdc99013410e91544f3a2a, previously 0xb887aef2097eff5869e38ccec0302bce372ad05ac2cdf9cc4725c38ec071fb7a.
2021-03-10 17:47:48 ✨ Imported #3 (0x34d6…3a2a)
2021-03-10 17:47:48 💤 Idle (1 peers), best: #3 (0x34d6…3a2a), finalized #0 (0x9d07…7cce), ⬇ 0.7kiB/s ⬆ 0.8kiB/s
2021-03-10 17:47:53 💤 Idle (1 peers), best: #3 (0x34d6…3a2a), finalized #1 (0xb241…2ae8), ⬇ 0.6kiB/s ⬆ 0.7kiB/s
2021-03-10 17:47:54 ✨ Imported #4 (0x2b8a…fdc4)
2021-03-10 17:47:58 💤 Idle (1 peers), best: #4 (0x2b8a…fdc4), finalized #2 (0x8b6a…dce6), ⬇ 0.7kiB/s ⬆ 0.6kiB/s

在这些行中,您可以看到有关您的区块链的以下信息:

  • 第一个节点是由 alice 启动的。

  • 该节点有一个对等点(1 peers)。

  • 节点产生了一些块(best: #4 (0x2b8a…fdc4))。

  • 这些块正在最终确定(finalized #2 (0x8b6a…dce6))。

2.验证您在启动第二个节点的终端中是否看到类似的输出。

3.在每个终端外壳中按 Control-c 关闭两个节点。

原文

https://docs.substrate.io/tutorials/get-started/simulate-network/