7

基板开发人员可能会遇到一个常见问题:开发自定义托盘以将映射存储到具有常见类型的存储中,例如String. 举个例子:

#[derive(Encode, Decode, Clone, Default, RuntimeDebug)]
pub struct ClusterMetadata {
    ip_address: String,
    namespace: String,
    whitelisted_ips: String,
}

在构建运行时,您会收到以下错误String

     |
  21 |     ip_address: String,
     |                 ^^^^^^ not found in this scope

为什么Strings不包括在范围内?和其他std锈类型?

4

1 回答 1

6

这里的错误与 无关no_std,因此您可能只需要导入String类型即可在运行时使用字符串来获取真正的错误。

您会发现的真正问题是StringParity SCALE 编解码器无法对其进行编码,这显然是运行时中任何存储项(或大多数您想要使用的任何类型)的要求。

所以问题是“为什么 SCALE 不编码String”?

这是选择。一般来说,String是令人惊讶的复杂类型。Rust 书用一整节来讨论类型的复杂性。

因此,它很容易成为人们String错误使用的运行时环境中的枪。

String此外,将s 存储在运行时存储中通常是不好的做法。我认为我们可以很容易地同意,在运行时最小化存储使用是一种最佳实践,因此您应该只将需要能够在运行时获得共识和状态转换的存储项放入存储中。大多数情况下,String数据将用于元数据,这种用法并不是最佳实践。

如果您更仔细地查看 Substrate,您会发现我们不止一次地打破了这个最佳实践,但这是我们明确做出的决定,手头有能够正确评估成本/收益的信息。

所有这些结合起来就是为什么Strings 在运行时不被视为第一类对象。相反,我们要求用户将字符串编码为字节,然后使用该字节数组来代替。

于 2020-12-18T00:35:40.313 回答