Я хочу использовать функцию для поиска всех токенов пользователя в твердости, поэтому я использую цикл 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;
}
Да, у EVM есть проблема с неограниченными циклами. Потребляемый газ увеличивается с каждой итерацией, пока не достигнет блока gasLimit, и функция вообще не сможет работать. Следовательно, неограниченная итерация является антишаблоном .
Рассмотрите возможность инвертирования управления, чтобы клиенты вызывали контракт по одной строке за раз. Контракт может предоставлять вспомогательные функции для возврата длины списка, ключа (к сопоставлению) в строке в списке и сведений о структуре, сохраненной в сопоставлении для данного ключа.
Вот несколько примеров реализации: Существуют ли хорошо решенные и простые шаблоны хранения для Solidity?
«Отображенная структура с индексом» работает, как описано выше.
Надеюсь, это поможет.