Ist es möglich, eine Struktur innerhalb einer Struktur zu haben? Ich bin mir über die Interna des Datentyps nicht sicher, aber ich habe im Grunde versucht, so etwas wie (Pseudocode) zu tun:
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);
}
}
Ich versuche, einen IPFS-Hash mit Datentypen fester Länge zu speichern, und habe darüber nachgedacht, die Speicherung der ipfs-Hash-Funktion, der Größe und des tatsächlichen bytes32-Hash in eine eigene Struktur zu extrahieren.
Kann mir jemand sagen, wo ich mehr über die Interna erfahren kann?
EDIT: verschachtelte Strukturen sind möglich. ABER die Zuordnung (hier members
) kann nicht öffentlich sein, was den folgenden Fehler verursacht:TypeError: Internal type is not allowed for public state variable
struct
Sie können a in a speichern 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);
}
}
Diese Verschachtelung ist ein wenig sinnlos, wenn es nur ein IPFS pro Mitglied gibt, wie ich annehme. Ich wollte nicht zu viel reparieren und von der ursprünglichen Frage abweichen.
Ja, Sie können Strukturen in Strukturen verschachteln. Auch Mappings und Arrays oder sogar Mappings von Structs oder Arrays von Structs.
Möglicherweise hilfreich: Struct-Deklarationen deklarieren nur einen Typ , keine Instanzen des Typs.
Um all dies zu koordinieren, um etwas Nützliches zu machen, werfen Sie einen Blick auf die Muster hier drüben: Gibt es gut gelöste und einfache Speichermuster für Solidity?
Wenn Sie nach einem One-to-Many suchen (viele IPFS pro Mitglied), könnte dieses Muster hilfreich sein: https://medium.com/@robhitchens/enforcing-referential-integrity-in-ethereum-smart-contracts-a9ab1427ff42
Ich hoffe es hilft.
Donia Mansouri
Richard Horrocks