Estoy tratando de construir una función que, cuando se llama, devuelve una mapping
matriz como dos diferentes.
El problema que tengo es un mapping (address => uint) content2view
y tengo que sacar este valor fuera de solidez. Entonces, escribí una función
mapping (address => uint) content2view;
address[] contents;
/* [...] */
function getStatistics() external view returns (address[], uint[]){
address[] memory resAddr;
uint[] memory views;
for(uint i = 0; i<contents.length; i++){
resAddr[i] = contents[i];
views[i] = content2view[contents[i]];
}
return (resAddr, views);
}
El problema es que, cuando lo llamo con remix, no devuelve ningún valor y se aborta la transacción:
VM error: invalid opcode.
invalid opcode
The execution might have thrown.
Debug the transaction to get more information.
Por supuesto, no veo ningún error y no entiendo qué código de operación no válido no es válido... ¿Alguna ayuda?
La documentación habla de esto:
Debido a las limitaciones de EVM, no es posible devolver contenido dinámico desde llamadas a funciones externas. La función
f
devolverácontract C { function f() returns (uint[]) { ... } }
algo si se llama desde web3.js, pero no si se llama desde Solidity.La única solución por ahora es usar arreglos grandes de tamaño estático.
Como dice que tiene que llamar a esto solidez externa, la documentación indica que puede obtener la matriz en web3. Además, si está recopilando esto desde una aplicación js o cualquier otro programa, la lectura de la variable se puede hacer localmente (costo de gas cero) y así puede implementar un captador para cada valor en la matriz dinámica.
espero que esto ayude
No has declarado el Contrato. Todos los códigos de solidez (o casi todos) deben declararse dentro de los contratos para llamar a las funciones. Porque es el contrato lo que está comprometido con la cadena de bloques y contiene todo su código.
Así es como debe verse tu código:
pragma solidity^0.4.2;
contract Test {
mapping (address => uint) content2view;
address[] contents;
/* [...] */
function getStatistics() external view returns (address[], uint[]){
address[] memory resAddr;
uint[] memory views;
for(uint i = 0; i<contents.length; i++){
resAddr[i] = contents[i];
views[i] = content2view[contents[i]];
}
return (resAddr, views);
}
}
Aquí tenéis la captura de pantalla como se devuelven los valores:
El contrato se implementa en Kovan Network y devuelve los 2 arreglos. Aquí tienes la dirección del Contrato: 0x42ebaf829d341cb38bd4576a8424ce03d8c6f47c
¡Espero eso ayude!