У меня контракт с разными категориями. Здесь мы можем предположить, что они следующие:
Предположим, я хочу добавить новый город в категорию городов. Я предполагаю, что это должен быть массив, так как мне нужно быть итерируемым.
Этот код не компилируется, но показывает, чего я хочу добиться
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()
, но это не сработало.
Мой вопрос: есть ли альтернативный способ, который мне не хватает, или, если нет, как мне преобразовать значение обратно, когда мне нужно?
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"
резчик