Array von Adressen in Funktion kann nicht gelesen werden

function approveUsers(address[] users) onlyOwner {
   for(uint i=0; i<users.length; i++) {
       approvedUsers[users[i]] = true; //Mapping {address: bool}
       ApproveUserForPreSale(users[i], approvedUsers[users[i]]); //Event
   }
 }

Mit diesem Snippet erhalte ich ein Array der Länge Null. Und wenn ich Benutzer als statisches Array (Adresse [10] Benutzer) nehme, erhalte ich die richtige Länge, aber der Inhalt ist 0 (0x0 ..).

bearbeiten Dies funktioniert wie erwartet in Remix Studio, aber nicht in Ethereum Wallet.

Wie rufst du an approveUsers? Ist es von Javascript oder von einem anderen Soliditätsvertrag?
genehmigender Benutzer wird vom Ersteller des Vertrags aufgerufen. (Über die Benutzeroberfläche der Etherium-Brieftasche).

Antworten (1)

Hier ist eine Handvoll Dinge los.

Das Hauptproblem

Deine Funktion gibt nichts zurück. Es scheint, dass es ein bisschen mappingzu wahr wird, und ich würde erwarten, dass das wahrscheinlich so weit funktioniert, wie es geht.

** Anderes Problem Nr. 1 **

Die Verwendung eines dynamischen Arrays in einer Funktionssignatur bedeutet, dass diese Funktion derzeit nicht mit anderen Verträgen kommunizieren kann. Betrachten Sie einen Signaturansatz mit fester Länge, z. B. ``` Funktion genehmigenBenutzer(Adresse Benutzer) OnlyOwner gibt zurück(bool Erfolg) { genehmigteBenutzer[Benutzer] = wahr; // Ereignis ... gibt wahr zurück; }

** Anderes Problem Nr. 2 **

for i<0; i<unlimited ...ist ein Anti-Pattern, das aufhört zu funktionieren, wenn die Gaskosten das BlockgasLimit überschreiten. Der Ansatz mit fester Länge, der sich jeweils mit einem Benutzer befasst, wird dieses Problem lösen.

Die Muster hier drüben können Ihnen etwas Zeit sparen: Gibt es gut gelöste und einfache Speichermuster für Solidity?

Ich hoffe es hilft.

Ich muss viele Benutzer gleichzeitig genehmigen. Alle Benutzer einzeln zu genehmigen, wäre eine Menge Arbeit und sehr kostspielig. Auf andere Weise kann ich mehrere Einträge hinzufügen, die zu einer Zuordnung führen würden. Warum kann ich nicht einmal lesen, was passiert ist?
Es impliziert keine Zunahme der manuellen Arbeit oder eine starke Erhöhung der Benzinkosten. Dies impliziert, dass die Iteration von einem intelligenten Client oder Server ausgeführt wird, der mehrere kostengünstige Aufrufe durchführt, und nicht von einer einzelnen Funktion, die eine riesige Aufgabe auf einmal erledigt.