Ich versuche, Geld an die Benutzer zu senden, die Ether in meinen Vertrag eingezahlt haben. Ich erreiche dies derzeit, indem ich die Liste von address
ihnen habe und sie durchschleife, die diese Adressen senden, Äther. Im Moment funktioniert dies für 2-3 Benutzer (getestet).
Meine Sorge ist jetzt, wenn es etwa 1000 Benutzer gibt, zu denen ich reward
Ether brauche. Reicht es aus, wenn mein Vertrag genug Ether zum Senden hat fund + gas
? oder sollte die Transaktion, die die Belohnungsmethode aufruft, ausreichend Ether senden, um die Überweisungen auszuführen?
Ich habe ein paar bekannte Vertragspartner gesehen, bei denen Benutzer ihre Belohnung zurückziehen, anstatt sie automatisch zu senden. Welches funktioniert? Wenn beides funktioniert, welche Methode ist dann zu empfehlen?
DRINGEND wird empfohlen, dass Sie von den Benutzern verlangen, dass sie ihre Gelder abziehen, anstatt sie mit einer For-Schleife an die Benutzer weiterzuleiten.
Bei einer großen Anzahl von Benutzern viel schwieriger zu implementieren. Sie müssen durch die Schleife laufen, bis das Benzin zur Neige geht, die Position in der Schleife halten und dann bis zur nächsten Ausführung warten. Wenn Sie dies nicht implementieren, wird einer bezahlt (jemals!), Wenn Ihre Anzahl von Benutzern zu groß ist, um sie zu durchlaufen, ohne das Gaslimit zu überschreiten.
Ein noch größeres Problem ist, dass es sich um ein riesiges Sicherheitsproblem handelt. Was ist, wenn einer der Benutzer seine Fallback-Funktion revert(); dann würde nach ihm niemand mehr in der Lage sein, seinen Äther zu erhalten, da die Schleife immer fehlschlägt (die gesamte Ausführung rückgängig macht), wenn dieser schelmische Benutzer ausgezahlt wird.
Es gibt noch viel mehr Probleme mit der Push-Methode zum Senden von Zahlungen, aber diese sollten ausreichen.
Kannan Ravindran