FRAME2存储中的ValueQuery有什么用?

What is the use of ValueQuery in FRAME2 storage?

使用以下语法定义 FRAME2 存储:

#[pallet::storage]
type SomePrivateValue<T> = StorageValue<_, u32, ValueQuery>;

#[pallet::storage]
#[pallet::getter(fn some_primitive_value)]
pub(super) type SomePrimitiveValue<T> = StorageValue<_, u32, ValueQuery>;

但是存储在没有 ValueQuery 关键字的情况下工作。

例如

#[pallet::storage]
type SomePrivateValue<T> = StorageValue<_, u32>;

ValueQuery有什么用?

同样设置默认值需要 ValueStorage,而 getter 函数不允许使用 ValueStorage。如何使用设置默认值的 getter 功能?

https://substrate.dev/docs/en/knowledgebase/runtime/storage#default-values

可以在此处找到 StorageValue 的正式文档 https://paritytech.github.io/substrate/monthly-2021-09+1/frame_support/storage/types/struct.StorageValue.html

你可以看到第三个泛型QueryKind默认是类型OptionQuery,当你不提供特定类型时,则使用OptionQuery

在类型 StorageValue 的方法实现中,您可以看到它需要对泛型进行一些限制 https://paritytech.github.io/substrate/monthly-2021-09+1/frame_support/storage/types/struct.StorageValue.html#impl

特别是需要QueryKind: QueryKindTrait<Value, OnEmpty>, 这意味着 QueryKind 必须实现如何从存储中查询值。

目前有2个实现者:OptionQueryValueQueryhttps://paritytech.github.io/substrate/monthly-2021-09+1/frame_support/storage/types/trait.QueryKindTrait.html#implementors

当在存储中找不到值时,

OptionQuery 以 returns None 的方式实现特征。 ValueQuery 以在存储中找不到值时 return 一些空值(由通用 OnEmpty 配置)的方式实现特征。

所以当你想从存储中获取一些值但没有值时你会使用 ValueQueryOptionQuery 当你想获得一些“默认”值时获取 None,当您尝试从存储中获取一些值但没有值时。

结果在方法的签名中可见:方法get将return一个值或一个选项:https://paritytech.github.io/substrate/monthly-2021-09+1/frame_support/storage/types/struct.StorageValue.html#method.get