Strings als Indizes in Solidity verwenden

Kann ich Zeichenfolgen als Bezeichner in einem Solidity-Mapping verwenden?

Ich möchte so etwas:

contract C {
    mapping(string => mapping(address => uint)) public balances;
    string[] public tokennames; 
    mapping(string => uint) public tokennameIndex;
}

Jede Zeichenfolge repräsentiert ein anderes Token-Guthaben. Die Liste der Token wird von einem Administratorkonto verwaltet (hinzufügen, bearbeiten, entfernen, reorganisieren). Eine Alternative dafür ist die Verwendung unterschiedlicher Verträge für jeden Token, aber eine 2-D-Zuordnung scheint irgendwie einfacher zu sein, da der Speicher nicht zu groß sein wird. Außerdem entfällt die Notwendigkeit einer Liste von Vertragsadressen. Ist eine solche Indizierung sinnvoll? Vielen Dank!

Antworten (2)

Im Moment glaube ich nicht, dass du das kannst. Aus den Solidity-Dokumenten :

Zuordnungstypen werden als Zuordnung (_KeyType => _ValueType) deklariert. Hier kann _KeyType fast jeder Typ sein, außer einer Zuordnung, einem Array mit dynamischer Größe, einem Vertrag, einer Aufzählung und einer Struktur.

Beachten Sie, dass ein String ein Array mit dynamischer Größe ist .

Sie könnten dasselbe erreichen, indem Sie beispielsweise den aus drei Buchstaben bestehenden Token-Code anstelle des vollständigen Token-Namens als KeyType verwenden.

Zeichenfolgen funktionieren nicht als Zuordnungsschlüssel. Hashen Sie die Zeichenfolge mit keccak256()und verwenden Sie das Ergebnis bytes32als Zuordnungsschlüssel.

Der Ansatz, ein zweidimensionales Array anstelle einer separaten Vertragsinstanz pro Token zu verwenden, ist in Ordnung, solange:

  • Sie müssen keine Standardschnittstelle wie ERC20 verfügbar machen, die erwartet, dass jedes Token eine Vertragsinstanz hat
  • Sie müssen unterschiedlichen Token kein unterschiedliches Verhalten zuweisen