3.1 FRAME
模块化实体运行时聚合框架 (FRAME) 是一组简化运行时开发的模块和支持库。在Substrate中,这些模块叫做Pallets,每个都托管特定域的逻辑以包含在链的运行时中
FRAME也提供了一些帮助模块与重要的Substrate Primitives进行交互,它们提供了与核心用户接口
下面的图展示了FRAME架构的总览和它支持的库
Pallets
当用FRAME构建时,Substrate运行时由几个叫做pallets的组件组成。一个pallet包含一组类型、存储项和功能。它们为运行时定义了一组特性和功能
小建议:
如果你想使用Substrate runtime development,我们建议你使用我们的教程creating your first Substrate chain
FRAME 不仅提供了一个常用的Substrate pallet库,还提供了一个构建自定义域pallet的框架,让运行时工程师可以根据他们的目标用例灵活的定义运行时的行为,每个pallet都有自己的离散逻辑,可以修改链状态转换函数的特性和功能
举个例子,the Balances pallet,包含在FRAME中,能够为你的链定义加密货币功能。更具体地说,它定义:
-用来追踪用户拥有token的存储项目
-用户转移和管理这些tokens的函数
-可以让其它pallets使用这些tokens和它们能力的API
-允许当用户余发生变化时可以让其它pallets触发函数调用的hook
Substrate运行时工程师可以通过编写自己的pallet和封装它们的区块链(通过组合个性化的pallet和已经存在的FRAME pallets或者Substrate类似的模块)为他们的区块链定义个性化的逻辑。下面的文件将会展示如何操作:
Skeleton of a pallet
一个FRAME pallet由七个部分组成
- Imports and Dependencies
- Declaration of the Pallet type
- Runtime Configuration Trait
- Runtime Storage
- Runtime Events
- Hooks
- Extrinsics
下面是一个例子
// 1. Imports and Dependencies
pub use pallet::*;
#[frame_support::pallet]
pub mod pallet {
use frame_support::pallet_prelude::*;
use frame_system::pallet_prelude::*;
// 2. Declaration of the Pallet type
// This is a placeholder to implement traits and methods.
#[pallet::pallet]
#[pallet::generate_store(pub(super) trait Store)]
#[pallet::generate_storage_info]
pub struct Pallet<T>(_);
// 3. Runtime Configuration Trait
// All types and constants go here.
// Use #[pallet::constant] and #[pallet::extra_constants]
// to pass in values to metadata.
#[pallet::config]
pub trait Config: frame_system::Config { ... }
// 4. Runtime Storage
// Use to declare storage items.
#[pallet::storage]
#[pallet::getter(fn something)]
pub MyStorage<T: Config> = StorageValue<_, u32>;
// 5. Runtime Events
// Can stringify event types to metadata.
#[pallet::event]
#[pallet::generate_deposit(pub(super) fn deposit_event)]
pub enum Event<T: Config> { ... }
// 6. Hooks
// Define some logic that should be executed
// regularly in some context, for e.g. on_initialize.
#[pallet::hooks]
impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> { ... }
// 7. Extrinsics
// Functions that are callable from outside the runtime.
#[pallet::call]
impl<T:Config> Pallet<T> { ... }
}
注意:
Pallets按需组成,这在基本的架构之上为运行时工程师提供了更大灵活性。参考 the Substrate Runtime Macros 了解添加功能至FRAME pallet
System crate