209 похожих чатов

Доброго всем времени суток недавно влился в разработку, поэтому уровень понимания

ещё недостаточен, был бы очень признателен, если бы мне помогли решить задачку. Заключается она вот в чём:
мне нужен список держателей моего ERC20 токена, насколько я понимаю, по ключам стандартного mapping итерироваться нельзя, поэтому пока лучшее что мне пришло в голову - добавление в массив адресов очередного элемента, если такового нет в стандартном mapping (address => uint), во время проведения транзакции и исключение элемента, если баланс в ходе транзакции обнуляется.
Скажите, насколько это валидный подход или есть более "дешёвое" (по fee) решение?

1 ответов

5 просмотров

в самом контракте итерироваться по всем ключам нехорошо, если их число не ограничено - может не хватить газа. Тогда контракт "зависнет" навеки. Любые паттерны работы с контрактами подразумевают что-то типа "lazy" вариантов. Например, если вы хотите "начислить" награду всем держателям токена, то это можно сделать в тот момент, когда они используют токен или заставить их самих вызывать отдельную функцию "claim reward". В общем циклы по неизвестному заранее числу объектов в контрактах не привествуются, разве что это совсем небольшие списки. Если просто нужно всех найти, то не тратя лишних байтов в блокчейне на хранение лучше пропарсить блокчейн (как правильно указали - event-ы). Все это сильно зависит от задачи

Похожие вопросы

Карта сайта