¿Cómo se almacenan los datos de llamada en la memoria?

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?

El selector de función siempre tiene 4 bytes, por lo que está en su propia "ranura"
Esta pregunta demuestra el relleno en calldata, como responde @Mikhail. La llamada real no tiene sentido habitual porque enteres una función que solo tiene un parámetro, por lo que, de forma ingenua, hnormalmente no se utilizará.
¿Cómo averiguar el tamaño máximo de los datos de llamada?

Respuestas (2)

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.