本节中,会通过学习创建自定义runtime的基础知识,学会
在开始学习之前,了解以下的几个概念:
Runtime: 区块链的执行逻辑,在substrate中是以WebAssembly (一种可以使用非 JavaScript 编程语言编写代码并且能在浏览器上运行的技术方案\JS的API)
Module: 模块。区块链runtime由多种特性和功能组成,这些特性和功能可以为区块链提供支撑,如账户管理、Token余额、治理、runtime升级等。上述的这些都是代码库中所提供的模块,包含在runtime中。Substrate提供默认模块集合被称做Substrate Runtime Module Library。
在Substrate中,我们要学习的就是如何在runtime中创建新的module。
Rust: Substrate和Runtime的开发使用Rust编程语言。
ownership和borrowing(待学习): rust中的一种特性,可以保证rust在没有垃圾回收器的情况下,保证内存安全
Trait: Traits 是 Rust 中唯一和 interface 类似的概念
使用 Result 表示 Recoverable Errors:???模块函数必须返回 Result 类型,这允许我们处理函数中的错误。返回结果是 Ok() 时表示成功,是 Err() 时表示失败。
Macros: 宏,编写代码的代码。
首先,我们需要为 runtime 创建一个新 module。为此,我们将使用一个空 module 模板,并把它放在一个新的 appletrace.rs
文件中:
注意: substrate-node-template
还提供了一个template.rs
文件。通常你可以从这个模板文件开始构建你的模块。这里为了从头开始,我们使用一个新文件。
appletrace.rs的内容如下
use support::{decl_storage, decl_module}; pub trait Trait: system::Trait {} decl_storage! { trait Store for Module<T: Trait> as KittyStorage { // Declare storage and getter functions here } } decl_module! { pub struct Module<T: Trait> for enum Call where origin: T::Origin { // Declare public functions here } }
如果仔细查看 lib.rs
文件,你会注意到它包含有关构成 runtime 的所有 module 细节。对于每个 module,我们:
Trait
construct_runtime!
宏中所以我们需要在这里做同样的事情。
要包含我们创建的新 module 文件,我们可以在文件顶部附近添加下面这行(用注释 // Add this line
指出):
由于我们没有在 module 中定义任何内容,因此我们的 Trait
实现也非常简单。我们可以在其他 trait 实现之后包含这一行:
最后,我们可以在 construct_runtime!
的末尾添加一行定义:
请注意,我们在此定义中添加了三种类型(Module
,Call
,Storage
),所有这些类型都是由模板中定义的宏生成的。
这样,这段代码是有效的,并且应该能编译通过。通过下面的命令试一试:
./scripts/build.sh
cargo build --release
编译后发现出错
因为appletrace被重复定义了
在 construct_runtime!
中应该修改成
上图片的1和2命名应该不同
修改后运行成功