Conversión de Uint a Bytes32: ¿cómo tiene sentido [duplicar]

Código bastante simple aquí:

pragma solidity ^0.4.13;

contract Oracle{
    event Print(string _name, bytes32 _value);
    bytes32 key;

    function Store(bytes32 _key) returns (bytes32) {
        key = _key;
        Print("Key",_key);
        return _key;
    }

}

Ahora estoy tratando de almacenar el valor 1 como clave.

Usando remezclas,

entered key: 1
printed key: 0x0100000000000000000000000000000000000000000000000000000000000000

entered key: "0x01"
printed key: 0x0100000000000000000000000000000000000000000000000000000000000000

Ahora uno raro:

entered key: "0x1"
printed key: 0x0100000000000000000000000000000000000000000000000000000000000000

Y también raro:

entered key: "1"
printed key: 0x3100000000000000000000000000000000000000000000000000000000000000

Y también súper raro... cuando se usa NodeJS para impulsar una transacción sin procesar:

Entered:1
Printed key: 0x1000000000000000000000000000000000000000000000000000000000000000

Entonces, la pregunta, ¿por qué "0x1" y "0x01" y 1 me dan la misma respuesta en el remix y no en el nodo? ¿Y por qué el 1 entre comillas es algo diferente?

Respuestas (1)

Según tus ejemplos:

clave ingresada: 1 clave impresa: 0x010000000000000000000000000000000000000000000000000000000000000000

Los bytes se almacenan como una matriz de valores de 256 bits (en su caso, de tamaño 32 bytes), por lo que está almacenando el valor de uint 1 en el primer byte de la matriz, que es simplemente 0x01 y el resto de la matriz es nulo.

clave ingresada: "0x01" clave impresa: 0x01000000000000000000000000000000000000000000000000000000000000000

En Solidity, "0x01" se convertirá en su cadena equivalente, ya que es un valor hexadecimal válido para un uint de 256 bits.

clave ingresada: "0x1" clave impresa: 0x01000000000000000000000000000000000000000000000000000000000000000

Igual que el anterior, 0x01 es lo mismo que 0x1, al igual que 0x001 y 0x000001, todos son el valor entero de 1

clave ingresada: "1" clave impresa: 0x310000000000000000000000000000000000000000000000000000000000000000

Este es el valor hexadecimal ascii de la cadena "1", que es 0x31

Ingresado: 1 Clave impresa: 0x100000000000000000000000000000000000000000000000000000000000000000

Nunca lo he intentado con NodeJS, así que no puedo responder a esto, lo siento. Aunque espero haber respondido a tus otras preguntas.

Gracias James, buen material. Es un poco molesto extraño para los que no son un poco familiares, pero al menos tiene un poco más de sentido ahora.