substrate - 在链下存储基质中维护不断增长的列表或在 extrensics 中使用 StorageValueRef::mutate

标签 substrate

我试图拥有一个存储数据集合(可能是 Vector)的链下存储。 我假设这个向量会继续增长。

一种看似顺利的方法是使用 StorageValueRef::mutate() 函数,但后来我发现我们不能在外部使用它(或者也许我们可以,但我不知道) )。

另一种简单的方法是使用 BlockNumber 创建存储 key ,并使用链下 worker 的 BlockNumber 来引用该值。

但就我正在做的事情而言,需要将多个数据存储到单个 block 中。因此,我将被限制为每个 block 只能存储一个值,这也不符合要求。

最佳答案

您可以创建这样的 map :

#[pallet::storage]
pub type MyData<T: Config> =
        StorageMap<_, Twox64Concat, T::BlockNumber, Vec<MyData>>;

然后你可以做MyData::<T>::append(block_number, data)随心所欲地在您的托盘中。

但我建议您引入一些“修剪”窗口。假设是 10,状态中只保留最新 10 个区 block 的数据。为此,你可以吃一些 MyData::<T>::remove(block_number - 10)在你的on_intialize .

但是,如果它实际上只是您想要从运行时为离线工作人员设置的数据,您可以使用 sp_io::offchain_index::set("key", "data"); 。但这是一个更底层的接口(interface)。但是,在这里您还可以通过 block 编号为键添加前缀,以使其在每个 block 中都是唯一的,但是您需要想出自己的自定义方式来存储每个 block 的多个值。

关于substrate - 在链下存储基质中维护不断增长的列表或在 extrensics 中使用 StorageValueRef::mutate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70922861/

相关文章:

substrate - decl_storage 中 `pub` 的用途是什么?

rust - 如何在Substrate中具有不可变的键值映射?

javascript - 使用 api.rpc.payment.queryFeeDetails 获取外部费用

substrate - 如何将 Polkadot-js API 与 Substrate 节点模板一起使用?

rust - 在 `.into()` 上调用时 `RawOrigin:Signed(who)` 会做什么?上下文如何影响它?

rust - 为什么运行时实现者应该避免枚举链上的 EnumerableStorageMap 存储条目?

rust - 如何忽略 `#[derive(Debug)]` 的通用参数?

substrate - 有没有办法调整基板中的 block 间隔?

substrate - 在 Substrate 中, `spec_version` 和 `authoring_version` 之间有什么区别?