¿Estructuras anidadas en solidez?

¿Es posible tener una estructura dentro de una estructura? No estoy seguro acerca de los tipos de datos internos, pero básicamente estaba tratando de hacer algo como (pseudocódigo):

library IpfsUtils {

  struct IpfsHash {
    bytes32 hash;
    uint8 hashFunction;
    uint8 hashSize;
  }

  function insert(bytes _hash) {}
  function combine() {}
}

contract Members {

  struct Member {
     IpfsUtils.IpfsHash profile;
     uint id;
  }
  mapping (address => Member) public members;

  function addMember(uint id, bytes profileHash) {
    Member m = members[msg.sender];
    m.id = id;
    m.profile.insert(profileHash);
  } 
}

Estoy tratando de almacenar un hash IPFS con tipos de datos de longitud fija y pensé en extraer el almacenamiento de la función hash ipfs, el tamaño y el hash bytes32 real en su propia estructura.

¿Puede alguien señalarme algún lugar para aprender más sobre los componentes internos?

EDITAR: las estructuras anidadas son posibles. PERO el mapeo (aquí members) no puede ser público y causa el siguiente error:TypeError: Internal type is not allowed for public state variable

¿Cómo puedo pasar una estructura anidada en Remix IDE?
Si tiene una nueva pregunta, hágala haciendo clic en el botón Preguntar . Incluya un enlace a esta pregunta si ayuda a proporcionar contexto. - De la revisión

Respuestas (1)

Puede almacenar un structen un struct.

pragma solidity ^0.4.11;

contract Nest {

  struct IpfsHash {
    bytes32 hash;
    uint hashSize;
  }

  struct Member {
    IpfsHash ipfsHash;
  }

  mapping(uint => Member) members;

  function addMember(uint id, bytes32 hash, uint size) public returns(bool success) {
    members[id].ipfsHash.hash = hash;
    members[id].ipfsHash.hashSize = size;
    return true;
  }

  function getMember(uint id) public constant returns(bytes32 hash, uint hashSize) {
    return(members[id].ipfsHash.hash, members[id].ipfsHash.hashSize);
  }
}

Este anidamiento es un poco inútil si solo hay un IPFS por miembro, como supongo que es el caso. No quería corregir demasiado y alejarme de la pregunta original.

Sí, puede anidar estructuras dentro de estructuras. También asignaciones y matrices, o incluso asignaciones de estructuras o matrices de estructuras.

Posiblemente útil: las declaraciones de estructura solo declaran un tipo , no instancias del tipo.

En términos de coordinar todo esto para hacer algo útil, eche un vistazo a los patrones aquí: ¿Existen patrones de almacenamiento simples y bien resueltos para Solidity?

Si está buscando uno a muchos (muchos IPFS por miembro), este patrón puede ser útil: https://medium.com/@robhitchens/enforcing-referential-integrity-in-ethereum-smart-contracts-a9ab1427ff42

Espero eso ayude.

eso es genial, gracias Un problema que tengo es con el mapeo: ¿por qué no puede ser público, que una función getter se genera básicamente automáticamente? con un mapeo de miembros públicos obtengo un error TypeError: "TypeError: el tipo interno no está permitido para la variable de estado público"
Derecha. Creo que el error se debe a que el compilador no comprende exactamente cómo construir el captador. Rima con este rascador de cabeza: ethereum.stackexchange.com/questions/15060/… . Posiblemente alguien más intervendrá con una explicación detallada para este caso exacto. Mi solución fue simplemente construir el captador.