likes
comments
collection
share

Rust:Substrate框架的组成部分

作者站长头像
站长
· 阅读数 36

Substrate框架简介

Substrate是一个用于构建区块链的开发框架,它由Parity团队基于Rust语言开发而成,是一个开箱即用的区块链构造器。

Substrate框架的组成部分

Substrate框架主要由以下几个部分组成:

  1. 存储组件
  2. Core部分
  3. Runtime部分
  4. primitives和client部分

下面我们将分别对这几个部分进行详细的介绍。

存储组件

在Substrate框架中,存储是一个非常重要的组成部分。它负责管理区块链上的所有数据,并为运行时提供必要的支持。

下面是一个简单的存储组件代码示例:

use frame_support::storage::StorageMap;

// 定义一个存储项
decl_storage! {
    trait Store for Module<T: Trait> as MyStorage {
        MyValue: map hasher(blake2_128_concat) T::AccountId => u64;
    }
}

// 在运行时中使用存储项
fn my_function(origin: T::Origin) -> DispatchResult {
    let sender = ensure_signed(origin)?;
    let value = MyValue::<T>::get(&sender);
    // ...
}

在上面的代码中,我们定义了一个名为MyValue的存储项,并在运行时中使用了它。这只是一个简单的示例,实际应用中存储组件会更加复杂。

Core部分

Substrate框架中的Core部分是节点本地的功能模块。它包括了区块链系统基础部分,而由开发者自由定制链的功能部分。

下面是一个简单的Core部分代码示例:

// 定义一个区块结构体
#[derive(Clone)]
pub struct Block {
    header: Header,
    extrinsics: Vec<Extrinsic>,
}

// 定义一个区块头结构体
#[derive(Clone)]
pub struct Header {
    parent_hash: Hash,
    number: BlockNumber,
    state_root: Hash,
    extrinsics_root: Hash,
    digest: Digest,
}

在上面的代码中,我们定义了两个结构体:BlockHeader。它们分别表示区块和区块头。这只是一个简单的示例,实际应用中Core部分会更加复杂。

Runtime部分

Substrate框架中的Runtime部分是指区块链链上的功能模块。它负责处理区块链上发生的所有事务,并根据事务内容更新区块链状态。

下面是一个简单的Runtime部分代码示例:

// 定义一个运行时模块
decl_module! {
    pub struct Module<T: Trait> for enum Call where origin: T::Origin {
        // 定义一个调用函数
        #[weight = 0]
        pub fn my_call(origin, value: u64) -> DispatchResult {
            let sender = ensure_signed(origin)?;
            // 更新存储项
            MyValue::<T>::insert(&sender, value);
            Ok(())
        }
    }
}

在上面的代码中,我们定义了一个运行时模块,并在其中定义了一个调用函数my_call。这个函数接受一个value参数,并将其存储到存储项中。这只是一个简单的示例,实际应用中Runtime部分会更加复杂。

primitives和client部分

Substrate框架中原先的core目录包含了所有链功能模块的部分,也就是所谓Substrate框架中原先的core目录包含了所有链功能模块的部分,也就是所谓的Substrate框架主体内容。在现在的版本中,它被拆分成了primitives和client两个部分。

primitives部分用于定义一条链中很多基础设置的模块。例如,它可以定义密码学类型、哈希类型、长度类型等。

client部分则负责实现区块链节点的各种功能,例如区块同步、交易池管理、共识算法等。

下面是一个简单的primitives部分代码示例:

// 定义一个密码学类型
pub type Signature = MultiSignature;

// 定义一个哈希类型
pub type Hash = <BlakeTwo256 as HashT>::Output;

// 定义一个长度类型
pub type BlockNumber = u32;

在上面的代码中,我们定义了三种类型:SignatureHashBlockNumber。它们分别表示密码学签名类型、哈希类型和区块编号类型。这只是一个简单的示例,实际应用中primitives部分会更加复杂。

下面是一个简单的client部分代码示例:

// 实现区块同步功能
fn sync_blocks(&self) {
    // 获取本地区块高度
    let local_height = self.backend.blockchain().info().best_number;
    // 获取网络区块高度
    let network_height = self.network.best_seen_block().unwrap_or(Zero::zero());
    // 判断是否需要同步
    if network_height > local_height {
        // 执行区块同步操作
        // ...
    }
}

在上面的代码中,我们实现了一个简单的区块同步功能。它首先获取本地区块高度和网络区块高度,然后判断是否需要执行区块同步操作。这只是一个简单的示例,实际应用中client部分会更加复杂。

Substrate框架各组成部分之间的关系

Substrate框架各组成部分之间存在着紧密的联系。例如,存储组件负责管理区块链上的所有数据,并为运行时提供必要的支持;Core部分包括了区块链系统基础部分,而由开发者自由定制链的功能部分;Runtime部分负责处理区块链上发生的所有事务,并根据事务内容更新区块链状态;primitives和client部分则负责定义和实现区块链节点的各种功能。

这些组成部分相互协作,共同构成了Substrate框架。它们之间的关系可以用下图来表示:

+------------+
|  Runtime   |
+------+-----+
       |
+------+-----+
|  Storage   |
+------+-----+
       |
+------+-----+
| Core | primitives + client |
+------+---------------------+

上图展示了Substrate框架各组成部分之间的关系。可以看到,Runtime部分依赖于存储组件,而存储组件又依赖于Core、primitives和client部分。这些组成部分相互协作,共同构成了Substrate框架。

总之,Substrate框架是一个非常强大的用于构建区块链应用的开发框架。它由多个组成部分构成,并且各组成部分之间存在着紧密的联系from刘金,转载请注明原文链接。感谢!

转载自:https://juejin.cn/post/7228593475930439736
评论
请登录