我试图拥有一个存储数据集合(可能是 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/