Почему разработчики среды выполнения должны избегать перечисления записей хранилища 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;
    }
}

Но я считаю, что цель состоит в том, чтобы вам было немного сложнее делать плохие вещи в ваших модулях.

Другие вопросы по тегам