状态的文档EnumerableStorageMap
:
主要用于链下计算。运行时实现者应避免枚举链上存储条目。
为什么运行时实现者应该避免在链上枚举这些存储条目?
在运行时开发中,列表迭代一般来说是邪恶的。
除非明确加以防范,否则它将为仅收取 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;
}
}
但我相信这样做的目的是让你在模块中做坏事变得更加困难。