¿Es peligroso nombrar mi función ccccvKygDv?

Para aquellos que realizan un seguimiento en casa, el hash de función de una función llamada ccccvKygDv()es 0xffffffff, lo mismo que una dirección nula.

pragma solidity ^0.4.0;

contract NullFunction {
  function ccccvKygDv() public pure { }
}

contract NormalFunction {
  function NothingWrongHere() public pure { }
}

Cuando miro los códigos de operación de las dos funciones enumeradas anteriormente, obtengo:

No hay nada malo aquí ()

47 PUSH4 0xffffffff
52 AND
53 DUP1
54 PUSH4 0xb1f6260f

ccccvKygDv()

47 PUSH4 0xffffffff
52 AND
53 DUP1
54 PUSH4 0xffffffff

Parece que los datos que se envían a la pila sobrescribirán algunos de los datos necesarios para la función en sí.

¿Es esta una pregunta tonta? Absolutamente, pero lo pregunto para poder entender un poco mejor cómo funcionan los contratos en el nivel del código de operación.

"lo mismo que una dirección nula" ¿Qué quiere decir con "una dirección nula"? ¿Estás seguro 0xffffffffde que no es solo un poco de máscara? Necesitaría ver más de la asamblea, pero esa sería mi primera suposición.
@smarx lo siento, no es una dirección nula (creo), pero el valor más grande que puede contener una unidad de este tamaño. Estoy tratando de entender si la función hash que tiene esta firma causará/no causará ningún problema y por qué. Aquí hay una esencia con los códigos de operación completos.
Creo que mi suposición fue correcta. Es solo una máscara de bits utilizada para extraer los primeros cuatro bytes de los datos de la llamada. (Ver mi respuesta.)

Respuestas (1)

Creo que esto es solo una pequeña máscara.

El código carga los datos de la llamada, los desplaza hacia la derecha y luego hace un AND bit a bit 0xFFFFFFFFpara obtener los (ahora) últimos cuatro bytes (el selector de funciones).

Luego compara los cuatro bytes extraídos con el selector de función conocido. No importa que la firma de la función que está buscando sea 0xFFFFFFFF.

Gracias, esto tiene sentido por qué no causaría un problema. ¿Cuál es el punto del AND bit a bit para obtener la firma de la función? ¿No se ha insertado ya en la pila desde CALLDATALOAD?
CALLDATALOAD tiene más de cuatro bytes. El AND extrae los primeros 4 bytes. ej 0x1234567890abcdef9876 & 0xFFFFFFFF == 0x12345678.
Una corrección menor: AND bit a bit con 0xFFFFFFFF extraerá los últimos 4 bytes de una palabra, no los primeros. La primera palabra de los datos de entrada se divide 0x0100000000000000000000000000000000000000000000000000000000antes de la operación AND para desplazar los primeros 4 bytes a la derecha.