Devolviendo Estructuras y Listas en Solidity

¿Hay algún motivo en particular por el que Solidity le impida devolver estructuras, listas y otras estructuras de datos? Entiendo que debe ser seguro y permitir el acceso a la matriz/lista puede alterar los datos, pero ¿por qué ni siquiera las estructuras? Estoy tratando de hacer un contrato que devuelva una lista de accidentes que ocurrieron en una placa particular (que es uno de los campos en una estructura) de una cadena de bloques de registros de accidentes, pero solo logré llegar a devuelve un registro, eso también por sus campos individuales. Me parece muy ineficiente..

Tenga en cuenta que primero intenté devolver string[] pero tuve que cambiarlo a bytes[] ya que Solidity tampoco lo permite.

/*
To get a list of incidents from a startID 
*/
function listIncidents(uint _startID, uint _count) constant returns(uint[10] _incIDs, bytes[10] _names, bytes[10] _descriptions, bytes[10] _places, bytes[10] _times, bytes[10] _dates) {

  uint maxIters = _count;
  if((_startID + _count) > getIncidentCount()) {
  maxIters = getIncidentCount() - _startID;
  }

  _incIDs = new uint[](maxIters);
  _names = new bytes[](maxIters);
  _descriptions = new bytes[](maxIters);
  _places = new bytes[](maxIters);
  _times = new bytes[](maxIters);
  _dates = new bytes[](maxIters);

  for(uint i=0;i<maxIters;i++) {
    uint _incidentID = _startID + i;

    PoliceRecord memory r = incidents[_incidentID];
    _incIDs[i] = _incidentID;
    _names[i] = bytes(r.incName);
    _descriptions[i] = bytes(r.incDescription);
    _places[i] = bytes(r.incPlace);
    _times[i] = bytes(r.incTime);
    _dates[i] = bytes(r.incDate);
   }
}

Respuestas (1)

Puede devolver matrices. Lo que no puede hacer es devolver matrices de matrices , incluido string[]o bytes[](porque stringo bytesya es una matriz).

La razón es solo una limitación de la ABI (interfaz binaria de aplicación). Cuando intente hacerlo, debería ver una advertencia del compilador que dice:

Este tipo solo se admite en el nuevo codificador ABI experimental. Utilice "pragma experimental ABIEncoderV2;" para habilitar la función.

Si puede salirse con la suya limitando sus cadenas a una longitud de 32, podría usarlas en su bytes32lugar. Este código funciona bien:

solidez de pragma ^0.4.24;

contract Test {
    function test() public pure returns (bytes32[]) {
        bytes32[] memory foo = new bytes32[](2);
        foo[0] = "hello";
        foo[1] = "goodbye";

        return foo;
    }
}
Gracias por la respuesta. Entiendo que las cadenas son una matriz de matrices, pero eso es básicamente una matriz 2D, y la mayoría de los idiomas lo admiten, entonces, ¿hay alguna razón particular por la que no permitirían devolver matrices 2D? Además, ¿cómo resolvería este problema de devolver varios registros en una llamada de función si, por ejemplo, todos los campos no caben en 32 bytes? Gracias.
Como dije, es solo una limitación de la especificación ABI actual. (Simplemente no admite matrices/estructuras anidadas). Es una falla de diseño que presumiblemente se solucionará, pero no he visto una ETA en particular. Puede activar el codificador experimental v2, pero tenga en cuenta que aún no está finalizado y, por lo tanto, no se recomienda su uso en producción.
Tengo una pregunta relacionada, ¿podría echarle un vistazo? ethereum.stackexchange.com/q/118348/86303