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锈类型?这里的错误与 无关no_std,因此您可能只需要导入类型String即可获取在运行时使用字符串的真正错误。
您会发现的真正问题是String奇偶校验 SCALE 编解码器无法对其进行编码,这显然是运行时中任何存储项(或您想要使用的大多数任何类型)的要求。
所以问题是“为什么 SCALE 不编码String”?
这是由选择决定的。总的来说,String是令人惊讶的复杂类型。Rust 书用了整整一节的时间来讨论类型的复杂性。
因此,它很容易成为人们String错误使用的运行时环境中的枪。
此外,将 s 存储在运行时存储中通常是不好的做法String。我认为我们很容易同意,最小化运行时中的存储使用是最佳实践,因此您应该只放入需要能够在运行时获得共识和状态转换的存储项。大多数情况下,String数据将用于元数据,这种用法不是最佳实践。
如果您更仔细地观察 Substrate,您会发现我们不止一次地打破了这一最佳实践,但这是我们明确做出的决定,掌握了手头的信息,以便能够正确评估成本/收益。
所有这些结合起来就是为什么Strings 在运行时不被视为第一类对象。相反,我们要求用户将字符串编码为字节,然后使用该字节数组。
| 归档时间: |
|
| 查看次数: |
665 次 |
| 最近记录: |