首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Substrate区块链开发框架简介 原

Substrate区块链开发框架简介 原

作者头像
用户1408045
发布于 2019-08-31 12:25:16
发布于 2019-08-31 12:25:16
3K00
代码可运行
举报
文章被收录于专栏:汇智网教程汇智网教程
运行总次数:0
代码可运行

Parity的Substrate区块链框架在最近几个月里的开发进展很迅速,基于Substrate的Polkadot区块链的开发也是如火如荼。这个教程的目的是介绍如何构建一个可以支持自己的运行时模块的Substrate链。

本教程的主要内容包括:

  • 学习Susbtrate链的安装与设置
  • 学习Susbtrate链的配置方法,以及如何使用Polkadot JS浏览区块链状态
  • 学习运行时模块的结构,以及如何使用运行时模块为你自己的定制区块链添加功能

1、关于Rust

Substrate和运行时模块都是使用Rust开发的。

Rust是一种底层静态类型语言,它的特点在于速度保障与可靠性,但是学习难度比较高。在区块链开发中一个非常重要但却经常被忽略的话题是:如何掌握Rust。在这个教程中我们不会分析Rust代码,但是对于希望使用Susbtrate进行区块链开发的工程师来说,掌握Rust是一个前提条件。

作为一种程序开发语言,Rust的学习曲线是比较陡峭的。部分原因在于Rust所采用语法规范,极其依赖于像泛型、特性萃取、生命周期和宏这样的特性,以及其他一些考虑例如作用于和不变性。

其他的Substrate学习资源,例如Substrate Kitties collectibles workshop 生成Rust非常容易掌握,但这不是真实的情况,除非你已经有比较多的底层语言的开发经历,例如C++,而且接触过比较多的涉及系统级管理的API

实际上,如果你是刚接触Rust,那么需要一点耐心,需要花时间来了解这门开发语言的核心概念和特性。在掌握Rust之后,Substrate的开发将变得令人享受。这本Rust书写的很好,很适合新手学习,也适合有经验的用户温习Rust。

2、安装Susbtrate

安装Substrate只需要调用Parity网站上的一个bash脚本。Substrate提供了两种安装方式:

如果希望快速掌握区块链应用的开发,推荐汇智网的区块链应用开发系列教程, 内容涵盖比特币、以太坊、eos、超级账本fabric和tendermint等多种区块链, 以及 java、go、nodejs、python、php、dart等多种开发语言

2.1 快速安装

快速安装将安装预构建的Substrate开发链、Substrate脚本、Substrate链命令行配置工具和运行时模块。

使用--fast标志来运行Substrate安装脚本会跳过安装那些对运行Sbustrate来说并非必要的工具:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~$ curl https://getsubstrate.io -sSf | bash -s -- --fast

上面的命令将拉取Susbtrate的依赖项,包括Rust、OpenSSL、LLVM等等,然后进行安装。

2.2 完整安装

完整安装除了包含上面的内容,还将安装以下两个工具:

  • SubKey:用于创建或恢复Substrate密钥的命令行工具,当你需要在命令行管理账户时会比较有用
  • Substrate node:预配置的Substrate节点,可以直接接入Substrate测试网络

运行下面的命令进行完整安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// full Substrate installation
~$ curl https://getsubstrate.io -sSf | bash

一旦安装脚本执行完毕,更新你的cargo环境以便调用新安装的程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~$ source ~/.cargo/env

现在使用substrate命令就可以访问预编译好的Substrate节点了。要验证Substrate node和SubKey是否正确安装,可以检查这两个程序的版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~$ substrate --version
~$ subkey --version

注意:Polkadot JS 应用已经在其账户管理界面中实现了subkey的功能 —— 可以在浏览器中管理账户而无需subkey,这也是subkey是可选安装的原因。

默认情况下,Substrate和工具程序安装在 ~/.cargo/bin目录中。你可以看一下具体的 安装内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~$ cd ~/.cargo/bin
~/.cargo/bin$ ls

你会注意到除了substrate和subkey,还有substrate-node-new和substrate-module-new这两个程序,接下来我们将使用这些程序来创建新的定制节点和运行时模块。

3、更新Substrate脚本

更新Substrate脚本需要克隆最新版本,然后使用下面的命令替换cargo的二进制程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~$ f=`mktemp -d` 
~$ git clone https://github.com/paritytech/substrate-up $f 
~$ cp -a $f/substrate-* ~/.cargo/bin 
~$ cp -a $f/polkadot-* ~/.cargo/bin

现在我们已经安装好了Substrate工具,可以运行Substrate开发节点了。这个节点会开始出块,但是对于开发而言没什么用。

在任何情况下,我们可以使用下面的命令启动Substrate开发链:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~$ substrate --dev

节点现在就起来了,你可以看到开始出块。要查看区块链的更多信息,例如每个支持模块的状态,我们将使用Polkadot JS应用。

要查看substrate的命令行选项,可以查看--help的输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~$ substrate --help

熟悉一下help命令的输出,是了解命令行程序的功能的得到验证的方法。目前的版本包含了一些对测试有用的标志,例如预配置的账户--alice--bob等等。--light标志可以按轻量模式运行节点,在框架中内置了对轻量客户端的支持。

在我们开始定制构建之前,然我们回顾一下如何查看Substrate链。基本的方法是使用Polkadot JS应用,该应用使用Typescript和react开发。

4、使用Polkadot JS App

Polkadot JS应用提供了基本的区块链浏览器功能,同时也提供了管理Substrate模块的API和接口。正如其名称所示,这个应用也支持Polkadot区块链。我们有两种途径来使用Polkadot JS:

让我们克隆项目在本地运行,一旦安装完成,我们可以指向我们的Susbtrate链的节点,在我们机器上的另一个运行进程。

首先克隆并运行Polkadot JS应用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~$ git clone https://github.com/polkadot-js/apps.git
~$ mv apps polkadot.js
~$ cd polkadot.js && yarn start

然后在另一个终端启动substrate开发链:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
substrate --dev

在浏览器中访问localhost:3000。为了让JS App连接到我们本地的开发链,在侧栏菜单中选择Settings,然后切换到Local Node endpoint,类似下图:

点击Save & Reload,你将注意到侧栏菜单中的许多链接激活了,具体哪些链接会激活取决于你的链的支持。

让我们看一下几乎所有链都会支持的特性 - 账户。进入到应用的Accounts部分 - 在My Account选项页你将看到一组账户,这些都是预配置的含余额的账户,我们也可以在这些账户之间转账、删除账户以及备份账户密钥。这表明了Plokadot JS App的定位 —— 在UI层与你的Substrate链交互。

在继续之前,我们要提一下Polkadot UI可以完成的任务:

  • 可以上传wasm编译的Ink智能合约
  • 作为一个POS共识链,Staking区域允许你抵押资金以成为交易验证人。
  • 设计Democracy区域的目的是处理链上的投票和管理
  • 在Toolbox区域可以测试Substrate的JSON RPC

你可以会困惑,哪些预配置的账户是哪里来的。事实上,这些账户,包括运行时逻辑自身的编译代码,都是保存在一个Chain Specification文件中,也被称为chain spec。

使用Chain Spec JSON文件配置链

链配置是一个大型JSON对象,使用substrate的build-spec命令生成。该命令将提取节点引入的运行时模块的配置项,有些是空值,有些则提供了默认值。

基本上,运行时模块可以依赖于创世配置,也就是在区块链初始化时我们提供的配置。区块链状态是由创世区块 —— 链的第一个区块 —— 来初始化的。chain specJSON文件的工作,就是定义这个初始状态。

一旦生成配置文件,我们就可以打开该文件,根据我们的需要进行修改。

节点提供了purge-chain命令来复位区块链,这通常用于开发中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~$ substrate purge-chain --dev

框架提供了三个默认的链规格,也就是配置:dev、local和staging。

  • dev:dev规格提供了主要用于开发,该配置中包含了一组账户以及运行时模块
  • local:local规格类似于dev,主要用于私有链。
  • staging:staging规格更加保守一些,定义了有限数量的账户,需要自己定义 模块相关的配置。当构建产品链时,应当选择这个规格。

我们现在要做的,就是使用build-spec命令创建一个新的chainspec,将输出结果存入单独的文件。例如,将规格写入当前用户主目录的my-chainspec.json文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~$ substrate build-spec --chain=dev > ~/my-chainspec.json

在文件编辑器里打开这个文件,查看可用的配置选项。

  • id:可以改为你自己的名字
  • name:给人看的名字
  • telemetryEndpoints:提供Telemetry服务的访问端结点
  • ...

一旦修改完chainspec文件,我们可以用--raw标志将其转化为原始编码状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~$ substrate build-spec --chain ~/chainspec.json --raw > ~/mychain.json

最终,我们使用这个链规格文件来启动我们的substrate链。以下假设你运行了一个自定义编译的substrate节点,使用节点的路径替换下面的<node_path>

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<node_path> --chain ~/mychain.json --validator

接下来让我们看看如何初始化并编译自定义的Substrate节点。

初始化Substrate节点

到目前位置,我们已经使用了预编译的Substrate节点。对于测试一下开发链很好,但是这限制了我们使用自己的运行时模块以及自定义配置。为解决此问题,我们需要下载Substrate源代码。

有两种方法来着手我们的自定义Substrate链:

  • 下载一个已经配置好的节点模板,例如使用下载脚本完整安装时包含的测试网节点模板
  • 使用Substrate脚本,下载官方的节点模板

基本上所有的Substrate项目都会基于官方的节点模板展开,除非一些特殊情况。

用下面的命令生成一个新的节点模板:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~$ substrate-node-new my-node "Ross Bulat"

命令执行需要花点时间 —— 要拉取最新的Substrate源码并且进行编译。

一旦完成,可以修改runtime/src目录下的lib.rs文件。同时也包含了运行时模块的模板template.rs。 接下来我们看一下运行时模块。

构建自定义节点

在节点目录中,在使用cargo编译出二进制程序之前,使用build.sh脚本将节点编译为wasm:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# build wasm
./scripts/build.sh

# build binary
cargo build --release

节点程序现在位于./target/release/ 目录。

之前我们已经使用substrate调用了一些命令,现在可以使用我们新编译出来的程序。要复位区块链并重新运行,执行如下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# clear chain state
./target/release/<node_name> purge-chain --dev

# run in dev mode
./target/release/<node_name> --dev

我们要介绍的最后一部分内容,是运行时模块。让我们看看什么是运行时模块以及如何在substrate节点中引入运行时模块。

Substrate运行时模块:区块链的插件机制

Substrate的通用和模块化结构使其实用性大大增强,开发人员可以将功能以插件形式加载到节点运行时,从而可以轻松地创建满足个性化需求的区块链。

这些插件化的功能包被称为模块,或者更确切地说,运行时模块。Substrate预置的运行时模块集合被称为Substrate运行时模块库 —— SRML。

这些模块非常有用,它们实现了其他区块链框架中的很多功能,可以在github浏览这些模块的代码。有了这些模块,开发人员不需要重新发明轮子,可以节省大量时间。当实现新特性时,也是以运行时模块的形式开发的。

SRML模块由Substrate统一维护,因此可靠性得到保障。下面是现在可用的一些模块:

  • Assets:提供类似ERC20代币支持的资产模块
  • Balances:管理账户余额的模块
  • Staking:: 网络维护者管理抵押资金的模块

你会注意到这些模块都是Rust crate格式,该格式被设计用于Substrate运行时环境。

每个SRML模块都打包为crates,并在模块名前加以srml_前缀,在Parity的crate库的左侧菜单中,可以找到这些模块。

运行时模块结构概述

每个模块都是定义在它自己的src/lib.rs文件中,遵循约定的结果。我们可以看一下一个substrate模块的顶层特征:

  • 一个模块通常自身是一个crate,但不是必须要求
  • 一个模块可以定义为单一文件module-name.rs,或者更常见的lib.rs,如果模块 是一个crate。一个模块也可以有其他支持文件
  • 一个模块必须遵守特定的结构,依赖于特定的Substrate API

最后一点指的是什么?一个模块为你的区块链增加功能,功能可以多种形式的组件提供:

事件:一个模块可以声明自定义事件,当特定条件满足时触发,例如,当你铸造非同质化通证时,可能是一个TokenCreated事件。事件被封装在 decl_event! 宏里:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
decl_event!(
    pub enum Event<T>
    where
        <T as system::Trait>::AccountId,
        <T as system::Trait>::Hash
    {
        TokenCreated(AccountId, Hash),
    }
);

存储:一个模块可以定义链上的持久化数据结构,例如映射表、列表等等。存储条目定义 在decl_storage!宏里:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
decl_storage! {
    trait Store for Module<T: Trait> as NFTStorage {
        TokenToOwner get(token): map T::Hash => Token<T::Hash, T::Hash>;
        TokenIndex get(get_token_by_index): map u64 => T::Hash;
        TotalTokens get(total_tokens): u64;
        ...
   }
}

可分发函数:JSON RPC可以调用的函数。

公开/私有函数:模块可以提供在运行时环境中可调用的公开函数,以及只可以在模块中调用的私有函数。

结构:模块可以定义结构,例如,在一个跟踪全球运输的区块链实现中,可能会定义一个ShipmenItem结构。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#[derive(Encode, Decode, Default, Clone, PartialEq)]
pub struct ShipmentItem<Hash, Balance> {
    id: Hash,
    container_id: Hash,
    price: Balance,
    weight: u64
}

初始化模块

类似于substrate-node-new工具,我们也下载了substrate-module-new工具。在节点运行时目录,使用下面的命令准备一个新的模块:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
substrate-module-new <module_name>

让我们将其命名为my-module:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd runtime/src
substrate-module-new my-module

> SRML module created as ./my-module.rs and added to git.
> Ensure that you include in your ./lib.rs the line:

> mod my_module;

结果文件my-module,将和最初目录中包含的template.rs文件一致。但是使用substrate-module-new是初始化一个新的运行时模块的官方推荐的方式。

现在我们可以开发这个模块,打包称create,甚至分发到github以便大家都可以维护。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[教程] 创建第一条 Substrate 链
翻译自官方文档: https://substrate.dev/docs/en/tutorials/create-your-first-substrate-chain/
Tiny熊
2020/07/24
1.6K0
[教程] 创建第一条 Substrate 链
深入浅出Substrate:剖析运行时Runtime
基于Substrate开发自己的运行时模块,会遇到一个比较大的挑战,就是理解Substrate运行时(Runtime)。本文首先介绍了Runtime的架构,类型,常用宏,并结合一个实际的演示项目,做了具体代码分析,以帮助大家更好地理解在Substrate中它们是如何一起工作的。
MikeLoveRust
2019/08/28
1.4K0
深入浅出Substrate:剖析运行时Runtime
开发应用专用的Substrate区块链!
Substrate是开发应用特定区块链 (Application Specific Blockchain )的快速开发框架。与基于以太坊等公链开发的DApp相比,应用特定区块链是围绕单一应用特别构建的专用区块链,因此具有最大的灵活性和最少的限制。本文将详细介绍如何使用Substrate框架快速实现一个简单的游戏应用专用区块链。
用户1408045
2019/09/11
1.5K0
开发应用专用的Substrate区块链!
​Substrate 环境安装提速文档
Substrate 环境安装提速文档(Mike版,仅限Debian/Ubuntu Linux 和 Mac brew)
MikeLoveRust
2019/08/19
1.2K0
Substrate 开发系列 - 环境搭建
Polkadot 目标是成为一个连接各区块链的区块链(网络),Substrate 是 Polkadot 生态中重要的一环, 他是一套工具与框架的集合,让我们以模块化的方式来构建自己的区块链。Polkadot本身也是基于 Subsstrate 创建的。
Tiny熊
2020/06/04
1.5K0
Substrate 开发系列 - 环境搭建
【区块链开发框架】-substrate(Polkadot运用)
Substrate是一个用于构建区块链的开源的、模块化的和可扩展的区块链开发框架。它由Parity以及个人开发者和许多公司组成的社区共同维护。Substrate可以用作开发公链、联盟链和私有链的基础,它可以在短时间内构建完整、可配置的区块链系统。另外一个可选方案,可以将构建的区块链部署到Polkadot网络中,以此获得共享安全等其他优势。
帆说区块链
2022/04/27
1.1K0
【区块链开发框架】-substrate(Polkadot运用)
使用Substrate开发区块链存证应用V2.0
本文是《使用Substrate开发区块链存证dApp》一文的更新,在一台全新服务器上,从零起步,采用最新的v2.0.0版本开发一个自定义的区块链存证dApp。
jasonruan
2020/12/14
1.4K0
substrate 合约模块简要剖析(一)
本文主要介绍 substrate 合约模块的实现逻辑,srml/contracts 提供了部署和执行 WASM 智能合约的功能。作为一个模块化的区块链框架,不管是未来的波卡平行链还是基于 substrate 拥有独立共识的链,比如 ChainX, 只要引入其合约模块,就具备了合约功能,可以成为一个智能合约平台。ChainX 目前就计划引入合约功能,对区块链智能合约开发者提供支持, 欢迎有兴趣的同学持续关注。
用户1558438
2019/09/27
1.1K0
substrate 合约模块简要剖析(一)
Web3 开发框架及特点
Web3 的开发框架有助于开发者构建基于区块链的应用程序(如去中心化应用 DApps)。以下是一些主流的 Web3 开发框架和工具。
数字孪生开发者
2024/12/10
1980
Web3 开发框架及特点
使用Ink!开发Substrate ERC20智能合约
ERC20 通证标准(ERC20 Token Standard)是通过以太坊创建通证时的一种规范。按照 ERC20 的规范可以编写一个智能合约,创建“可互换通证”。它并非强制要求,但遵循这个标准,所创建的通证可以与众多交易所、钱包等进行交互,它现在已被行业普遍接受。
jasonruan
2020/08/12
1.3K0
创建第一条substrate2.0链
官网上的安装代码会出现一个bug,即安装的源码一致,编译工具版本一致,但是最后编译出现问题。原因是cargo下载的package没有成功checkout到对应版本的代码。这里如果之前已经安装了相关的rust工具链条,需要先行卸载:
Tiny熊
2020/11/03
6520
创建第一条substrate2.0链
Substrate区块链框架学习小组
Substrate是一个由Rust语言写的区块链开发框架,是目前业界最强大,特性最丰富的区块链框架之一。使用Substrate,你可以很方便地搭建出一条链(solo链)。它可以开发公链,联盟链,私有链。作为开发框架(脚手架),它提供了一切必要的完善的基础组件,让你不需要从轮子造起。
MikeLoveRust
2022/11/28
1K0
Substrate源码分析:启动流程
我们在命令行启动 substrate 节点,到底发生了什么呢?本文基于 substrate 源码,对其启动流程进行了简单的分析。
MikeLoveRust
2019/08/19
9840
web3.0区块链NFT链游系统开发流程源码部署方案
Chain game是一款基于区块链技术运营的手机游戏,它使游戏玩家首次成为手机游戏的真正所有者。游戏玩家在游戏中拥有的武器和装备是可以自由交易的NFT,不会被游戏开发者操纵。其他游戏开发商可以为游戏玩家的NFT开发新游戏。如果之前的游戏软件开发得不好,游戏玩家可以使用NFT来玩新游戏。我们的团队很早就开始布局区块链游戏。未来,连锁游戏开发技术是同行中的先锋。
开发v_StPv888
2023/01/30
5540
Rust今天4岁啦, 为什么越来越多的知名项目用Rust来开发?
4年前的今天(2015年5月15日),Rust编程语言核心团队正式宣布发布Rust 1.0版本。
区块链大本营
2019/05/17
7.5K0
ChainBridge跨链协议快速教程【EVM/Substrate】
ChainBridge是一个可扩展的跨链通信协议,目前兼容EMV和Substrate链,支持两个不同的EVM区块链、或者一个EVM链与一个Substrate链之间的跨链桥接与通证转移,支持ERC20、ERC721等多种类型的通证的跨链转移,以及普通数据的跨链转移。在这个教程中,我们将介绍ChainBridge的基本构成和安装方法,并利用ChainBridge实现Substrate原生资产和以太坊ERC20/ERC721通证之间的跨链转移。
用户5687508
2021/05/30
1.8K0
浅谈量化合约对冲系统APP开发方案
目前大数据交易平台借助区块链底层技术有两个方向的解决方案,一是借助区块链数据不可篡改的特性来记录数据所有使用过程,把区块链用来做数据之间使用权转移的记账,做数据确权。另一种方式是借助隐私计算,实现不交易数据本身,只交易数据的计算结果。
开发v_StPv888
2022/11/07
3420
区块链 RWA软件系统的开发框架
开发区块链 RWA(Real-World Asset)软件系统是一个复杂的过程,涉及多个技术层面。选择合适的开发框架至关重要,它将直接影响开发效率、系统性能、安全性和可维护性。以下是一些关键的开发框架,可以根据系统的具体需求进行选择和组合。
数字孪生开发者
2025/04/15
2180
区块链 RWA软件系统的开发框架
从第一行代码到发链只需一小时,用这款新工具,你也能做到
古罗马,“乘法”是只有御用数学家才能理解的深奥概念——而当阿拉伯数字出现,孩童亦能于纸上演算。
区块链大本营
2018/12/11
5510
从第一行代码到发链只需一小时,用这款新工具,你也能做到
使用 Ink!开发 Substrate ERC20 智能合约
ERC20 通证标准(ERC20 Token Standard)是通过以太坊创建通证时的一种规范。按照 ERC20 的规范可以编写一个智能合约,创建“可互换通证”。它并非强制要求,但遵循这个标准,所创建的通证可以与众多交易所、钱包等进行交互,它现在已被行业普遍接受。
Tiny熊
2020/07/21
1K0
推荐阅读
相关推荐
[教程] 创建第一条 Substrate 链
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验