¿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
Puede almacenar un struct
en 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.
donia mansouri
Richard Horrocks