如何使用 decl_storage 内的结构映射 Rust 基元!底物中的宏观
How to map rust primitive with struct inside decl_storage! macro in substrate
pub struct Post<A> {
id:u8,
content:String,
tipAmount:u8,
author:A,
}
decl_storage! {
trait Store for Module<T: Trait> as PostModule {
Posts: map hasher(blake2_256) u8 => Post<T::AccountId>;
}
}
我遇到错误
the trait _::_parity_scale_codec::EncodeLike is not implemented for
Post<::AccountId>
我们如何在 decl_storage 中将原始数据类型映射到结构!宏
你有两个问题。一个比较温和,另一个比较严重:
- 所有应存储在链上的数据类型都需要有两个边界:来自[
parity-scale-codec
]的Encode
和Decode
。将其包含在您的箱子中(使用 "derive" 功能)并简单地:
#[derive(Encode, Decode)]
pub struct Post<A> {
id:u8,
content:String,
tipAmount:u8,
author:A,
}
查看 Parity's Frame library 中的任何其他 pallet 以获取示例。请注意,大多数情况下(除非您的值是 Option
)您的类型还必须提供一个 Default
,您可以再次派生。
- 你不能,也可能不想在链上存储字符串。这是刚开始学习区块链的人最常犯的(常见且公平的)错误。区块链不应充当数据存储来保存可能很长、动态分配的字符串。 只有一致同意的关键数据才应该保存在链上。 正如我从你的结构中推断的那样,你似乎将一些博客 post 保存在链上。那是绝对没有必要的。您可以只将内容的哈希值保存在链上(如果需要,可以使用其他小的元数据)并将实际的 post 内容保存在其他地方,例如 IPFS 中。哈希值足以让每个人都能够确定内容确实是正确的。
pub struct Post<A> {
id:u8,
content:String,
tipAmount:u8,
author:A,
}
decl_storage! {
trait Store for Module<T: Trait> as PostModule {
Posts: map hasher(blake2_256) u8 => Post<T::AccountId>;
}
}
我遇到错误
the trait _::_parity_scale_codec::EncodeLike is not implemented for Post<::AccountId>
我们如何在 decl_storage 中将原始数据类型映射到结构!宏
你有两个问题。一个比较温和,另一个比较严重:
- 所有应存储在链上的数据类型都需要有两个边界:来自[
parity-scale-codec
]的Encode
和Decode
。将其包含在您的箱子中(使用 "derive" 功能)并简单地:
#[derive(Encode, Decode)]
pub struct Post<A> {
id:u8,
content:String,
tipAmount:u8,
author:A,
}
查看 Parity's Frame library 中的任何其他 pallet 以获取示例。请注意,大多数情况下(除非您的值是 Option
)您的类型还必须提供一个 Default
,您可以再次派生。
- 你不能,也可能不想在链上存储字符串。这是刚开始学习区块链的人最常犯的(常见且公平的)错误。区块链不应充当数据存储来保存可能很长、动态分配的字符串。 只有一致同意的关键数据才应该保存在链上。 正如我从你的结构中推断的那样,你似乎将一些博客 post 保存在链上。那是绝对没有必要的。您可以只将内容的哈希值保存在链上(如果需要,可以使用其他小的元数据)并将实际的 post 内容保存在其他地方,例如 IPFS 中。哈希值足以让每个人都能够确定内容确实是正确的。