LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 币圈百科 > 【Substrate开发教程】10 - Substrate层级架构、区块结构、交易池

【Substrate开发教程】10 - Substrate层级架构、区块结构、交易池

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


之前的几篇文章介绍了使用Substrate开发区块链网络的流程,这篇文章开始从理论上介绍Substrate框架的各方面知识

Substrate客户端

Substrate客户端是运行基于Substrate的区块链节点的应用程序,它由包括但不限于以下的组件组成:


存储(Storage):key-value存储机制,数据库使用RocksDB;运行时逻辑(Runtime logic):运行时代码被编译为Wasm,无分叉区块链升级;点对点网络(Peer-to-peer network):使用libp2p网络栈协议;共识引擎(Consensus engines):插件式可自定义共识协议,并内置PoS共识;RPC:提供HTTP和WebSocket RPC服务;监控告警系统(Telemetry):遥测指标通过嵌入式Prometheus服务器公开;

Substrate的层级架构

Substrate的层级架构具有很高的灵活性,可以通过以下三种方式使用Substrate:

Substrate NodeSubstrate FRAMESubstrate Core

之前的文章介绍了如何启动一个Substrate Node,是通过substrate-node-template启动的,通过Substrate Node可以创建一条具有基础功能的区块链。

Substrate FRAME是一个模块化实体运行时聚合框架(Framework for Runtime Aggregation of Modularized Entities ),又称为runtime层,Substrate支持的可定制化基本发生在这一层。可以在这一层修改区块链的运行逻辑,如通证系统、转账手续费、出块时间、治理方式、链上升级逻辑、抵押操作等。

Substrate Core可以忽略整个FRAME系统,从头开始设计和实现运行时逻辑,是使用Substrate最困难的方法,同时也提供了最大的创新自由。

Substrate Node、Substrate FRAME、Substrate Core三者比较如下:


向右技术更自由,向左开发更简单。

基于Substrate的区块链开发,主要就是Substrate FRAME层,即runtime逻辑的开发。

Substrate的链上逻辑代码会编译为两种结果:

原型二进制文件(native binary)WebAssembly文件(wasm)

Substrate会同时存储native和wasm两种链上运行时逻辑代码,如果两种格式代码逻辑相同,就会运行native版本,其运行速度更快。

区块结构和Extrinsics

Substrate中区块(Trait sp_runtime::traits::Block)的构造函数如下:

fn new( header: Self::Header, extrinsics: Vec<Self::Extrinsic> ) -> Self

由一个区块头和一组extrinsic组成。

区块头(Trait sp_runtime::traits::Header)的构造函数如下:

fn new( number: Self::Number, extrinsics_root: Self::Hash, state_root: Self::Hash, parent_hash: Self::Hash, digest: Digest<Self::Hash> ) -> Self

包含字段有:区块高度、extrinsic根哈希、链状态根哈希、父区块哈希、摘要。

Trait sp_runtime::traits::Extrinsic的构造函数如下:

fn new( _call: Self::Call, _signed_data: Option<Self::SignaturePayload> ) -> Option<Self>

Extrinsics是指会被添加进区块的来自链外的信息,分为:

Inherents:区块创建者插入到区块的无签名信息,不会广播到区块链网络;Transactions:交易,又分为签名交易和无签名交易;

Extrinsics被打包到进当前区块中被执行,每个extrinsic都在runtime进行了定义,extrinsics_root是由这组待执行的extrinsic通过哈希算法计算出的信息摘要。

extrinsics_root主要有两个作用:

区块头构建和分发完成后,防止任何人对该区块头中所含extrinsic内容进行篡改;在只有区块头信息的条件下,可以让轻客户端快速验证某一区块中存在的某笔交易;

Inherents指区块创建者插入到区块的无签名信息,不会广播到区块链网络,比如时间戳就可以包含在inherent信息中,验证人根据其他验证人认为该时间戳的合理性来接受或拒绝该块,而不是通过签名进行验证。

签名交易和其他区块链系统(比特币、以太坊、EOS等)的“交易(Transaction)”概念相同,发起交易的用户使用自己的私钥对交易签名并支付交易费用,验证人使用其公钥验证交易。

无签名交易无人支付交易费用,验证人定时发送的I'm Online心跳就是一种无签名交易,signed extension可以用于无签名交易,它一个trait,可以通过它来使用额外的数据或逻辑来扩展交易。

交易池

交易池(transaction pool)包含所有广播到网络中的签名的和未签名的交易。

交易池检查交易的有效性,包括检查交易索引(nonce)是否正确、账户是否有足够余额以支付交易费用、签名是否正确等。

交易池定期检查池中现有交易的有效性,无效或过期的交易会从池中被删除。

交易池还负责对交易进行排序,如果交易是有效的,会被排入两组交易队列(transaction queue)中:

Ready Queue:包含会被加入新的pending区块的交易,使用FRAME构建的运行时逻辑要求交易必须按照确切顺序排列;Future Queue: 包含在将来会成为有效交易的交易;

交易的生命周期

一笔交易的生命周期可以遵循两种路径:

由节点生产的区块;从网络接收的区块;

对于第一种情况,交易的生命周期如下:

1、节点监听网络上的交易;2、验证每笔交易,并将有效交易放入交易池中;3、交易池对交易进行排序,并返回准备包含在pending区块中的交易,Ready Queue中的交易用于构造区块;4、交易被执行,状态数据的更改保存在本地内存中,Ready Queue中的交易通过网络广播给对等节点,排在前面的交易有较高的优先级,更有可能在下一个区块中被成功执行;5、构造好的区块被发布到网络中,网络上的所有其他节点接收并执行该区块;

对于第二种情况,区块以事务的特性被执行,整个区块执行成功或失败。

—-

编译者/作者:松果

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

LOADING...
LOADING...