Solidez: msg.data vs bytes

Este es un contrato simple que tiene una función input_data (datos de bytes) y una función de respaldo simple que pasa msg.data a la función input_data.

contract test_input_data{

address owner;

event log_input_data(address result);

constructor() public{

    owner = msg.sender;
}

function input_data(bytes data) public payable{

    address n = address(keccak256(data));

    emit log_input_data(n);

}

function() public payable{
    input_data(msg.data);
}}

El contrato registra los datos hash convertidos en una variable de dirección. ¿Por qué cuando llamo input_data (datos = 1), el registro es diferente que cuando realizo una transacción en el contrato (llamando así al respaldo) adjuntando datos = 1 a la transacción?

Aquí hay un ejemplo: input_data(data = 1) log = 0x057beebb9be2ac30c6410aa38d4f3fbe41dcffd2 fallback() = 1 log = 0xdcc703c0e500b653ca82273b7bfad8045d85a470

usado:metamask, remix, rinkeby testnet, myetherwallet. ¡Gracias!

Respuestas (1)

msg.datason los datos sin procesar que se envían en la transacción. Es una codificación del selector de función y luego cualquier parámetro que esté pasando a esa función.

Entonces, por ejemplo, al llamar input_data(bytes)con un solo byte con el valor 1, la codificación ABI sería esta (con saltos de línea para mayor claridad):

0xfbcc217e
0000000000000000000000000000000000000000000000000000000000000020
0000000000000000000000000000000000000000000000000000000000000001
0100000000000000000000000000000000000000000000000000000000000000

Los primeros cuatro bytes son el selector de función (hash de "input_data(bytes)"). Los siguientes 32 bytes son el desplazamiento del inicio del argumento bytes. Los siguientes 32 bytes son la longitud del argumento bytes. Y los últimos 32 bytes son los propios bytes reales, rellenados hasta una longitud de 32 bytes.

eso msg.dataes El bytesargumento que se codifica en input_data, por otro lado, sería simplemente:

0x01

Entonces, se espera que los valores hash de estas dos cosas sean diferentes.

La publicación de mi blog Anatomía de los datos de transacciones podría ayudar y recomendarle lecturas adicionales.

¡Gracias smarx! Entonces, ¿cómo puedo acceder y almacenar los últimos 32 bytes de msg.data? Me gustaría compararlos con datos de bytes.