blockchain - 如何使用 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 中的结构映射原始数据类型!宏
解决方案
你有两个问题。一个比较温和,另一个比较严重:
- 应存储在链上的所有数据类型都需要有两个边界:
Encode
和Decode
from [parity-scale-codec
]。将其包含在您的 crate 中(使用“派生”功能)并且简单地:
#[derive(Encode, Decode)]
pub struct Post<A> {
id:u8,
content:String,
tipAmount:u8,
author:A,
}
查看Parity 框架库中的任何其他托盘以获取示例。请注意,大多数情况下(除非您的值是 a Option
)您的类型还必须提供 a Default
,您可以再次派生。
- 您不能,也可能不想在链上存储字符串。这通常是刚开始学习区块链的人们所犯的(常见且公平的)错误。区块链不应充当数据存储来保留可能很长的动态分配的字符串。只有共识的关键数据应该保存在链上。正如我从您的结构中推断的那样,您似乎保留了一些博客文章。这是完全没有必要的。您可以将内容的哈希值保留在链上(如果您愿意,可以使用其他小元数据)并将实际的帖子内容保留在其他地方,例如在 IPFS 中。哈希足以让每个人都能够非常确定内容确实是正确的。
推荐阅读
- gcc - 在 C++ 中解决静态库和共享库之间的依赖关系时有什么区别?
- firebase - 如何在 Riverpod 中使用谷歌导航栏?
- nginx - Nginx 反向代理上的连接被拒绝
- qt - 如何将绝对路径与相对路径连接起来?
- laravel - Laravel HTTP 客户端发送标头、参数、原始正文作为 json 不起作用
- javascript - React.cloneElement:区分元素与其克隆
- generics - How does compiler infer that Box is borrowing the one which its content borrows?
- html - 移动端导航菜单背景的CSS代码
- javascript - 将选中的复选框传递给控制器
- docker - Fritzbox 拒绝使用 traefik / docker 请求自定义域