LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 币圈百科 > 【Substrate开发教程】12 - Substrate FRAME、基础数据类型、预置模块

【Substrate开发教程】12 - Substrate FRAME、基础数据类型、预置模块

2020-10-25 松果 来源:区块链网络


Substrate Runtime概述

Substrate Runtime层包含了区块链行为的逻辑定义,即区块链的状态转换函数(State Transition Function,STF)和可供用户调用的存储单元及函数。

Substrate提供了许多可配置的模块(pallet)以及模块与客户端互动所需的支持库,每一个pallet都定义了特定领域所需的业务逻辑和存储单元。

进行Substrate runtime开发,大多数时间是和这些pallet打交道,可以使用pallet的标准接口来编写自己的pallet,也可以访问其它pallet的公共函数和trait。

Substrate FRAME是Substrate中的一套预定义的pallet和支持库,FRAME通过实现Substrate primitives(基础类型)里的traits与客户端的进行交互。

可以看到,进行Substrate runtime开发,很多时候就是从FRAME中挑选各种模块(pallet)进行排列组合。

例如,如果想要在自己的区块链中添加智能合约功能,只需要将contractspallet包含进runtime即可,添加contracts模块后会暴露智能合约接口,用户就可以部署基于Wasm的智能合约。

Substrate runtime可以通过native和wasm两种方式运行,因此使用FRAME构建的区块链无需硬分叉就可以升级。

Substrate FRAME及其架构

FRAME(Framework for Runtime Aggregation of Modularized Entities,模块化实体运行时聚合框架)是Substrate中的一套预定义的pallet和支持库,pallets指的是FRAME中的单一功能模块,承载着特定业务逻辑。

Substrate Primitives提供了与核心客户端的交互接口,FRAME则提供了一些与Substrate Primitives交互的支持模块。

FRAME及其支持库的总体架构如下图所示:


FRAME及其支持库的总体架构包括:

1、系统库(SYSTEM MODULE),定义在frame_system,提供区块链的底层类型、存储和函数,其他所有pallet都依赖于系统库。

系统库定义了Substrate runtime的所有核心类型,如:Origin、Block Number、Account Id、Hash、Header、Version;还定义了大量的系统关键存储项,如:Account Nonce、Block Hash、Block Number、Events。

系统库还定义了许多底层函数,这些函数可以用来访问区块链存储单元、验证交易发送方等。

2、运行时库(RUNTIME MODULES):定义了运行时包含的pallet,将所有组件和pallets组合在一起构成最终的运行时环境,当开发者在runtime发起调用时,通过执行库的pallet把调用分派到这里。

3、执行库(EXECUTIVE MODE):定义在frame_executive,充当runtime的业务流程层,它把传入的extrinsic调用分派给运行时库里相应的pallets来处理。

4、支持库(SUPPORT LIBRARY):定义在frame_support,是Rust宏、类型、traits、函数的集合,简化了Substrate模块的开发。

5、运行时(RUNTIME):面向开发者,包括编程接口和执行环境。

基础数据类型(Runtime Primitives)

Runtime Primitives是一组基础类型,是构成Substrate runtime基础元素,分为核心类型(Core Primitives)和框架类型(FRAME Primitives)。

核心类型是runtime提供给Substrate其他层的最小基本假设,是必须定义的类型,且必须完成特定的接口才能在Substrate框架内工作。核心类型包括:

Hash:一种加密数据摘要,通常数据大小是256位;

type Hash = H256;

DigestItem:一种摘要编码类型;

type DigestItem = DigestItem<Hash>;

Digest:一系列的DigestItem,对与轻客户端相关的所有信息进行编码;

Struct sp_runtime::Digest

Extrinsic:会被添加进区块的来自链外的信息,通常涉及一个或多个签名,以及某种编码指令(如用于转移资金所有权或调用智能合约);

Trait sp_runtime::traits::Extrinsic

Header:区块头,包含一系列区块有关的信息:区块高度、extrinsic根哈希、链状态根哈希、父区块哈希、摘要;

Trait sp_runtime::traits::Header

Block:区块,由一个区块头和一组extrinsic组成;

type Block = Block<Header, OpaqueExtrinsic>;

BlockNumber:区块高度,表示任何有效区块具有的祖先数量,通常数据大小是32位;

type BlockNumber = u32;

框架类型是构建Substrate FRAME的一组附加基础类型,包括:

Call:可以被extrinsic调用的分发类型;

Trait sp_runtime::traits::Extrinsic::Call

Origin:表示call来自哪里,例如signed message来自一个transaction,unsigned message来自一个inherent extrinsic,runtime自己的调用来自一个root call;

Trait sp_runtime::traits::Dispatchable::Origin

Index:账户索引类型,也称为nonce,保存与发送者账户关联的先前交易数量;

type Index = u32;

Hashing:runtime使用的哈希算法,比如blake2;

Trait sp_runtime::traits::Header::Hashing

AccountId:runtime标识的用户账户;

type AccountId = <<Signature as Verify>::Signer as IdentifyAccount>::AccountId;

Event:runtime发出的事件;

type Event<T> = RawEvent<<T as Trait>::AccountId>;

Version:runtime的版本;

node_primitives定义了更多Substrate基础类型,包括:

AccountIndex:账户索引;

type AccountIndex = u32;

Balance:账户余额;

type Balance = u128;

BlockId:区块ID;

type BlockId = BlockId<Block>;

Moment:一种用于表示时间戳的类型;

type Moment = u64;

Signature:用于链上交易签名上下文的512位哈希的别名;

type Signature = MultiSignature;

Timestamp:UNIX纪元(1970年1月1日0时0分0秒)以来的毫秒数;

type Timestamp = u64;

sp-runtime也实现了很多基本类型的Structs和Traits,这里就不一一列出了。


预置模块(Prebuilt Pallets)

Substrate提供一些预置模块,这些pallet具有足够的通用性,可供许多区块链重复使用。

Substrate v2.0.0的所有预置模块列在下表中(点击模块名可以查看文档):

模块名源码功能assets源码处理同质化资产(fungible assets)atomic_swap源码原子性的资金交换协议aura源码通过管理离线报告扩展Aura共识authority_discovery源码检索当前的权限集,了解其拥有的权限ID,签署和验证与其他权限之间的消息authorship源码跟踪区块的当前生产者和最近叔块babe源码通过从VRF(可验证随机函数)的输出中收集链上的随机性,并管理epoch转变,来扩展BABE共识balances源码处理账户和余额benchmark源码以隔离的方式包含常见的runtime模式,此模块不用于生产环境,仅用于基准测试collective源码允许一组帐户ID通过专门来源的分发调用来使它们集体公开contracts源码部署和执行WebAssembly智能合约democracy源码提供一种民主制度,处理一般利益相关者的投票管理elections源码基于抵押权重的选举模块elections_phragmen源码基于Sequential Phragmén的选举模块evm源码以太坊虚拟机(EVM)执行模块example源码示例模块,展示了大多数pallet共有的概念、API和结构example_offchain_worker源码示例模块,展示了大多数链下工作机共有的概念、API和结构grandpa源码通过管理为native代码准备的GRANDPA权限来扩展GRANDPA共识identity源码一个联合name系统,允许从指定来源添加多个注册商,注册服务商可以收取一定费用以提供身份验证服务im_online源码允许验证人在每个新会话中发送心跳,以表明该节点处于连接状态indices源码为新创建的帐户分配索引,索引是地址的缩写形式membership源码允许控制一组AccountId的成员资格,用于管理集合体的成员资格multisig源码进行多重签名分发nicks源码用于在链上跟踪账户名,无需创建name层次结构、替换DNS或提供反向查找node_authorization源码管理许可网络的一组可配置节点offences源码跟踪报告的作恶行为proxy源码代理,允许账户授予其他账户许可,以从其签名来源分发调用类型randomness_collective_flip源码提供可以在测试中使用的随机函数,根据前81个区块的哈希值生成影响较小的随机值,此模块不用于生产环境recovery源码一种M-of-N社交恢复工具,在私钥或其他身份验证机制丢失时用户也可以访问其账户scheduler源码以指定区块高度或指定周期发生的计划表scored_pool源码维护一个积分池,得分最高的实体成为会员session源码允许验证人管理其会话密钥,提供更改会话长度、处理会话轮换的功能society源码一个鼓励用户参与和维护会员制社会的经济学游戏staking源码管理网络维护者抵押的资金sudo源码允许单个账户执行需要root权限的可调度功能timestamp源码获取和设置链上时间transaction_payment源码提供计算分发前交易费用的基本逻辑treasury源码提供可以由系统中的利益相关者管理的资金池,以及从该资金池提出支出建议的结构utility源码一个带有助手的无状态模块,用于调度管理vesting源码提供一种在账户的锁定余额上放置线性曲线的方法,该模块确保有一个锁定位置,防止余额因交易费用支付以外的任何原因而降至未投资额以下

下一篇文章系统地介绍Substrate runtime开发最重要的部分:模块(pallets)。

—-

编译者/作者:松果

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...