首页 > 解决方案 > 如何使用 decl_storage 中的 struct 映射 rust 原语!基板中的宏

问题描述

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>;

    }
}

我得到以下错误

Post<::AccountId> 没有实现特征 _::_parity_scale_codec::EncodeLike

我们如何使用 decl_storage 中的结构映射原始数据类型!宏

标签: blockchainsubstrate

解决方案


你有两个问题。一个比较温和,另一个比较严重:

  1. 应存储在链上的所有数据类型都需要有两个边界:EncodeDecodefrom [ parity-scale-codec]。将其包含在您的 crate 中(使用“派生”功能)并且简单地:
#[derive(Encode, Decode)]
pub struct Post<A> {
    id:u8,
    content:String,
    tipAmount:u8,
    author:A,
}

查看Parity 框架库中的任何其他托盘以获取示例。请注意,大多数情况下(除非您的值是 a Option)您的类型还必须提供 a Default,您可以再次派生。

  1. 您不能,也可能不想在链上存储字符串。这通常是刚开始学习区块链的人们所犯的(常见且公平的)错误。区块链不应充当数据存储来保留可能很长的动态分配的字符串。只有共识的关键数据应该保存在链上。正如我从您的结构中推断的那样,您似乎保留了一些博客文章。这是完全没有必要的。您可以将内容的哈希值保留在链上(如果您愿意,可以使用其他小元数据)并将实际的帖子内容保留在其他地方,例如在 IPFS 中。哈希足以让每个人都能够非常确定内容确实是正确的。

推荐阅读