substrate上存储结构体
时间: 2023-11-08 14:50:27 浏览: 140
在 Substrate 上,存储结构体需要使用 `storage` 模块来定义和操作。以下是一个示例:
```rust
use frame_support::storage::{StorageMap, StorageValue,
ensure_initialized,
dispatch::Result};
#[derive(Encode, Decode, Default)]
pub struct MyStruct {
pub value1: u32,
pub value2: Vec<u8>,
}
decl_storage! {
trait Store for Module<T: Trait> as MyModule {
MyStorage: map hasher(blake2_128_concat) u32 => MyStruct;
MyValue: u32;
}
}
pub fn set_my_struct_value(key: u32, value: u32, data: Vec<u8>) -> Result {
ensure_initialized::<MyModule<T>>(); // 检查模块是否初始化
MyStorage::insert(key, MyStruct {
value1: value,
value2: data,
});
Ok(())
}
pub fn get_my_struct_value(key: u32) -> Option<MyStruct> {
MyStorage::get(key)
}
pub fn set_my_value(value: u32) {
MyValue::put(value);
}
pub fn get_my_value() -> Option<u32> {
MyValue::get()
}
```
在上面的示例中,我们首先定义了一个名为 `MyStruct` 的结构体,并为其实现了 `Encode` 和 `Decode` trait。然后,使用 `decl_storage!` 宏来定义存储模块,其中包含一个名为 `MyStorage` 的映射和一个名为 `MyValue` 的简单值。我们还提供了一些用于设置和获取存储值的函数。
请注意,这只是一个简单的示例,实际使用中可能会涉及更复杂的逻辑和更多的存储项。你可以根据自己的需求来定义和操作存储结构体。
阅读全文