Солидность for зацикливается на огромном количестве данных

Я хочу использовать функцию для поиска всех токенов пользователя в твердости, поэтому я использую цикл for для перебора всех токенов и проверки совпадения адресов. Но моя функция всегда возвращает ноль для 10 миллионов итераций, поэтому я реализовал тестовую функцию, чтобы увидеть, где находятся пределы. Есть ли у Solidity проблемы с огромными циклами for? Например, я попробовал следующую тестовую функцию, которая всегда возвращает 0, если количество итераций выше 3 000 000. Похоже, есть тайм-аут для запуска функции?

function testLoop(uint256 num) external view returns(uint256 res) {
        uint256 i=0;
        uint256 cnt=0;

        for(i;i<num;i++) {
            cnt++;
        }

        return cnt;
    }

Ответы (1)

Да, у EVM есть проблема с неограниченными циклами. Потребляемый газ увеличивается с каждой итерацией, пока не достигнет блока gasLimit, и функция вообще не сможет работать. Следовательно, неограниченная итерация является антишаблоном .

Рассмотрите возможность инвертирования управления, чтобы клиенты вызывали контракт по одной строке за раз. Контракт может предоставлять вспомогательные функции для возврата длины списка, ключа (к сопоставлению) в строке в списке и сведений о структуре, сохраненной в сопоставлении для данного ключа.

Вот несколько примеров реализации: Существуют ли хорошо решенные и простые шаблоны хранения для Solidity?

«Отображенная структура с индексом» работает, как описано выше.

Надеюсь, это поможет.