Umgang mit Mapping(string => string[])

Ich habe einen Vertrag mit verschiedenen Kategorien. Wir können davon ausgehen, dass es sich hier um folgende handelt:

  1. Städte
  2. Länder
  3. Landkreise

Angenommen, ich möchte der Kategorie Städte eine neue Stadt hinzufügen. Ich gehe davon aus, dass dies ein Array sein muss, da ich iterierbar sein muss.

Dieser Code wird nicht kompiliert, aber er zeigt die Art der Sache, die ich erreichen möchte

mapping(string => string[]) Categories;
// Add a record
function addCity(string _type, string _city) {
    Categories[_type].push(_city);
}

Ich brauche diese Zeichenfolgen (die Städte), um herumgereicht zu werden, und anscheinend ist das in Ethereum noch nicht möglich (siehe hier ).

Alternativ habe ich versucht, dies zu tun (ohne irrelevanten Code)

mapping(string => bytes32[]) Categories;
function addCity(string _type, bytes32 _city) {
        Categories[_type].push(_city);
}

Was kompiliert. Wenn ich jedoch hinzufüge

599437d068e6196203c2ec23

Ich komme zurück

0x3539393433376430363865363139363230336332656332330000000000000000

und ich weiß nicht, was ich tun soll, um es zu konvertieren, 599437d068e6196203c2ec23wenn ich den Wert abrufe. Ich habe es versucht web3.toAscii(), aber es hat nicht funktioniert.

Meine Frage ist: Gibt es einen alternativen Weg, den ich vermisse, oder wenn nicht, wie kann ich den Wert bei Bedarf zurückwandeln?

Antworten (1)

toAsciigibt mir das Ergebnis, das so aussieht, als hätten Sie es erwartet, nachdem Sie die 0-Auffüllung entfernt haben:

> hex_val = '0x3539393433376430363865363139363230336332656332330000000000000000'
"0x3539393433376430363865363139363230336332656332330000000000000000"
> padded_str = web3.toAscii(hex_val)
"599437d068e6196203c2ec23\x00\x00\x00\x00\x00\x00\x00\x00"
> first_null = padded_str.indexOf('\x00')
24
> trimmed_str = padded_str.slice(0, first_null)
"599437d068e6196203c2ec23"
Ich sollte klar sein, dass dies nicht funktioniert, wenn Sie Nullbytes in Ihrer Zeichenfolge haben. In den meisten Codierungen wird ein Null-Byte verwendet, um das Ende der Zeichenfolge zu kennzeichnen, daher sollten Sie auf der sicheren Seite sein, solange Sie eine dieser Codierungen verwenden. (wie der gebräuchlichste und Solidity-Standard: UTF-8)