Передача эфиров с помощью «цикла for» в смарт-контракте

Я пытаюсь отправить средства пользователям, которые внесли эфиры на мой контракт. В настоящее время я достигаю этого, имея список addressи перебирая их, отправляя эфиры этих адресов. Сейчас это работает для 2-3 пользователей (проверено).

Меня сейчас беспокоит, если будет около 1000 пользователей, которым мне нужны rewardэфиры. Достаточно ли того, что в моем контракте достаточно эфиров для отправки fund + gas? или транзакция, которая вызывает метод вознаграждения, должна отправить достаточное количество эфиров для выполнения переводов?

Я видел пару хорошо известных контрактов, заставляющих пользователей снимать вознаграждение, а не отправлять его автоматически. Какой из них работает? если оба работают, то какой метод рекомендуется?

Ответы (1)

НАСТОЯТЕЛЬНО рекомендуется требовать, чтобы пользователи выводили свои средства, а не передавали их пользователям с помощью цикла for.

  1. Гораздо сложнее реализовать с большим количеством пользователей, нужно пробежать цикл до тех пор, пока не кончится газ, удерживать позицию в цикле, а затем ждать следующего выполнения. Если вы не реализуете это, то один будет получать оплату (когда-либо!), Когда количество ваших пользователей слишком велико, чтобы пройти через него, не нарушая лимит газа.

  2. Еще большая проблема заключается в том, что это огромная проблема безопасности. Что, если один из пользователей сделает свою резервную функцию revert(); тогда после него никто не сможет получить свой эфир, потому что цикл всегда будет терпеть неудачу (отменять все выполнение) при выплате этому озорному пользователю.

Есть еще много проблем с push-методом отправки платежей, но этого должно быть достаточно.

У меня были предположения о первой причине, которую вы назвали. Именно поэтому я разместил этот вопрос. А вот о второй причине я даже не подумал. Большое спасибо, что нашли время, чтобы ответить на мой вопрос. Действительно ценю это.