1

我了解当查询 Storage 以获取不存在的键时,Substrate 将返回 0 或 null 值。它对 Option 类型有什么特别的作用吗?

我问是因为在默认节点模板中,存储项目 Something 被声明为

Something: Option<u32>;

但稍后在do_somethingsetter 中,方法签名声明something: u32,但直接传递它而不将其包装在Some()

Something::put(something);

代替

Something::put(Some(something));

如果 Substrate 将对 store 的调用解释T为 storage Some<T>,这是否也意味着如果我None针对某个键存储在映射中,那么它将删除该键?是存储Some(T)还是T

或者仅仅是 Rust 正在为Something::put(some: T)case 和构建一个专门的方法调用Something::put(some: Option<T>)

4

1 回答 1

2

decl_storage如果值是否为选项,确实会以不同方式扩展。

实现的特征是srml_support::storage::StorageValue

  • 如果值是Option<MyType>实现的特征是
srml_support::storage::StorageValue<MyType> {
    type Query = Option<MyType>;
}

get如果在此存储使用的键的 trie 中未找到任何值,则在实现中将返回 None 。

  • 如果该值不是一个选项,而是MyType实现的特征是任何其他类型
srml_support::storage::StorageValue<MyType> {
    type Query = MyType;
}

如果在此存储使用的键的 trie 中没有找到值,则在实现get中将返回 Default 。

请注意,可以使用以下语法覆盖此默认值:

NotOptionSomething: u32 = MyDifferentDefault;

如果 Substrate 将存储 T 的调用解释为存储 Some,这是否也意味着如果我将 None 存储在映射中针对某个键,那么它将删除该键?它是存储 Some(T) 还是 T?

在这一点上,这不再是基板解释,而只是一个 rust trait 实现。该put函数用于将编码值存储在 trie 中。不包含在选项中。

于 2019-12-03T13:32:17.003 回答