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!
msg.data
son 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.data
es El bytes
argumento 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.
luisio95