Rust:Substrate 框架中的存储详解
一、 Substrate介绍
Substrate是一个开源的区块链开发框架,它能够帮助开发人员快速构建自定义的区块链。Substrate 框架提供了丰富的模块和工具,可以帮助开发人员快速实现区块链应用。
在 Substrate 框架中,存储是一个非常重要的组成部分。它负责管理区块链上的所有数据,并为运行时提供必要的支持。本文将详细介绍 Substrate 框架中的存储层次结构、存储项和状态转换函数,并给出相应的代码示例和详细讲解。
二、Substrate 框架中的存储层次结构
Substrate 框架中的存储层次结构分为三层:底层数据库、存储根和存储项。底层数据库负责管理区块链上的所有数据,它通常采用键值对数据库来实现。存储根是一个哈希值,它表示整个区块链状态的摘要。存储项则是区块链状态中的最小单元,它表示一个特定的数据项。
在 Substrate 框架中,底层数据库通常采用 RocksDB 来实现。RocksDB 是一个高性能的键值对数据库,它能够快速地存储和检索数据。当一个新块被添加到区块链上时,底层数据库会更新相应的数据,并计算出新的存储根。
下面是一个使用 Substrate 框架访问底层数据库的代码示例:
use frame_support::{storage::unhashed, traits::Get};
fn access_storage<T: Config>() {
let value = unhashed::get::<u64>(&b"my_key"[..]);
if let Some(value) = value {
// 处理 value
}
}
在这个示例中,我们使用了 unhashed::get
函数来从底层数据库中获取数据。这个函数接受一个键作为参数,并返回对应的值。
三、Substrate 框架中的存储项
在 Substrate 框架中,存储项是区块链状态中的最小单元。每个存储项都表示一个特定的数据项,例如账户余额、合约代码等。开发人员可以通过定义新的存储项来扩展区块链状态。
Substrate 框架提供了丰富的工具来帮助开发人员定义和使用存储项。例如,开发人员可以使用 decl_storage!
宏来定义新的存储项,并使用 StorageValue
、StorageMap
等类型来访问存储项。
下面是一个使用 Substrate 框架定义和访问存储项的代码示例:
use frame_support::{decl_module, decl_storage, dispatch::DispatchResult};
pub trait Config: frame_system::Config {}
decl_storage! {
trait Store for Module<T: Config> as MyModule {
pub MyValue get(fn my_value): u64;
}
}
decl_module! {
pub struct Module<T: Config> for enum Call where origin: T::Origin {
#[weight = 0]
pub fn set_my_value(origin, value: u64) -> DispatchResult {
MyValue::put(value);
Ok(())
}
}
}
在这个示例中,我们使用了 decl_storage!
宏来定义一个名为 MyValue
的存储项。这个存储项的类型为 u64
,并且可以通过 my_value
函数来访问。在模块的定义中,我们定义了一个名为 set_my_value
的函数,它可以用来更新 MyValue
存储项的值。
四、Substrate 框架中的状态转换函数
在 Substrate 框架中,状态转换函数是运行时中非常重要的一个组成部分。它负责处理区块链上的所有交易,并根据交易内容更新区块链状态。
状态转换函数通常由多个模块组成,每个模块都负责处理一类特定的交易。例如,Balances 模块负责处理与账户余额相关的交易,Contracts 模块负责处理与智能合约相关的交易。
下面是一个使用 Substrate 框架定义状态转换函数的代码示例:
use frame_support::{decl_module, dispatch::DispatchResult};
pub trait Config: frame_system::Config {}
decl_module! {
pub struct Module<T: Config> for enum Call where origin: T::Origin {
#[weight = 0]
pub fn my_transaction(origin) -> DispatchResult {
// 处理交易
Ok(())
}
}
}
在这个示例中,我们定义了一个名为 my_transaction
的函数,它可以用来处理一类特定的交易。开发人员可以在这个函数中编写相应的逻辑来处理交易。
在 Substrate 框架中,存储是一个非常重要的组成部分,它负责管理区块链上所有数据,并为运行时提供必要支持。 from刘金,转载请注明原文链接。感谢!
转载自:https://juejin.cn/post/7227476190017044537