Zuordnen mehrerer Schlüssel in einer Zuordnung zu einer einzelnen Struktur

Ich habe einige Nachforschungen zu Zuordnungen und Strukturen angestellt und weiß, dass es möglich ist, Strukturen in einer Zuordnung als Wert, aber nicht als Schlüssel zu speichern .

Ich versuche, eine Zuordnung von Adressen => Strukturen zu erstellen, bei denen mehrere Adressen auf dieselbe Struktur verweisen.

Zum Beispiel habe ich die folgende Teststruktur und Zuordnung.

struct test{
uint nonce;
address friend;
}

mapping (address => test) testMapping;

Ist es möglich, dass ich zwei verschiedene Adressen habe, die derselben Struktur zugeordnet sind (nicht nur denselben Daten - ich möchte aus Effizienzgründen keine Kopie erstellen)?

Wenn ich den folgenden Code schreiben würde, würde ich eine Kopie der Daten innerhalb der Struktur erstellen oder einfach zwei verschiedene Schlüssel auf dieselbe Stelle im Speicher innerhalb der Zuordnung verweisen?

testMapping[address1].nonce = 1;
testMapping[address1].friend = address2;
testMapping[address3] = testMapping[address1];

AKA, kopieren die obigen Befehle die Werte von testMapping[Adresse1] in testMapping[Adresse2] oder verweisen sie einfach testMapping[Adresse2] auf denselben Speicherort wie testMapping[Adresse1], in diesem Fall, wenn ich einen aktualisiere, beides sind aktualisiert?

Danke für jede Hilfe.

Antworten (2)

Ja, du würdest eine Kopie machen.

Was Sie stattdessen tun könnten, ist, nur ein Array von testsAdressen zu haben und diese dann Array-Indizes zuzuordnen.

struct test{
    uint nonce;
    address friend;
}

mapping (address => uint) testMapping; //Maps addresses to index in `tests`
test[] tests;
Danke für die Antwort. Kurze Folgefrage. Angenommen, ich möchte dem Array einen neuen Test hinzufügen. Ich gehe davon aus, dass ich tests.push(INFO) nicht ausführen kann, da es sich um eine Struktur handelt. Wie erhöhe ich dann die Größe eines solchen Arrays? Danke noch einmal.

"Würde ich eine Kopie der Daten innerhalb der Struktur machen?"

Ja.

Das würde mit der Größe der Struktur tendenziell teurer werden.

Es sieht so aus, als ob Sie einen tabellenähnlichen Speicher für Personen mit einer Viele-zu-Viele-Verknüpfung zu anderen Personen erstellen möchten. Es ist möglich, Mappings für den Direktzugriff und Arrays für Schlüssellisten zu verwenden. Hier hat eine Person eine Freundesliste.

struct PersonStruct {
    string data1;
    uint data2;
    address[] friends;
}

mapping (address => PersonStruct) personStructs;

Das ist wirklich einfach; nur um Ihnen zu helfen, über die Möglichkeiten nachzudenken. Sie könnten die "Freunde"-Liste für eine bestimmte Person mit ein paar Funktionen aufzählen, um zu helfen.

Stellen Sie sich eine Funktion vor, um die Anzahl der Freunde zurückzugeben, die in der Liste innerhalb der Struktur einer Person gespeichert sind:

function personFriendCount(address person) constant returns(uint count) {
    return personStructs[person].friends.length;
}

Und ein weiterer, um die Freundesschlüssel zurückzugeben, während der Client sich durch die Liste arbeitet.

function personFriendAtIndex(address person, uint index) constant returns(address friendAddress) {
    return personStructs[person].friends[index];
}

Mit dem Schlüssel des Freundes in der Hand kann der Client die Struktur für die Details abrufen.

Ich hoffe es hilft.