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.
Hier ist eine Handvoll Dinge los.
Das Hauptproblem
Deine Funktion gibt nichts zurück. Es scheint, dass es ein bisschen mapping
zu 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.
Ismael
approveUsers
? Ist es von Javascript oder von einem anderen Soliditätsvertrag?Devashish Puri