Pruebas unitarias de solidez para contratos con un tipo de retorno de matriz dinámica

Estoy escribiendo un contrato inteligente simple para almacenar una matriz de bytes32, presionarlo y recuperarlo:

contract SimpleStorage {
    bytes32[] public items;

    event ItemAdded(bytes32 contents);

    function addItem(bytes32 contents) public returns(bool) {
        items.push(contents);
        emit ItemAdded(contents);
        return true;
    }

    function getAllItems() public constant returns(bytes32[]) {
        return items;
    }
}

Esto compila bien, pero cuando trato de escribir una prueba de solidez para este contrato, no puedo almacenar el resultado de getAllItems.

Línea en cuestión:

bytes32[] result = simpleStorage.getAllItems();

El error que me sale es:Type inaccessible dynamic type is not implicitly convertible to expected type bytes32[] storage pointer.

A partir de este problema de Github , veo que se sabe (y está previsto que se solucione en Ethereum 2.0) que simplemente no podemos en este momento llamar a funciones que devuelven matrices dinámicas de otro contrato. Sin embargo, podemos utilizar estas funciones desde la ABI.

¿Significa esto que es esencialmente imposible escribir pruebas de solidez para este tipo de funciones en este momento (ya que las pruebas unitarias son en sí mismas contratos)? ¿Alguien más se ha encontrado con este problema y ha encontrado una forma de evitarlo?

Sé que puedo limitarme a escribir pruebas JS, pero tengo curiosidad por saber si hay una manera de probar este tipo de contratos usando Solidity.

Respuestas (1)

¿Qué versión del compilador solidity estás usando? No puedo reproducir tu error.

Sin embargo, con la última versión de solc (0.4.24), debe agregar la memorypalabra clave ya que, de forma predeterminada, bytes32 [] se almacena en el almacenamiento y no puede asignar un tipo de tamaño dinámico al almacenamiento.

bytes32[] memory result = simpleStorage.getAllItems();
¡Gracias! Resulta que no había actualizado la versión de solc que estaba usando Truffle.