Verschachtelte Strukturen in Solidität?

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

Wie kann ich verschachtelte Strukturen in der Remix IDE übergeben?
Wenn Sie eine neue Frage haben, stellen Sie diese bitte, indem Sie auf die Schaltfläche „ Frage stellen“ klicken . Fügen Sie einen Link zu dieser Frage hinzu, wenn dies hilfreich ist, um den Kontext bereitzustellen. - Aus Bewertung

Antworten (1)

structSie 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.

das ist toll, danke. Ein Problem, das ich habe, ist mit der Zuordnung: Warum kann das nicht öffentlich sein - dass eine Getter-Funktion im Grunde automatisch generiert wird? Bei einer Zuordnung öffentlicher Mitglieder erhalte ich einen TypeError-Fehler: „TypeError: Internal type is not allowed for public state variable“
Recht. Ich glaube, dass der Fehler darin besteht, dass der Compiler nicht genau versteht, wie der Getter konstruiert wird. Es reimt sich auf diesen Kopfkratzer: ethereum.stackexchange.com/questions/15060/… . Möglicherweise meldet sich jemand anderes mit einer detaillierten Erklärung für genau diesen Fall. Meine Problemumgehung bestand darin, nur den Getter zu erstellen.