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:
47 PUSH4 0xffffffff
52 AND
53 DUP1
54 PUSH4 0xb1f6260f
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.
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 0xFFFFFFFF
para 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
.
CALLDATALOAD
?0x1234567890abcdef9876 & 0xFFFFFFFF == 0x12345678
.0x0100000000000000000000000000000000000000000000000000000000
antes de la operación AND para desplazar los primeros 4 bytes a la derecha.
usuario19510
0xffffffff
de 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.Enganchado
usuario19510