Substrate之旅4:基于Substrate私有链的搭建

article/2025/8/26 8:03:02

参考:https://docs.substrate.io/tutorials/v3/private-network/

实现目标

这里我们学习:

  1. 如何基于Substrate来构成一个两节点的链网络。
  2. 如何配置使用Aura的共识机制。
  3. 如何定制账户,并设置其为Aura的Validator。

启动两个节点的链网络

确认环境准备好了

  1. Rust及相关Rust的工具链已安装。
  2. Substrate node template源码已下载好,且编译通过。
  3. Subkey已安装好(它的安装步骤将在“自主生成key”部分详细讲)。

基于Substrate节点模板启动两节点的链网络

这里,我们将基于节点模板里缺省有的两个账户Alice和Bob,来启动两个Substrate节点,并让这个两个节点相互连接,形成一个链网络。因此,经过这部分学习后,我们应掌握基于Substrate构建多节点链网络的基本步骤。

基于Alice启动Substrate节点

  1. 执行以下的命令,清除之前节点启动可能残留的数据
./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]

注:如果希望新建的链是纯净的,就应清除之前启动过的链的数据。

  1. 执行以下的命令,用alice这个账户来启动一个substrate节点。
./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-pathSpecifies the directory for storing all of the data related to this chain.
--chain localSpecifies the chain specification to use. Valid predefined chain specifications include local, development, and staging.
--aliceAdds 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 30333Specifies 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 9945Specifies 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 9933Specifies the port to listen on for incoming RPC traffic. The default port is 9933.
--node-key <key>Specifies the Ed25519 secret key to use for libp2p networking. You should only use this option for development and testing.
--telemetry-urlSpecifies 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.
--validatorSpecifies that this node participates in block production and finalization for the network.

如果想更详细地了解这些选项,可以输入以下的命令

./target/release/node-template --help
  1. 我们查看节点输出信息,以确认该节点是否运行正常:
    在这里插入图片描述
  • 先关注🔨 Initializing Genesis block/state (state: 0x7384…0308, header-hash: 0xd2dc…3cc2), 它表示节点应完成初始化,而且生成了创世区块,后面再启动节点,并要与该节点,连成一个网络,这里的信息就应一样;
  • 再看🏷 Local node identity is: 12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp 它指定了该节点的唯一ID:
    • 它的值是由上面命令的选项--node-key决定的;
    • 后面Bob节点想要连接这个节点,就会用到这个ID。
  • 💤 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 }, 这是由于连接遥测服务器失败。

这个错误,我们后面再分析。

  1. 浏览器中打开以下网址,以查看节点信息
https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A9945#/explorer

会看到以下信息:
在这里插入图片描述

基于Bob启动Substrate节点

  1. 清除与Bot账户相关的数据。
./target/release/node-template purge-chain --base-path /tmp/bob --chain local -y
  1. 启动关联着账户Bob的第二个Substrate节点:
./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)]

  1. 几个注意点
  • 命令选项--bootnodes中的ID,应与Alice那个节点一致;
  • 由于我们两个节点是运行在同一台机器上,所以--port --ws-port --rpc-port指定的端口号,应与Alice节点不一样,也应与机器中其它应用占用的端口号不一样。

自主生成key

如果是一条私有链,肯定不能用模板代码里缺省的Alice、Bob、Charly等的账户密钥。所以这个章节里来学习如何为私有定制的链创建自有的账户密钥组。

生成密钥工具准备

生成Substrate的密钥组,有两种方式:

  1. 基于node-template的子命令key来生成。
  2. 通过Subkey命令行程序来生成。

由于Subkey具有密钥生成功能,还有密钥解析等功能。所以这里我们将通过Subkey这个工具来生成Substrate的密钥工具。

  1. 下载paritytech substrate的git仓库
git clone https://github.com/paritytech/substrate.git
cd substrate
  1. 编译出substrate可执行的二进制程序
# Run this in the Substrate working directory
cargo build -p subkey --release
  1. 确认substrate编译成功
# 查看命令帮助
subkey -h# 查看具体子命令帮助
subkey <sub-command> -h# 查看版本
subkey --version

在这里插入图片描述

注:上编译生成的二进制可执行文件在./target/release/subkey

  1. 下面则是用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 veryNetwork ID:        substrateSecret seed:       0xc8fa03532fb22ee1f7f6908b9c02b4e72483f0dbd66e4cd456b8f34c6230b849Public key (hex):  0xd6a3105d6768e956e9e5d41050ac29843f98561410d3a47f9dd5b3b227ab8746Account ID:        0xd6a3105d6768e956e9e5d41050ac29843f98561410d3a47f9dd5b3b227ab8746Public key (SS58): 5Gv8YYFu8H1btvmrJy9FjjAWfb99wrhV3uhPFoNEr918utyRSS58 Address:      5Gv8YYFu8H1btvmrJy9FjjAWfb99wrhV3uhPFoNEr918utyR
  1. 下面则是用subkey来查阅密钥种子对应的密钥信息
subkey inspect 0xc8fa03532fb22ee1f7f6908b9c02b4e72483f0dbd66e4cd456b8f34c6230b849

该命令的输出是:

Secret Key URI `0xc8fa03532fb22ee1f7f6908b9c02b4e72483f0dbd66e4cd456b8f34c6230b849` is account:Network ID:        substrate Secret seed:       0xc8fa03532fb22ee1f7f6908b9c02b4e72483f0dbd66e4cd456b8f34c6230b849Public key (hex):  0xd6a3105d6768e956e9e5d41050ac29843f98561410d3a47f9dd5b3b227ab8746Account ID:        0xd6a3105d6768e956e9e5d41050ac29843f98561410d3a47f9dd5b3b227ab8746Public key (SS58): 5Gv8YYFu8H1btvmrJy9FjjAWfb99wrhV3uhPFoNEr918utyRSS58 Address:      5Gv8YYFu8H1btvmrJy9FjjAWfb99wrhV3uhPFoNEr918utyR
  1. 这里顺便讲讲密钥的两种格式
  • 纯十六进制;
  • ss58编码格式。

密钥生成

  1. 生成sr25519密钥
subkey generate

该命令的输出:

Secret phrase:       cheese member coin boring actual vehicle mountain obtain obey expect together chatNetwork ID:        substrateSecret seed:       0xacc29d509e2ccbdc2e3e6e40f7793c2186133b0f50a5b90de3fa4c8f12b8e7baPublic key (hex):  0x90917068a441d2ea0e1aed40fb30d57d290efe705e937ef2c52f3bfb82aa3e4fAccount ID:        0x90917068a441d2ea0e1aed40fb30d57d290efe705e937ef2c52f3bfb82aa3e4fPublic key (SS58): 5FLFxTafwbAHxBmKs1pS3MVcfFFDo9N3Vpo23eGzddxS6itxSS58 Address:      5FLFxTafwbAHxBmKs1pS3MVcfFFDo9N3Vpo23eGzddxS6itx

该命令缺省用的助记词是12个。为了安全,可以用选项--word 24来选择用24个助记词。除了12与24这两个参数,还支持15、18、21。

  1. 生成ed25519密钥
subkey generate --scheme ed25519

这里使用了--scheme来指定所用的密钥格式。

该命令的输出:

Secret phrase:       enact acoustic logic soap witness hurt knee web gravity bid hawk projectNetwork ID:        substrateSecret seed:       0xa30dd474ade0684aa08f6cf28370613c193d92a1215b98a6ed0248dbe60d68f5Public key (hex):  0xdf12dc2da06e364c6bfe6bac80afe74356e9784d10ad1d72df41183c5b7aa5dfAccount ID:        0xdf12dc2da06e364c6bfe6bac80afe74356e9784d10ad1d72df41183c5b7aa5dfPublic key (SS58): 5H7C8xgztQ5AyiXN36LXMygcy7AcAsUbrkY9AAbcF4R6p8JJSS58 Address:      5H7C8xgztQ5AyiXN36LXMygcy7AcAsUbrkY9AAbcF4R6p8JJ
  1. 下面是关于输出信息的解释
  • Secret phrase,助记词。
  • Secret seed,私钥,可以通过它来恢复公、私钥对。
  • Public key (hex),公钥,十六机制格式。
  • Account ID,十六机制公钥的别名。
  • SS58 Address,与公钥绑定的基于SS58格式的地址。
  1. Substrate为一个账户创建密钥,要同时创建两对
  • Sr25519密钥对,用于aura共识;
  • Ed25519密钥对,用于GRANDPA共识;
  • 创建Ed25519密钥对,应当使用前面Sr25519密钥对产生的助记词,以确保两对密钥对,是授予同一个账户。
  1. 为了组建私有定制的链网络,我们应该按照上面的命令,至少为两个账户生成密钥

定制私有链规格(Spec)

一条链区别与其它的链,关键在于创世区块不同。而创世区块的生成,又依赖于链的Spec配置。因此,这里将讲讲基于Substrate,链的Spec获取与定制。

在这个Spec定制中,我们将使用上面生成的两个密钥组,以便两组密钥账户成为该私有链的Validators。

获得链Spec

执行以下的命令,将模板节点local链的Spec,导致指定文件customSpec.json

./target/release/node-template build-spec --disable-default-bootnode --chain local > customSpec.json

修改链Spec

下面就是基于上面导出的Spec文件customSpec.json,进行修改。

  1. 修改Spec里的name配置为下面的内容。
"name": "My Custom Testnet",
  1. 用前面生成的两个Sr25519 SS58地址更换aura域的对应地址。
  2. 用前面生成的两个Ed25519 SS58地址更换grandpa域的对应地址。
  • 我们看到grandpa域里,除了地址值,还有个数字,它用来设定该账户的投票权重。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5BUHIMKa-1656495046023)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\1652170469802.png)]

  1. 将上面编辑好的Spec文件``,转换成Raw格式,以便运行的节点,可以访问。
./target/release/node-template build-spec --chain=customSpec.json --raw --disable-default-bootnode > customSpecRaw.json
  1. 将生成好的Raw格式的Spec文件,分发给需要连入同一私有链的同事。

启动私有链

这里则讲讲如何使用定制的链Spec业启动这条具体的链。

  1. 执行以下的命令,启动引导节点(bootnode)
./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

下面是上面命令,几个选项的含义:

  • –base-path,指定了该节点的工作运行时的工作目录;
  • –chain,指定该节点启动所遵循的Spec
  • –rpc-methods Unsafe,表明该节点是测试用,允许使用非安全的通信模式
  • –name,为该节点起了一个名字
  1. 查看bootnode启动的信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MOOkKyzh-1656495046024)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\1652171979593.png)]

  • 可以看到该节点的创世区块的Hash与缺省模板节点不一样;
  • 同样,请记下该节点的ID:12D3KooWLkg3xZFTf6YEyonVjQheBWQgFJ6x29bpKuJJYb5ysWFv
  1. 执行以下的命令,以将一个aura的密钥,存放到keystore,以便对aura共识签名
./target/release/node-template key insert --base-path /tmp/node01 \
--chain customSpecRaw.json \
--scheme Sr25519 \
--suri <your-secret-seed> \
--password-interactive \
--key-type aura
  • 其中,应替换为你生成一个密钥对时的助记词,或密码种子。
  1. 执行以下的命令,将与上面同用户的grandpa密钥插入keystore,以便对grandpa共识进行签名
./target/release/node-template key insert --base-path /tmp/node01 \
--chain customSpecRaw.json \
--scheme Ed25519 \
--suri <your-secret-key> \
--password-interactive \
--key-type gran

其中,应替换为你生成一个密钥对时的助记词,或密码种子。

  1. 通过以下的命令,可以查阅keystore的变化
ls /tmp/node01/chains/local_testnet/keystore

该命令将输出如下

617572611441ddcb22724420b87ee295c6d47c5adff0ce598c87d3c749b776ba9a647f04
6772616e1441ddcb22724420b87ee295c6d47c5adff0ce598c87d3c749b776ba9a647f04
  1. 下面是启动其它节点来与bootnode组建成一个私有链。
  • 执行以下命令启动第二个节点
./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
  • 为这个节点添加aura和grandpa的密钥对
  • 重启这个节点。

碰到的问题

访问telemetry.polkadot.io报错

这主要是网络所致。所以请通过以下几步,来确保网络通畅:

  1. 防火墙:如果是调试机器,不妨把防火墙关闭。
  2. 在启动节点的命令里加上以下两个选项:
  • –unsafe-rpc-external
  • –unsafe-ws-external

由于我们的节点是本地定制开发的,可能存在不安全的情形。因此就通过这两个选项,告诉远端服务器本地节点的相应接口调用,可能存在不安全的情形。

我这边确认上面步后,也许由于网络本身的问题,可能会存在超时的问题,但总体的工作正常。

报文件描述符limit太低

按告警提示,执行以下命令,将Ubuntu的最大打开文件数,设置为10000。

ulimit -SHn 10000

执行完命令,不妨再执行以下的命令查验一下

ulimit -n

http://chatgpt.dhexx.cn/article/gOxrL52d.shtml

相关文章

cydia java_Cydia Substrate 使用

前言 我们以前介绍过Xposed&#xff0c;这个只可以Hook java层&#xff0c;如果要hook native层就要使用InlineHook了&#xff0c;以前的文章都有提到。今天介绍一个既可以Hook java层又可以Hook native层的框架&#xff0c;就是Cydia Substrate。 环境 安装Cydia Substrate ap…

10E polkadot substrate : 配置合约托盘

• 介绍 • 添加托盘依赖项 • 实现 Contracts 配置特征 • 公开合约 API • 更新外部节点 • 启动本地 Substrate 节点 • Substrate Tutorials , Substrate 教程 • Contact 联系方式 • 介绍 如果您完成了构建本地区块链教程&#xff0c;那么您已经知道 Substrate节点模板…

Substrate之旅2:Substrate开发环境搭建

我们将基于Ubuntu 18.04来安装Substrate的开发环境。 我这边Ubuntu是安装在VMWorkstation虚拟机上的。 安装依赖 安装参考&#xff1a;https://docs.substrate.io/tutorials/v3/create-your-first-substrate-chain/#install-rust-and-the-rust-toolchain 但具体的操作步骤&…

认识substrate

了解substrate 前言从互联网发展看区块链未来--跨链跨链是未来 公链和联盟链可交互的联盟链polkadot组件substrate介绍区块链的构造组件substrate开发的特性 polkadot :substrate 之上建立如何通过substrate构造自己的链一键链上升级--永不分叉为什么需要链上升级 substrate与企…

CydiaSubstrate框架

往期推荐 Frida Native层HOOK Frida hook Java层 frida环境安装 Xposed框架安装、使用及插件开发 需要相关资料的朋友&#xff0c;可以【[加入此处即可打包获取]】 Cydia Substrate是一个基于Hook的代码修改框架&#xff0c;可以在Android、iOS平台使用&#xff0c;并实现…

创建Substrate 私有网络

创建Substrate 私有网络 所有区块链都要求网络中的节点就消息集及其顺序达成一致&#xff0c;以成功创建区块并从一个区块推进到下一个区块。每个块代表特定时间点的数据状态&#xff0c;节点对状态的一致称为共识。有几种不同的算法用于达成共识&#xff0c;包括&#xff1a;…

Build the Substrate Kitties Chain(中文翻译)

欢迎来到Substrate Kitties课程。 本课程将向您介绍如何构建一个可以创建并持有非同质化代币&#xff08;NFT&#xff0c;这个NFT名称为Substrate Kitties&#xff09;的区块链。课程分为部2部分&#xff1a; Part I 描述如何构建Kitties pallet&#xff0c;以及这个pallet怎样…

oracle substrate,Substrate 2.0 带来了哪些改变?

Substrate 已到了 2.0 版本的主要里程碑处。该区块链框架现在包含链下工作机(off-chain workers)和 70 多个可组合模块&#xff0c;并为构建优化的、与 Polkadot 兼容的、可投入生产的区块链奠定了坚实的基础。数十个实时区块链已经在运行 Substrate 2.0&#xff0c;包括Polkad…

Substrate 基础教程(Tutorials) -- 授权特定节点

五、授权特定节点 在添加可信节点中&#xff0c;您看到了如何使用一组已知的验证器节点构建一个简单的网络。该教程演示了一个简化版的许可网络&#xff08;permissioned network&#xff09;。在一个被许可的网络中&#xff0c;只有被授权的节点&#xff08;authorized nodes…

Substrate常见问题

目录标题 1. Rust nightly not installed, please install it!2. Rust WASM toolchain not installed, please install it!3. use pallet::*出错4. failed to load manifest for workspace member5. error: failed to run custom build command for node-template-runtime v4.0…

什么是 Substrate

如果你关注了 Polkadot 项目&#xff0c;可能会多次看到「Substrate」这个词。 它是 Polkadot 项目的重要组成部分&#xff0c;但有关它的信息非常少。 白皮书或黄皮书里找不到&#xff0c; 至少没有专门的介绍「Substrate」。 从较高的层面来看&#xff0c;Substrate 是一个可…

Substrate之旅3:Substrate是什么

Substrate 是从Polkadot 孵化出来的项目。它是一个用来搭建区块链的通用框架&#xff0c;具有以下特点&#xff1a; 可扩展。模块化。开源。 Substrate的框架与组件 框架 其中&#xff1a; P2P: libp2p网络协议&#xff0c;Substrate基于该协议实现了一个不带任何假设的&…

Substrate 基础 -- 教程(Tutorials)

官网 github DOC 面向未来的区块链框架 Substrate 使开发人员能够快速、轻松地构建适合任何用例的未来 证明区块链(future proof blockchains)。 Substrate 文档包括区块链构建器&#xff08;blockchain builders&#xff09;和parachain 项目团队的概念、过程和参考信息。…

【Android 逆向】substrate 框架 ( substrate 简介 | substrate 相关文档资料 )

文章目录 一、substrate 简介二、substrate 相关文档资料 一、substrate 简介 substrate 官网 : http://www.cydiasubstrate.com substrate 框架 是 Cydia 下的逆向工具 , 该框架是开源的 ; substrate 配合对应的 so 动态库 和 头文件 , 可以在 Android / iOS 平台中独立运行 …

ios tableView那些事(三)给tableView添加些图片

感觉光有数据的tableView很丑&#xff0c;那么我们就来美化下吧&#xff0c;加一些图片 #import <UIKit/UIKit.h> /*tableview 一定要用到这两个delegate UITableViewDataSource,UITableViewDelegate */ interface ViewController :UIViewController <UITableViewDa…

QT的TableView实现多级表头

QT的TableView实现多级表头 最近项目需要支持多级表头&#xff0c;QT本身不支持。可重写QHeaderView表头实现。 demo如下&#xff1a; FSItemDelegate.h #pragma once/* 自定义委托类 */ #include <QItemDelegate> #include <QSpinBox> #include <QDoubleSpin…

QML类型:TableView

一、描述 TableView 显示从内置 QML 类型&#xff08;如 ListModel 和 XmlListModel&#xff09;创建的模型中的数据&#xff0c;这些模型仅填充 TableView 中的第一列。要创建具有多列的模型&#xff0c;请使用 TableModel 或继承 QAbstractItemModel 的 C 模型。 TableView…

QML TableView表格使用示例

前言 QML中实现表格可以使用多种方式&#xff0c;比如直接使用ListView&#xff0c;定义每一行delegate&#xff0c;或者自定义Rectangle&#xff0c;放到Flipable中组合使用。Qt Quick Control1中 从5.1版本开始就提供了表格控件&#xff0c;但是感觉不怎么好用&#xff0c;在…

Qt TableView的简单使用

软件环境&#xff1a; ubuntu -------------------------------------------------------------------------------------------------------- 最终效果图&#xff1a; --------------------------------------------------------------------------------------------------…

PyQt5 TableView组件

一、话不多说&#xff0c;先看图 本次要实现的是主窗口内添加widget组件&#xff0c;widget内设置成垂直盒布局&#xff0c;然后在布局中添加tableView、PushButton组件 二、看main函数 if __name__ __main__:app QApplication(sys.argv)# 现在这创建 主窗口 &#xff08;不然…