¿La cadena de retorno de solidez no es hexadecimal?

Actualmente estoy usando ether.camp para crear un contrato. En esta etapa simplemente obtiene y almacena algunos valores. Sin embargo, cuando intento obtener los valores, ¿están en bytes/hexadecimal aunque el tipo de retorno sea una cadena?

¿Cómo convierto esto de nuevo en cadena en el contrato de solidez? Intenté cómo convertir un bytes32 en una cadena, pero no tuve suerte .

Por ejemplo, almacenar "Hello World!" devoluciones0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c48656c6c6f20576f726c64210000000000000000000000000000000000000000

   contract HelloWorld {
    struct Items {
       address id;
       string data;
    }

    mapping(address => Items) items;

    function getItem(address key) returns (string) {
      return items[key].data;
    }

    function addItem (address key, string data) returns (bool) {
        Items item = items[key];
        item.data = data;
    }

   }

 }

Puedo ver en la barra lateral de transacciones de ethercamp del IDE el mensaje "¡Hola mundo!" se guarda como una cadena pero getItem()simplemente no puedo recuperarla?

Respuestas (2)

Usa web3.js como contractInstance.getItem.call(key).

O marque getItem como constante: function getItem(address key) constant returns (string)y luego puede usar:

contractInstance.getItem(key)

web3.js decodificará automáticamente los bytes por usted. Los contratos solo tienen datos binarios, hexadecimal es una forma más compacta de ver esos datos, y es por eso que ves hexadecimal. Los datos binarios también se codifican de acuerdo con un ABI , de modo que los valores se pueden distinguir, por ejemplo, entre lo que es solo un número y una cadena.

¡Muchas gracias! agregarlo constantlo resuelve, pero sé que entiendo que webjs lo decodificará automáticamente por mí
No hay problema. (Iba a agregar más aclaraciones acerca de no necesitar "convertir esto nuevamente en cadena en el contrato de solidez", y bueno, la respuesta funciona para usted).
Tal vez esto merezca una nueva pregunta, pero ¿hay una sola línea fácil para obtener el recuento de elementos en el código anterior? Viniendo de un fondo .net que tenía items.counto items.lengthen mente.
No la forma en que su código está configurado. No puede iterar a través de una asignación, pero si incluye una matriz de direcciones, puede obtener la longitud de eso fácilmente.

En general, también puede utilizar:

> web3.toUtf8("0x48656c6c6f20576f726c642100000000000000000000000000000000000000000")
Hola Mundo!