Я пытаюсь отправить средства пользователям, которые внесли эфиры на мой контракт. В настоящее время я достигаю этого, имея список address
и перебирая их, отправляя эфиры этих адресов. Сейчас это работает для 2-3 пользователей (проверено).
Меня сейчас беспокоит, если будет около 1000 пользователей, которым мне нужны reward
эфиры. Достаточно ли того, что в моем контракте достаточно эфиров для отправки fund + gas
? или транзакция, которая вызывает метод вознаграждения, должна отправить достаточное количество эфиров для выполнения переводов?
Я видел пару хорошо известных контрактов, заставляющих пользователей снимать вознаграждение, а не отправлять его автоматически. Какой из них работает? если оба работают, то какой метод рекомендуется?
НАСТОЯТЕЛЬНО рекомендуется требовать, чтобы пользователи выводили свои средства, а не передавали их пользователям с помощью цикла for.
Гораздо сложнее реализовать с большим количеством пользователей, нужно пробежать цикл до тех пор, пока не кончится газ, удерживать позицию в цикле, а затем ждать следующего выполнения. Если вы не реализуете это, то один будет получать оплату (когда-либо!), Когда количество ваших пользователей слишком велико, чтобы пройти через него, не нарушая лимит газа.
Еще большая проблема заключается в том, что это огромная проблема безопасности. Что, если один из пользователей сделает свою резервную функцию revert(); тогда после него никто не сможет получить свой эфир, потому что цикл всегда будет терпеть неудачу (отменять все выполнение) при выплате этому озорному пользователю.
Есть еще много проблем с push-методом отправки платежей, но этого должно быть достаточно.
Каннан Равиндран