0

状态的文档EnumerableStorageMap

主要用于链下计算。运行时实现者应避免枚举链上存储条目。

为什么运行时实现者应该避免在链上枚举这些存储条目?

4

1 回答 1

0

在运行时开发中,列表迭代一般来说是邪恶的。

除非明确加以防范,否则它将为仅收取 O(1) 费用的操作增加无限的 O(N) 复杂性。结果,您的链条变得可攻击。

此外,如果列表变得如此之大,并且您遍历所有元素,则该过程可能需要比块时间更长的时间,因此节点永远不会产生块。

您会在某些运行时模块中找到有界循环,但您需要注意这些循环的时间/计算复杂性。

您可以轻松地“模拟”具有两个存储项的可枚举列表:

decl_storage! {
    trait Store for Module<T: Trait> as Example {
        AllPeopleArray get(person): map u32 => T::AccountId;
        AllPeopleCount get(num_of_people): u32;
    }
}

但我相信这样做的目的是让你在模块中做坏事变得更加困难。

于 2019-05-22T15:42:10.000 回答