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 Config: system::Config { ... }
// 3.
// 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 Config: system::Config {
// The traits the `Event` type used in this pallet has.
type Event: From<Event<Self>> + Into<<Self as system::Config>::Event>;
}
decl_event!{
pub enum Event<T> where
AccountId = <T as system::Config>::AccountId,
{
// An event which is emitted when `set_value` is called.
//调用`set_value`时发出的事件, 包含调用函数的用户及其调用的值的信息。
ValueSet(AccountId, u64),
}
}
decl_storage! {
trait Store for Module<T: Config> as Example {
// The last value passed to `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: Config> for enum Call where origin: T::Origin {
// A default function for depositing events in our runtime
fn deposit_event() = default;
// The only callable function of our 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));
}
}
}