Работа с отображением (строка => строка [])

У меня контракт с разными категориями. Здесь мы можем предположить, что они следующие:

  1. Города
  2. Страны
  3. Округа

Предположим, я хочу добавить новый город в категорию городов. Я предполагаю, что это должен быть массив, так как мне нужно быть итерируемым.

Этот код не компилируется, но показывает, чего я хочу добиться

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

Мне нужно, чтобы эти строки (города) были переданы, и, очевидно, это пока невозможно в Ethereum (см. здесь ).

В качестве альтернативы я попытался сделать это (опустив ненужный код)

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

Который компилируется. Однако, когда я добавляю

599437d068e6196203c2ec23

Я вернусь

0x3539393433376430363865363139363230336332656332330000000000000000

и я не знаю, что делать, чтобы преобразовать его 599437d068e6196203c2ec23при получении значения. Я пытался web3.toAscii(), но это не сработало.

Мой вопрос: есть ли альтернативный способ, который мне не хватает, или, если нет, как мне преобразовать значение обратно, когда мне нужно?

Ответы (1)

toAsciiдает мне результат, который выглядит так, как вы ожидали, после удаления 0-заполнения:

> 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"
Мне должно быть ясно, что это не работает , если у вас есть нулевые байты внутри вашей строки. В большинстве кодировок нулевой байт используется для обозначения конца строки, поэтому вы должны быть в безопасности, пока используете одну из этих кодировок. (например, самый распространенный, а в Solidity по умолчанию: UTF-8)