之前的几篇文章介绍了使用Substrate开发区块链网络的流程,这篇文章开始从理论上介绍Substrate框架的各方面知识。 Substrate客户端 Substrate客户端是运行基于Substrate的区块链节点的应用程序,它由包括但不限于以下的组件组成: 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、构造好的区块被发布到网络中,网络上的所有其他节点接收并执行该区块;对于第二种情况,区块以事务的特性被执行,整个区块执行成功或失败。 —- 编译者/作者:松果 玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。 |
【Substrate开发教程】10 - Substrate层级架构、区块结构、交易池
2020-10-23 松果 来源:区块链网络
LOADING...
相关阅读:
- 中国风+NFT浪潮——《竹录隐侠》能否乘风破浪?|链茶访2020-10-23
- 王团长区块链日记1076篇:最近市场安静的可怕2020-10-23
- 波卡世界建筑师runtime,是Substrate工具箱的熟练工,Polkadot“无叉升级“2020-10-23
- 《区块链养鸡场》:科技如何改变中国农村人口生活2020-10-23
- NBA球星投资NBA Topshot,你还在等什么?2020-10-23