区块链是一种特殊类型的数据库。它与典型的数据库的不同之处在于其存储信息的方式。区块链将数据存储在区块中,然后将区块链在一起。区块链已经改变了我们对问题的看法。它带来了大量的好处。
- 区块链技术解决了网络中的信任等关键问题。
- 与其他平台或记录系统相比,区块链技术利用了先进的安全性。
- 通过使用区块链,组织可以降低大量与第三方供应商相关的成本。
基板是一个模块化的框架,使你能够通过组成定制或预建的组件来创建专门的区块链。我们可以用三种方式之一来使用基底。
- 基层节点
- 底层框架
- 基板核心
为什么是Frame v2?
Rust支持不同种类的宏。所有种类的宏基本上都是做同样的事情,以可编程的方式获取一些代码并编写一些更多的代码。现有的FRAME宏使用声明式宏,基本上你可以定义自己的自定义语法。FRAME v2使用类似属性的宏。类似属性的宏类似于自定义的派生宏,但不是为派生属性生成代码,而是允许你创建新属性。
托盘
Frame v1中的托盘骨架
use support::{decl_module, decl_event, decl_storage}
pub trait Config: frame_system::Config {
type Event: From<Event<Self>> + Into<<Self as frame_system::Config>::Event>;
}
decl_event!(
pub enum Event<T> where AccountId = <T as frame_system::Config>::AccountId {
SomethingStored(u32, AccountId),
}
);
decl_storage! {
trait Store for Module<T: Config> as TemplateModule {
Something get(fn something): Option<u32>;
}
}
decl_module! {
pub struct Module<T: Config> for enum Call where origin: T::Origin {
fn deposit_event() = default;
}
}
一个FRAME v1的托盘通常由5部分组成:
- Imports and Dependencies用于Imports和Dependencies。
- Runtime Configuration Trait用于编写所有类型和常量的运行时间。
- 运行时事件用于定义pallet的事件。
- 运行时存储用于声明存储项目。
- Pallet声明用于定义函数,所有定义行为的Pallet都有一个共同的函数,可以发射一个事件。
Frame v2的托盘骨架
#[frame_support::pallet]
pub mod pallet {
use frame_support::{dispatch::DispatchResult, pallet_prelude::*};
use frame_system::pallet_prelude::*;
#[pallet::config]
pub trait Config: frame_system::Config {
type Event: From<Event<Self>> + IsType<<Self as frame_system::Config>::Event>;
}
#[pallet::storage]
#[pallet::getter(fn something)]
pub type Something<T> = StorageValue<_, u32>;
#[pallet::event]
#[pallet::metadata(T::AccountId = "AccountId")]
#[pallet::generate_deposit(pub(super) fn deposit_event)]
pub enum Event<T: Config> {
SomethingStored(u32, T::AccountId),
}
#[pallet::error]
pub enum Error<T> {
/// Error names should be descriptive.
NoneValue,
/// Errors should have helpful documentation associated with them.
StorageOverflow,
}
一个FRAME v2的托盘通常由7个部分组成:
- 进口和依赖,用于进口和依赖。
- Pallet类型的声明,作为实现特质和方法的占位符。
- 运行时配置特 质用来编写运行时的所有类型和常量。
- 运行时存储用于声明存储项。
- 运行时事件(Runtime Events)用于定义Pallet的事件。
- 钩子用于编写托盘的逻辑。
- Extrinsics用于编写可从运行时外部调用的函数。
综上所述。
FRAME v2的宏已经被设计得更加模块化,因此错误会以更友好的方式报告给用户,让用户更容易发现问题。新旧两个宏都扩展到相同的Rust最终代码,因此它们完全可以相互兼容。
我希望你能了解Frame版本1和版本2的区别。
谢谢你的阅读!!