当前位置: 首页区块链正文 由于疫情原因,以及近期在忙于其他开发,因此文章停滞了一段时间。之前的文章已经介绍了Runtime的概要以及Runtime的wasm,因此读者应该具备了对Runtime的全局观念以及如何通过编译过程的基本知… Substrate入门专题,目前有以下几篇文章: * [环境配置与编译](https://learnblockchain.cn/article/273) * [运行与调试](https://learnblockchain.cn/2019/12/21/substrate-run-debug/) * [具备状态的链](https://learnblockchain.cn/2019/12/22/substrate-state/) * [项目结构](https://learnblockchain.cn/2019/12/23/substrate-struct/) * [区块头](https://learnblockchain.cn/2019/12/30/substrate-header/) * [交易体](https://learnblockchain.cn/article/330) * [Substrate的模型设计](https://learnblockchain.cn/article/331) * [Runtime概要](https://learnblockchain.cn/article/348) * [Runtime 的 wasm 与 native](https://learnblockchain.cn/article/382) * [Runtime的构成](https://learnblockchain.cn/article/709) * [学习Runtime必备的技能](https://learnblockchain.cn/article/714) — 由于疫情原因,以及近期在忙于其他开发,因此文章停滞了一段时间。之前的文章已经介绍了Runtime的概要以及Runtime的wasm,因此读者应该具备了对Runtime的全局观念以及如何通过编译过程的基本知识。因此从本文开始,将会进入对Runtime的正式介绍。 本文首先介绍Substrate的Runtime的构成。 ## 一个完整的Substrate Runtime 对于一个完成的Runtime,其主要实现位于:`bin/node/runtime/src/lib.rs`中。 一个Runtime一定需要含有如下组件: ![null](https://img.learnblockchain.cn/2020/03/05_/884378795.jpg) 1. RuntimeVersion:用于标示当前Runtime的版本,是用于区分执行wasm和native的重要属性。每次若出现逻辑变更**都应该**手动修改这个版本号(其中分影响共识结果和不影响共识结果的版本)。若出现了影响共识结果的改动但不修改这个版本号,并仍然部署了修改后的wasm,可能会造成无法出块或者无法同步等严重后果。 2. Runtime的模块实现`construct_runtime!`:构建Runtime所有模块的宏。在编写了一个Runtime的模块后,必须通过这个宏引入构建。在这个宏里会生成很多其他的附属信息如该模块的结构体,对应的一些trait的实现,metadata,等等。 1. 在`lib.rs`中的trait的关联属性以及api的调用中可以看到类似`type Currency = Balances;`,`type Time = Timestamp;`等的定义,这个关联属性右边的类型就是通过这个宏展开得到。 2. 这个宏的构建中,控制了每个模块会导出一些属性如`Storage`,`Call`,`Event`,`Config`等等 3. 在这个宏中`System`是特殊的,一定要引入。 4. 除了对应每个模块生成对应的类型以外,这个宏还会生成一些统一的类型和信息如`Runtime`这个结构体,`AllModules`,`Call`等等。 4. Runtime中与链相关的一些类型定义:如区块,交易体,区块头等等。有一些定义要参与到`construct_runtime!`宏中的构建,有一些定义需要对外暴露提供调用。Substrate的抽象很好,基本上所有链的基本元素定义都是可以自由定制的。例如签名可以替换成单个签名或允许多种类型秘钥的签名,地址可以替换成使用accountid或兼容几种查询等等。 5. Runtime的执行器:执行器虽然也是一个Runtime模块,但其是特殊的,甚至比System模块还特殊。执行器不参与`construct_runtime!`宏的构建,而是直接定义。其提供了Runtime正常运行的所有接口,如初始化,执行区块,执行交易,验证交易等等。执行器需要依托`construct_runtime!`宏导出的`AllModules`,也就是说执行器持有所有模块的类型,将会控制这些模块的`OnInitialize`,`OnFinalize`等等。 6. Runtime的Api实现`impl_runtime_apis!`:前面的文章介绍过Runtime与外界交互的接口,这个宏即是所有api的实现部分。对于api首先先有定义api的宏`decl_runtime_apis!`,然后对应于这个定义的api,可以在`impl_runtime_apis!`中有对应的实现。Substrate默认提供了一些api的定义,其中`Core`的api定义是一定要实现的。其他的一些api如`BlockBuilder`,共识相关的api,虽然不是在`Core`里,但是为了让一个Runtime能以“链”的形式存在,也是一定要实现的,但是若作为声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。 收藏 海报 链接