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?
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.
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
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?
fettes Huhn13
Alex
private
, um dies zu lösen