Kann ich Speicherstrukturen dynamisch erstellen?

Ich möchte eine Funktion, die ein Dokument in meinem Vertrag erstellt. Ich habe alles Unnötige entfernt. Geht so:

contract MyContract{
  mapping (uint => document) documents;

  struct document{
      address author;
      bytes32 hashedContent;
  }

  function addDocument(bytes32 docHash) public{
      document newDoc = document (msg.sender,docHash); //*
      [...]
  }
}

Dokumente sind Strukturen, und ich möchte sie aus einer Funktion erstellen und dann dauerhaft zu einer Zuordnung hinzufügen. Ich habe einen Fehler in der //*Zeile, die besagt:

MyContract.document memory is not implicitly convertible to expected type struct MyContract.document storage pointer. document newDoc = document (docHash,msg.sender); ^---------------------------------------------^

(von Remix) Der linke Teil ist Speicher, aber ich denke, der linke Teil ist Erinnerung.

Ist es möglich, das zu tun, was ich versuche?

  • Wenn ja, was habe ich falsch gemacht?
  • Wenn nicht, kennst du einen Workaround? (Jemand hat vorgeschlagen, dass ich für jedes Dokument einen separaten Vertrag abschließe, aber das würde alles VIEL verkomplizieren, wenn man den Rest meines Vertrags berücksichtigt, und vorzugsweise suche ich nach einer Lösung in einem einzigen Vertrag .

Antworten (1)

Sie können einfach dies tun:

documents[whateverInt] = document(msg.sender,docHash);

Wenn Sie das Dokument unbedingt deklarieren müssen, bevor Sie es einstellen, müssen Sie Folgendes tun:

document memory newDoc = document(msg.sender,docHash);
documents[whateverInt] = (doc);

Andernfalls newDocwird standardmäßig ein Speicherzeiger verwendet, aber es document(msg.sender,docHash)handelt sich um einen Wert und nicht um einen Zeiger.

Durch Drücken einer Speicherstruktur in einer Speicherzuordnung wird sie in Speicher konvertiert?
In gewisser Weise. Genauer gesagt wird document(msg.sender, docHash) nicht als Speicherzeiger oder Speicherzeiger behandelt, sondern als Wert. Wenn Sie den Wert einem Speicherzeiger zuweisen, funktioniert es korrekt, aber wenn Sie ihn einem Speicherzeiger zuweisen, wird etwas gefährlich überschrieben.
Es gibt mir den folgenden Fehler:TypeError: Member "push" not found or not visible after argument-dependent lookup in mapping(uint256 => address)
Hoppla! Siehe meine Bearbeitung. Ich habe geantwortet, als ob Sie auf ein Array pushen würden, ohne eine Zuordnung zu verwenden.