¿Hay alguna forma de devolver múltiples estructuras (o los campos de ellas) en Solidity cuando uno de los campos de estructura es del tipo `bytes`?

Me gustaría devolver las claves de estructuras de mi contrato para mostrarlas en la interfaz, idealmente 10 a la vez. Entiendo que si lo hago keyByOwnerpúblico puedo devolver una sola clave a la vez con el getter que se crea, pero necesito 10 claves y no quiero llamar a la función getter 10 veces.

Intenté usar el enfoque detallado aquí para devolver una tupla de matrices: https://medium.com/coinmonks/solidity-tutorial-returning-structs-from-public-functions-e78e48efb378 Creo que esta sería la forma de Continúe, excepto que no parece funcionar con el datacampo Key siendo de tipo bytes(funciona bien si cambio de tipo byesa tipo bytes32), dándome este error:

TypeError: This type is only supported in the new experimental ABI encoder. Use "pragma experimental ABIEncoderV2;" to enable the feature.
    returns (uint[], bytes[])
                     ^-----^

¿Hay alguna forma de devolver múltiples estructuras (o los campos de ellas) en Solidity cuando uno de los campos de estructura es del tipo bytes?

Aquí está mi función:

struct Key {
  uint expirationTimestamp;
  bytes data;
 }

 mapping (address => Key) internal keyByOwner;

 address[] public owners;

  function getKeysByPage(uint _startIndex)
    external
    view
    returns (uint[], bytes[])
  {
    require(outstandingKeys() > 0, "No keys to retrieve");
    require(_startIndex >= 0 && _startIndex < outstandingKeys(), "Index must be in-bounds");
    uint endOfPageIndex;

    if (_startIndex + 9 > owners.length) {
      endOfPageIndex = owners.length - 1;
    } else {
      endOfPageIndex = _startIndex + 9;
    }

    address[] memory ownersByPage = new address[](10);
    uint[] memory timestampsArray = new uint[](10);
    bytes[] memory keyDataArray = new bytes[](10);
    Key memory tempKey;
    uint pageIndex = 0;

    // Build the specified set of owners into a new temporary array
    for (uint256 i = _startIndex; i <= endOfPageIndex; i++) {
      ownersByPage[pageIndex] = owners[i];
      pageIndex++;
    }

    // Loop through ownersByPage & build the requested keys into 2 new temporary arrays
    for (uint256 n = 0; n < ownersByPage.length; n++) {
      tempKey = keyByOwner[ownersByPage[n]];
      timestampsArray[n] = tempKey.expirationTimestamp;
      keyDataArray[n] = tempKey.data;
    }

    return(timestampsArray, keyDataArray);
  }

Respuestas (1)

No es posible devolver estructuras y tuplas de estructuras con la ABI actual. Sin embargo , si agrega pragma experimental ABIEncoderV2justo después de su pragma soliditylínea, se compilará bien. Desafortunadamente, no se recomienda pasar a producción con una función experimental, por lo que la única alternativa viable ahora es devolver los tipos primitivos de cada estructura en una fila.

Específicamente para su escenario, necesita usar temporalmente un tipo compatible. Por ejemplo, podría convertir su matriz de bytes dinámicos en bytes32.

Gracias Pablo Sabía que funciona con el pragma experimental ABIEncoderV2encabezado, pero como dijiste, no es lo suficientemente bueno para la producción. Puedo devolver tuplas de matrices, pero no parece funcionar si una de las matrices en la tupla es de tipo byteso de tipo string, probablemente porque ambas son matrices dinámicas. ¿Puede dar más detalles sobre "la única alternativa viable ahora es devolver los tipos primitivos de cada estructura en una fila"?
Oh, lo siento, generalmente me refería a las estructuras. Actualicé la respuesta.
Así que sí, lamentablemente, eso es lo único que puedes hacer por ahora.
No te preocupes, eso era lo que preguntaba mi pregunta original. En mi ejemplo, tomé los campos de 10 estructuras y los recompuse en 2 nuevas matrices, una para cada uno de los campos. Tenía la esperanza de que tal vez Solidity 0.5 resolvería esto, pero por ahora, miraré el enlace que publicaste sobre la conversión de matrices de bytes dinámicos a bytes32.