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 null
así
¿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]; }
?
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 .
string[] memory
regresa null
en js si estamos usando web3
0xcafe
porfavorito