• 【Substrate Collectables教程】【第1章基础】1. 创建 module


    前言:

    本节中,会通过学习创建自定义runtime的基础知识,学会

    • 1. 如何使用runtime存储
    • 2. 如何公开runtime函数
    • 3. 如何使用Polkadot-JS APPs UI与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: 宏,编写代码的代码。

    1.1 创建Module

     首先,我们需要为 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
        }
    }

     更新我们的 Runtime

    如果仔细查看 lib.rs 文件,你会注意到它包含有关构成 runtime 的所有 module 细节。对于每个 module,我们:

    • 导入包含该 module 的 Rust 文件
    • 实现其 Trait
    • 将该 module 包含在 construct_runtime! 宏中

    所以我们需要在这里做同样的事情。

    要包含我们创建的新 module 文件,我们可以在文件顶部附近添加下面这行(用注释 // Add this line 指出):

     由于我们没有在 module 中定义任何内容,因此我们的 Trait 实现也非常简单。我们可以在其他 trait 实现之后包含这一行:

     最后,我们可以在 construct_runtime! 的末尾添加一行定义:

    请注意,我们在此定义中添加了三种类型(ModuleCallStorage),所有这些类型都是由模板中定义的宏生成的。

    这样,这段代码是有效的,并且应该能编译通过。通过下面的命令试一试:

    ./scripts/build.sh

    cargo build --release

    编译后发现出错

     因为appletrace被重复定义了

    在 construct_runtime! 中应该修改成

     上图片的1和2命名应该不同

    修改后运行成功

     

  • 相关阅读:
    RAID
    变量的内存位置
    OSI网络结构的七层模型 TCP/IP层次模型
    IT公司【应聘】
    ajax的一个最简单例子
    优先级反转问题
    问一道算法题:算出这些直线一共有多少个交点
    一个女研究生(高级测试工程师)的职业选择 ZZ
    使用SWIG实现C/C++与其他语言间的互相调用 zz
    创建系统级热键 C++ builder为例
  • 原文地址:https://www.cnblogs.com/xiangshigang/p/16251724.html
Copyright © 2020-2023  润新知