Interner Compilerfehler: Accessors für Mapping mit Schlüsseln mit dynamischer Größe noch nicht implementiert

Ich habe ein mapping(string => Person) public map:

struct Person {
        string name;
        string description;
        address primaryAddress;
        string linkToWebsite;
        string linkToPicture;
        address secondaryAddress;
        uint age;
}

, diese Struktur besteht nur aus Strings, Adressen und Uints, aber beim Kompilieren bekomme ich diesen Fehler.

Internal compiler error: Accessors for mapping with dynamically-sized keys not yet implemented.

ABER,

Von Solidity Features :

Zeichenfolgen als Zuordnungsschlüssel

Strings sind als Schlüssel für Mappings erlaubt.

contract C {   mapping (string => uint) counter;   
function inc(string _s) { counter[_s]++; } }

Irgendwelche Hilfe dabei?

Antworten (3)

Die Sache war, dass mein Mapping öffentlich war und noch keine öffentlichen Accessoren dafür implementiert sind. Die Lösung besteht einfach darin, die Zuordnung nicht als öffentlich zu deklarieren.

Warum brauchen Sie einen öffentlichen Accessor? Sollte es nicht den Getter generieren? "Es ist möglich, Zuordnungen als öffentlich zu markieren und Solidity einen Getter erstellen zu lassen. Der _KeyType wird zu einem erforderlichen Parameter für den Getter und gibt _ValueType zurück." Quelle
Ich habe mein Mapping erklärt private, um dies zu lösen

Strings sind als Schlüssel im Mapping erlaubt. Zum Beispiel funktioniert dieser Code beim Testen in Pyethereum gut:

 from ethereum import tester as t

 code = '''
    contract Example {
       struct Person {
         string name;
       }
       mapping(string => Person) map;

       function setName(string name, string value) {
          map[name] = Person({name: value});
       }

       function getName(string key) constant returns (string) {
         return map[key].name;
       }

   }
  '''

   state = t.state()
   contract =  state.abi_contract(code, language='solidity')
   contract.setName('dave', 'hello')
   print contract.getName('dave')
   => 'hello'

In Ihrem aktuellen Vertragscode muss etwas los sein

Was kann diesen Fehler verursachen?
Ich weiß es nicht, ohne den ganzen Vertrag gesehen zu haben. Verwenden Sie eine neuere Version des Solidity-Compilers?
Die jüngste
Ich würde empfehlen, inkrementelle, einfachere Versionen Ihres Vertrags durchzuarbeiten und zu kompilieren, bis Sie das Problem gefunden haben. Probieren Sie meinen obigen Code für den Anfang aus, um zu sehen, ob er in Ihrem Setup funktioniert

ohne Ihre Struktur zu sehen, ist es schwer zu erraten, hilft das?

contract structtestmapping {
    struct myStruct {
        uint id;
    }
    mapping(string => myStruct) mapmystruct;
    myStruct s = mapmystruct['mystring'];

}

Ihre Struktur könnte Elemente mit dynamischer Größe enthalten, wie der Code hier vorschlägt?

Das ist für mich nicht hilfreich, ich möchte mit einem String-Schlüssel, der per Parameter angegeben wird, auf das Mapping zugreifen, aber trotzdem danke. Ich habe Zeichenfolgen und Adressen in der Struktur.
Wird eine Zeichenfolge als Element mit dynamischer Größe betrachtet?
Ich denke schon, wenn das richtig ist, würde ich nicht darauf wetten, obwohl github.com/ethereum/wiki/wiki/… : String-Typ wieder einführen PT-String wird als Typ hinzugefügt, der sich genau wie Bytes mit den folgenden Unterschieden verhält : Indexzugriff ist nicht erlaubt es hat kein Längenelement In der ABI-Codierung (Wiki bereits geändert) ist string ein dynamischer Typ, dessen Feld "Anzahl der Elemente" die Anzahl der Bytes ist, nicht die Anzahl der Zeichen. Es wird angenommen, dass die Codierung des Strings UTF-8 ist, aber innerhalb von Solidity noch nicht verwendet wird.
Ist es dann möglich, die Größe der Zeichenfolgen in meiner Struktur festzulegen?
Auch @dbryson hat eine Zeichenfolge in seiner Struktur und seine Lösung funktioniert
Warum postest du nicht deine Struktur, könnte für alle einfacher sein;)
fertig, du hast es
Wenn Sie Ihre Struktur in diesem einfachen Vertrag mit dem, was @dbryson gepostet hat, verwenden, habe ich keinen Kompilierungsfehler in Mix 1.0.1, Solidity 0.3.0 erhalten .