Contrato web3.js que devuelve nulo en lugar de una matriz

contrato sencillo:

contract ex {
   address[] users;
   function addUser() public {
        users.push(msg.sender);
   }

   function returnUsers() constant returns (address[]) {
       return users;
   }
}

En web3js tengo la instancia de contrato exInstance:

var abi = { /* some ABI */ };
var exInstance = web3.eth.contract(abi).at(someaddress);

function getUsers(){
   let users = exInstance.returnUsers.call();
}

Y el resultado es que los usuarios son nulos. Intenté asíncrono:

function getUsers(){
   exInstance.returnUsers.call(function(error, users)
      /// some actions
}

Pero aún nullasí

¿Estoy haciendo algo mal o debería iterarlo en web3js y, por contrato, usar algo como returnUsers(uint i) constant returns (address) { return users[i]; }?

¿Se implementó una versión actualizada de su contrato?
oh, tienes razón, actualicé el contrato pero olvidé actualizar el abi ... ¡gracias!

Respuestas (1)

Es posible devolver matrices de tamaño dinámico de transacciones o llamadas externas. Una llamada/transacción externa es iniciada por algo fuera del código de contrato que se ejecuta en el EVM. ( Fuente )

¿Puede devolver una matriz o una cadena de una llamada de función de solidez?

Sí. Consulte array_receiver_and_returner.sol .

Sin embargo, lo que es problemático es devolver cualquier dato de tamaño variable (por ejemplo, una matriz de tamaño variable como uint[]) de una función llamada desde Solidity. Esta es una limitación del EVM y se solucionará con la próxima actualización del protocolo.

La devolución de datos de tamaño variable como parte de una transacción o llamada externa está bien.

No estoy seguro de lo que está mal con su código. Me funciona en remix .

En el remix funciona bien pero string[] memoryregresa nullen js si estamos usando web3