No se puede leer la matriz de direcciones en función

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
   }
 }

Obtengo una matriz de longitud cero con este fragmento. Y si tomo a los usuarios como una matriz estática (dirección [10] usuarios), obtengo la longitud correcta pero el contenido es 0 (0x0...).

editar Esto funciona en Remix Studio como se esperaba, pero no en Ethereum Wallet.

¿ Cómo llamas approveUsers? ¿Es de javascript o de otro contrato de solidez?
El implementador del contrato llama a applyUser. (A través de la GUI de la billetera etherium).

Respuestas (1)

Hay un puñado de cosas que suceden aquí.

El problema principal

Tu función no devuelve nada. Parece que se establece un poco en un mappingcierto y esperaría que probablemente funcione en la medida de lo posible.

** Otro problema #1 **

El uso de una matriz dinámica en la firma de una función significa que esta función no podrá comunicarse con otros contratos, en este momento. Considere un enfoque de firma de longitud fija, por ejemplo, ``` función apruebaUsuario(dirección del usuario) soloPropietario devuelve(bool éxito) { usuariosAprobados[usuario] = verdadero; // evento ... devuelve verdadero; }

** Otro problema #2 **

for i<0; i<unlimited ...es un antipatrón que dejará de funcionar cuando el costo del gas exceda el gasLimit del bloque. El enfoque de longitud fija que trata con un usuario a la vez resolverá esto.

Los patrones aquí pueden ahorrarle algo de tiempo: ¿ Existen patrones de almacenamiento sencillos y bien resueltos para Solidity?

Espero eso ayude.

Necesito aprobar muchos usuarios a la vez. Aprobar uno por uno a todos los usuarios sería mucho trabajo y muy costoso. De cualquier otra forma, puedo agregar varias entradas que darían como resultado el mapeo. ¿Por qué ni siquiera puedo leer lo que se pasa?
No implica un aumento en el trabajo manual o un gran aumento en el costo del gas. Implica que la iteración será realizada por un cliente o servidor inteligente que realizará múltiples llamadas económicas, no por una sola función que realizará un trabajo enorme de un solo trago.