Devolver matriz dinámica no funciona

Estoy tratando de construir una función que, cuando se llama, devuelve una mappingmatriz como dos diferentes.

El problema que tengo es un mapping (address => uint) content2viewy 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?

Respuestas (2)

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 fdevolverá 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:

ingrese la descripción de la imagen aquí

El contrato se implementa en Kovan Network y devuelve los 2 arreglos. Aquí tienes la dirección del Contrato: 0x42ebaf829d341cb38bd4576a8424ce03d8c6f47c

¡Espero eso ayude!