¿Qué es un selector de función?
Un selector de función son los primeros 4 bytes del hash Keccak-256 de la firma canónica de una función: el nombre seguido de los tipos de los parámetros entre paréntesis, sin espacios ni nombres, por ejemplo transfer(address,uint256) → 0xa9059cbb. Forma los primeros 4 bytes del calldata de cada llamada a un contrato y le indica al contrato qué función ejecutar; los bytes restantes son los argumentos codificados en ABI.
Selectores comunes
La tabla se calcula en esta página con la misma implementación de Keccak que usa la herramienta, así que también sirve como autocomprobación. Pega cualquier selector en el cuadro de arriba para buscarlo.
Ejemplo práctico
Toma function approve(address spender, uint256 amount) external returns (bool). Quita la palabra clave, los nombres de parámetros, la visibilidad y el tipo de retorno para obtener approve(address,uint256). El Keccak-256 de esa cadena ASCII empieza por 0x095ea7b3…, así que el selector es 0x095ea7b3. El calldata para aprobar 1 USDT (6 decimales) es el selector, la dirección del spender rellenada por la izquierda hasta 32 bytes y 1000000 como palabra de 32 bytes: 4 + 32 + 32 = 68 bytes.
Selectores ERC-20 que verás con más frecuencia
| Firma | Selector |
|---|---|
totalSupply() | 0x18160ddd |
balanceOf(address) | 0x70a08231 |
transfer(address,uint256) | 0xa9059cbb |
transferFrom(address,address,uint256) | 0x23b872dd |
approve(address,uint256) | 0x095ea7b3 |
allowance(address,address) | 0xdd62ed3e |
Errores comunes
- Hacer el hash de
uinten lugar deuint256.transfer(address,uint)produce un valor distinto; la forma canónica siempre escribe el ancho completo. - Incluir nombres de parámetros o espacios.
transfer(address to, uint256 amount)no es una firma canónica. - Usar el nombre del struct para las tuplas. Los structs se escriben como los tipos de sus campos entre paréntesis, nunca como
MyStruct. - Confundir selector y topic. Las funciones usan 4 bytes; los eventos usan el hash completo de 32 bytes.
Formatos de entrada aceptados
transfer(address,uint256): forma canónica.function transfer(address to, uint256 amount) external returns (bool): declaración de Solidity; se eliminan nombres, visibilidad y returns.event Transfer(address indexed from, address indexed to, uint256 value): la palabra claveindexedse ignora para el hash del topic.0xa9059cbbo un topic de 32 bytes: búsqueda inversa en la lista integrada.
Para construir o leer el calldata completo, continúa con el codificador / decodificador ABI.