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

时间:2019-05-22 05:38:45

标签: rust substrate

EnumerableStorageMap的文档指出:

  

对于链下计算至关重要。运行时实现者应避免枚举链上的存储条目。

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

1 个答案:

答案 0 :(得分: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;
    }
}

但是我相信这样做的目的是使您在模块中做不好的事情变得更加困难。