自定义模块

⚠️ Update Notice:

Please read Substrate to Polkadot SDK page first.


构建自定义运行时的最常见方法是从 现有模块 开始。 例如,你可能开始构建一个特定于应用程序的抵押模块,该模块使用现有集体和余额模块中公开的类型,但包含应用程序及其抵押规则所需的自定义运行时逻辑。

虽然 FRAME 模块 提供了对最常见模块的概述,但查找有关现有模块的最新信息最好的地方是使用命名约定 pallet_* 的 crate 的 Rust API 文档。

如果你找不到满足你需求的模块,则可以使用 FRAME 宏来构建自定义模块的脚手架。

模块宏和属性

FRAME 广泛使用 Rust 宏来封装复杂的代码块。 构建自定义模块最重要的宏是 pallet 宏。 pallet 宏定义了模块必须提供的核心属性集。 例如:

  • #[pallet::pallet] 是一个强制性模块属性,它使你能够为模块定义一个结构 (struct),以便它可以存储易于检索的数据。
  • #[pallet::config] 是一个强制性模块属性,它使你能够为模块定义配置特性。

pallet 宏还定义了模块通常提供的核心属性集。 例如:

  • #[pallet::call] 是使你能够为模块实现可调度函数调用的属性。
  • #[pallet::error] 是使你能够生成可调度错误的属性。
  • #[pallet::event] 是使你能够生成可调度事件的属性。
  • #[pallet::storage] 是使你能够在运行时生成存储实例及其元数据的属性。

这些核心属性与你在编写自定义模块时需要做出的决策相一致。 例如,你需要考虑:

  • 存储。你的模块存储什么数据?数据是存储在链上还是链下?
  • 函数。你的模块公开哪些可调用函数?
  • 事务性。你的函数调用是否旨在以原子方式修改存储?
  • 挂钩。你的模块是否会调用任何运行时挂钩?

宏简化了你需要编写的用于实现自定义运行时逻辑的代码。 但是,某些宏会对函数声明强制执行特定要求。 例如,Config 特性必须由 frame_system::Config 绑定,并且 #[pallet::pallet] 结构必须声明为 pub struct Pallet<T>(_);。 有关在 FRAME 模块中使用的宏的概述,请参阅 FRAME 宏