Fehler bei der Verwendung des Zeichenfolgentyps als Zuordnungsschlüssel

Der folgende Code wird nicht kompiliert, da der Compiler einen Zuordnungsschlüssel mit fester Größe benötigt , um einen Accessor für eine öffentliche Zuordnung zu erstellen. Ich verwende hier den String-Typ. Meine Strings sind 24-Byte-Hex-Strings.

Meine Frage:

  • Wie würden Sie eine Zeichenfolge in einen Typ mit fester Größe umwandeln, der als Zuordnungsschlüssel verwendet werden kann?

  • Haben Sie Tipps, wie der Code effizienter gestaltet werden kann?


pragma solidity ^0.4.6;
contract C {
    struct User {
         uint balance;
    }
    mapping (string => User) public accounts;
    function newUser(string id, uint balance) {
         accounts[id] = User(balance);
    }
}

Fehler: Nicht implementiertes Feature: Accessors für Mapping mit Schlüsseln mit dynamischer Größe noch nicht implementiert.

Sie können eine Zeichenfolge nicht wirklich in einen festen Typ umwandeln. Es sieht so aus, als ob das Problem nur beim Accessor liegt, nicht bei der Zuordnung selbst. Wenn Sie also die Zuordnung nicht öffentlich machen und den Accessor selbst schreiben, funktioniert es möglicherweise
Das ist eigentlich ein etwas kompliziertes Thema. Grundsätzlich können Sie im Allgemeinen keinen benutzerdefinierten Typ wie Userin einer öffentlichen Funktion zurückgeben. Solidity hat eine nette kleine Funktion, mit der Sie eine benutzerdefinierte Struktur von einer öffentlichen Zuordnung zurückgeben können, aber nur über eine lokale call, nicht über eine tatsächliche EVM-Operation. Dynamische Schlüssel verwirren damit

Antworten (1)

Ich schlage vor, bytesN anstelle von string zu verwenden:

pragma solidity ^0.4.6;
contract C {
    struct User {
         uint balance;
    }
    mapping (bytes24 => User) public accounts;
    function newUser(bytes24 id, uint balance) {
         accounts[id] = User(balance);
    }
}

Sie können auch Bytes in Strings umwandeln. Schauen Sie sich an: How to convert a bytes32 to string

bytesunterscheidet sich stark vom Typ "bytesN", der bytes24, enthält bytes32.