Rust:Substrate框架的组成部分
Substrate框架简介
Substrate是一个用于构建区块链的开发框架,它由Parity团队基于Rust语言开发而成,是一个开箱即用的区块链构造器。
Substrate框架的组成部分
Substrate框架主要由以下几个部分组成:
- 存储组件
- Core部分
- Runtime部分
- 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,
}
在上面的代码中,我们定义了两个结构体:Block
和Header
。它们分别表示区块和区块头。这只是一个简单的示例,实际应用中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;
在上面的代码中,我们定义了三种类型:Signature
、Hash
和BlockNumber
。它们分别表示密码学签名类型、哈希类型和区块编号类型。这只是一个简单的示例,实际应用中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