Transferencia de éteres mediante un "bucle for" en un contrato inteligente

Estoy tratando de enviar fondos a los usuarios que depositaron ethers en mi contrato. Actualmente estoy logrando esto al tener la lista addressy recorrerlos enviando esos éteres de direcciones. En este momento esto funciona para 2-3 usuarios (probado).

Mi preocupación ahora es si hay alrededor de 1000 usuarios a los que necesito rewardethers. ¿Es suficiente si mi contrato tiene suficientes éteres para enviar fund + gas? ¿O la transacción que llama al método de recompensa debe enviar suficientes éteres para ejecutar las transferencias?

He visto un par de contratos bien conocidos que hacen que los usuarios retiren su recompensa en lugar de enviarla automáticamente. ¿Cuál funciona? si ambos funcionan, ¿qué método se recomienda?

Respuestas (1)

MUY recomendable que solicite a los usuarios que extraigan sus fondos en lugar de enviarlos a los usuarios con un bucle for.

  1. Mucho más difícil de implementar con una gran cantidad de usuarios, es necesario ejecutar el bucle hasta quedarse sin combustible, mantener la posición en el bucle y luego esperar hasta la próxima ejecución. Si no implementa esto, se le pagará a uno (¡nunca!) cuando su número de usuarios sea demasiado grande para pasar sin romper el límite de gas.

  2. Un problema aún mayor es que es un gran problema de seguridad. ¿Qué sucede si uno de los usuarios hace que su función de respaldo se revierta (); luego, después de él, nadie podría recibir su éter porque el bucle siempre fallará (revertirá la ejecución completa) al pagar a este usuario travieso.

Hay muchos más problemas con el método push para enviar pagos, pero estos deberían ser suficientes.

Tenía especulaciones sobre la primera razón que diste. Esa fue la razón por la que publiqué esta pregunta. Pero la segunda razón por la que ni siquiera pensé. Muchas gracias por tomarse el tiempo para responder a mi pregunta. Realmente lo aprecio.