Tratando con el mapeo (cadena => cadena [])

Tengo contrato con diferentes categorías. Podemos suponer que son los siguientes aquí:

  1. Ciudades
  2. Países
  3. condados

Supongamos que quiero agregar una nueva ciudad a la categoría ciudades. Supongo que esto tiene que ser una matriz, ya que necesito ser iterable.

Este código no compila pero muestra el tipo de cosas que quiero lograr

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

Necesitaré que estas cadenas (las ciudades) se transmitan y aparentemente eso aún no es posible en Ethereum (ver aquí ).

Alternativamente, intenté hacer esto (omitiendo el código irrelevante)

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

Que compila. Sin embargo, cuando agrego

599437d068e6196203c2ec23

vuelvo

0x3539393433376430363865363139363230336332656332330000000000000000

y no sé qué hacer para convertirlo 599437d068e6196203c2ec23al obtener el valor. Lo he intentado web3.toAscii()pero no funcionó.

Mi pregunta es: ¿hay alguna forma alternativa que me esté faltando o, si no, cómo puedo volver a convertir el valor cuando lo necesito?

Respuestas (1)

toAsciime da el resultado que parece que estabas esperando, después de eliminar el relleno 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"
Debo aclarar que esto no funciona si tiene bytes nulos dentro de su cadena. En la mayoría de las codificaciones, el byte nulo se usa para indicar el final de la cadena, por lo que debe estar seguro siempre que use una de esas codificaciones. (como el más común y el valor predeterminado de Solidity: UTF-8)