Cuando ejecuto esto:
bytes8 h = 0x000008dfe2f440000733c;
t.call.gas(0x7e0b0)(bytes4(keccak256("enter(bytes8)")),0x8dfe2f440000733c0000000,h);
los datos de la llamada son:
0: 0x3370204e000000000000000000000000000000000000000008dfe2f440000733c00000008dfe2f440000733c000000000000000000000000000000000000000000000000
Lo dividí por 32 bytes:
3370204e000000000000000000000000000000000000000008dfe2f440000733
c00000008dfe2f440000733c0000000000000000000000000000000000000000
00000000
¿Por qué es esto?
3370204e // bytes4(keccak256("enter(bytes8)"))
000000000000000000000000000000000000000008dfe2f440000733c0000000 // 0x8dfe2f440000733c0000000 uint96 padded to 32 bytes
8dfe2f440000733c000000000000000000000000000000000000000000000000 // 0x000008dfe2f440000733c bytes8 padded to 32 bytes
De la documentación :
Además, para interactuar con contratos que no se adhieren a la ABI, se proporciona la llamada de función que toma un número arbitrario de argumentos de cualquier tipo. Estos argumentos se rellenan a 32 bytes y se concatenan. Una excepción es el caso en el que el primer argumento está codificado en exactamente cuatro bytes. En este caso, no se rellena para permitir el uso de firmas de función aquí.
Tenga en cuenta que uintN se rellena a la izquierda y bytesN se rellena a la derecha. De la documentación :
uint<M>: enc(X) es la codificación big-endian de X, rellenada en el lado de orden superior (izquierda) con cero bytes, de modo que la longitud es de 32 bytes.
bytes<M>: enc(X) es la secuencia de bytes en X rellenada con cero bytes finales hasta una longitud de 32 bytes.
Como dijo @libertylocked en su comentario, el selector de función es de 4 bytes, por lo que debe eliminar esos 4 bytes antes de dividirlos en 32 bytes para obtener las palabras individuales.
libertad bloqueada
ética
enter
es una función que solo tiene un parámetro, por lo que, de forma ingenua,h
normalmente no se utilizará.Andón Mitev