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)。 —- 编译者/作者:松果 玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。 |
【Substrate开发教程】12 - Substrate FRAME、基础数据类型、预置模块
2020-10-25 松果 来源:区块链网络
LOADING...
相关阅读:
- 从CasperLabs社区周会看它的发展2020-10-25
- 区块链大型巡回播放【第88期】#预测市场# &“行情解读”2020-10-25
- Filecoin和矿工的困局与选择2020-10-25
- 那个盗取模特图充当总监的野鸡交易所割了几个亿跑路了|探索FIL的价2020-10-24
- 波卡正在建立一个可以媲美以太坊的生态系统,深入了解一下Polkadot2020-10-24