Почему разработчики среды выполнения должны избегать перечисления записей хранилища EnumerableStorageMap в цепочке?
Документация для EnumerableStorageMap
состояния:
В первую очередь полезен для вычислений вне цепочки. Разработчики среды выполнения должны избегать перечисления записей хранилища в цепочке.
Почему разработчики среды выполнения должны избегать перечисления этих записей хранилища в цепочке?
1 ответ
При разработке во время выполнения итерация списка, вообще говоря, является злом.
Если явно не принять меры против, это добавит неограниченную сложность O(N) к операции, которая будет взимать только O(1) сборов. В результате ваша цепь становится атакующей.
Кроме того, если списки становятся такими большими, и вы перебираете все элементы, процесс может занять больше времени, чем время блока, и, таким образом, узел никогда не будет производить блок.
Вы найдете ограниченные циклы в определенных модулях времени выполнения, но вам нужно помнить о сложности времени / вычислений этих циклов.
Вы можете легко "смоделировать" перечислимый список с двумя элементами хранения:
decl_storage! {
trait Store for Module<T: Trait> as Example {
AllPeopleArray get(person): map u32 => T::AccountId;
AllPeopleCount get(num_of_people): u32;
}
}
Но я считаю, что цель состоит в том, чтобы вам было немного сложнее делать плохие вещи в ваших модулях.