运行时构建:在此范围内找不到字符串

Nuk*_*Dan 6 string rust substrate rust-no-std

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

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

在构建运行时,您会收到每个错误String

     |
  21 |     ip_address: String,
     |                 ^^^^^^ not found in this scope
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*izi 7

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

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

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

这是由选择决定的。总的来说,String是令人惊讶的复杂类型。Rust 书用了整整一节的时间来讨论类型的复杂性。

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

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

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

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


归档时间:

查看次数:

665 次

最近记录:

5 年,2 月 前