Substrate Developer Hub

Substrate Developer Hub

  • 教程
  • 知识库
  • 进阶菜谱
  • API 文档
  • Languages icon简体中文
    • English
    • 协助翻译

›Runtime

开始

  • 总览
  • 安装
  • 在 Windows 系统开始
  • 词汇表

学习 Substrate

  • Extrinsics
  • 交易池
  • 账户摘要
  • 会话密钥
  • 交易权重
  • 链下功能

Runtime

  • Runtime 总览
  • Runtime 的基本类型
  • FRAME
  • Pallets
  • Runtime宏
  • Runtime 元数据
  • Runtime 存储
  • Runtime 来源
  • Runtime 执行流程
  • Runtime事件
  • Runtime 错误
  • 交易费用
  • 链下工作机
  • 调试
  • Runtime 测试
  • 链上随机生成
  • Runtime 升级

智能合约

  • 总览
  • ink! 智能合约
  • ink! 概念
  • ink! 开发
  • EVM 模块
  • ink! 常问问题

整合

  • Polkadot-JS
  • 客户端库
  • 链描述
  • Subkey 工具
  • 内存分析

进阶

  • SCALE 编解码器
  • 共识机制
  • 区块导入过程
  • 执行器
  • 密码学
  • 存储
  • SS58 地址格式

贡献

  • 协助翻译
Translate

Pallets

本文是开发Substrate runtime模块相关文档的顶级入口。

这些文档是为那些熟悉Rust编程语言的技术类读者撰写。

如果你是第一次开发Substrate runtime,建议你先尝试我们的入门教程《创建你的第一条substrate链》。

什么是Pallet?

Pallets是一种可组合成为Substrate runtime的特殊Rust模块。 每个pallet都拥有独立的逻辑,可修改相应区块链状态转换函数的特征和功能。

例如,包含在runtime聚合框架(FRAME) 中的Balances pallet为区块链定义了一种加密货币。 更具体地说,它定义了记录用户拥有通证数量的存储项,用户可调用以转移和管理这些通证的函数,允许其他模块发行或销毁这些通证的API,以及当用户余额变更时允许其它模块触发相应函数的hooks。

你可以按照自己的想法来定义pallet里包含的区块链逻辑和功能,下文将向你展示如何操作。

Pallet的架构

一个完整的Substrate pallet由5部分组成:

// 1. 导入库和依赖项
//此pallet支持使用任何带有`no_std`标志编译的Rust库。
use support::{decl_module, decl_event, decl_storage, ...}

// 2. Runtime配置Trait 
//所有runtime类型和常量都放在这里。 
//如果此pallet依赖于其他特定的pallet,则应将依赖pallet的配置trait添加到继承的trait列表中。
pub trait Trait: system::Trait { ... }
 
// 3. Runtime事件
// 事件是一种用于报告特定条件和情况发生的简单手段,用户、Dapp和区块链浏览器都可能对事件的感兴趣。没有它就很难发现。
decl_event!{ ... }

 //4. Runtime存储
//Runtime存储允许在保证“类型安全“前提下使用Substrate存储数据库,因而可在块与块之间留存内容。
decl_storage!{ ... }
 //5. Pallet声明 
//此模块定义了最终从此pallet导出的"Module"结构体。
//它定义了该pallet公开的可调用函数,并在区块执行时协调该pallet行为。
decl_module! { ... }

示例模块

这是一个功能最小化的可运行pallet,它允许用户把一个 u64类型的值放入存储中。

在后续的pallet文档中,此示例的部分内容将被用于协助教授相关概念。

为了清楚起见,在此处列出全文:

use support::{decl_module, decl_event, decl_storage, StorageValue, StorageMap};
use system::ensure_signed;

pub trait Trait: system::Trait {
    // 本pallet中`Event` 类型 所拥有的traits
    type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
}

decl_event!{
    pub enum Event<T> where
        AccountId = <T as system::Trait>::AccountId,
    {
        //调用`set_value`时发出的事件, 包含调用函数的用户及其调用的值的信息。
        ValueSet(AccountId, u64),
    }
}

decl_storage! {
    trait Store for Module<T: Trait> as Example {
        // 传给 `set_value`的最后一个值。
        // 用作 `StorageValue`的示例。
        pub LastValue get(fn last_value): u64;
        // 每个用户传给 `set_value`的值。
        // 用作`StorageMap`的示例。
        pub UserValue get(fn user_value): map T::AccountId => u64;
    }
}

decl_module! {
    pub struct Module<T: Trait> for enum Call where origin: T::Origin {
        // 用于在runtime里存放事件的默认函数
        fn deposit_event() = default;

        // 在我们runtime module里的唯一可调用函数。
        // 允许用户设置一个 `u64` 类型的值到runtime存储里。
        pub fn set_value(origin, value: u64) {
            let sender = ensure_signed(origin)?;
            LastValue::put(value);
            UserValue::<T>::insert(&sender, value);
            Self::deposit_event(RawEvent::ValueSet(sender, value));
        }
    }
}
← FRAMERuntime宏 →
  • 什么是Pallet?
  • Pallet的架构
  • 示例模块
Substrate Developer Hub
开发者中心
教程知识库进阶菜谱API 文档
社区
社区主页通讯Substrate 技术聊天室Substrate 研讨会Stack Overflow推特聚会活动
更多
Substrate Builders 计划BlogSubstrate GitHub开发者中心 GitHub隐私政策使用条款Cookie 设置
Copyright © 2021 Parity Technologies