Übertragung von Ethern mit einer "for-Schleife" in einem Smart Contract

Ich versuche, Geld an die Benutzer zu senden, die Ether in meinen Vertrag eingezahlt haben. Ich erreiche dies derzeit, indem ich die Liste von addressihnen 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 rewardEther 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?

Antworten (1)

DRINGEND wird empfohlen, dass Sie von den Benutzern verlangen, dass sie ihre Gelder abziehen, anstatt sie mit einer For-Schleife an die Benutzer weiterzuleiten.

  1. 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.

  2. 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.

Ich hatte Spekulationen über den ersten Grund, den Sie angegeben haben. Das war der Grund, warum ich diese Frage gepostet habe. Aber an den zweiten Grund habe ich gar nicht gedacht. Vielen Dank, dass Sie sich die Zeit genommen haben, meine Frage zu beantworten. Schätze es wirklich.