¿Qué es Keccak-256?
Keccak-256 es la función hash de esponja de 256 bits que Ethereum usa en todas partes: una dirección son los últimos 20 bytes del Keccak-256 de la clave pública, un selector de función son los primeros 4 bytes del Keccak-256 de la firma canónica, y los topics de eventos, las sumas de verificación EIP-55 y los slots de almacenamiento derivan de él. Es la propuesta original de Keccak, que difiere del SHA3-256 finalizado por el NIST solo en el byte de relleno (padding), por lo que ambas producen digests distintos para la misma entrada.
Usos habituales
- Selector de función: calcula el hash de
transfer(address,uint256)como texto y toma los primeros 4 bytes:0xa9059cbb. La herramienta de selectores lo hace para muchas firmas a la vez y normaliza las declaraciones de Solidity. - Topic de evento: el Keccak-256 completo de
Transfer(address,address,uint256)es el topic[0] de cada log de transferencia ERC-20. - Dirección a partir de la clave pública: calcula el hash de la clave pública sin comprimir de 64 bytes (sin el prefijo 0x04) como hex y toma los últimos 20 bytes.
- Slot de almacenamiento de un mapping: calcula el hash de
abi.encode(key, slot)como bytes hex para saber dónde viven las entradas demapping(address => uint). - Commit-reveal y hashes de contenido: calcula el hash de cualquier texto o de archivos representados como hex.
Vectores de prueba
| Entrada | Keccak-256 |
|---|---|
| (vacío) | 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 |
abc | 0x4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45 |
Transfer(address,address,uint256) | 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef |
Pega cualquiera de estos valores para confirmar la implementación antes de confiar en ella.
Keccak-256 vs. SHA3-256 vs. SHA-256
| Función | Familia | Relleno / construcción | Usado por |
|---|---|---|---|
| Keccak-256 | Esponja Keccak, tasa de 1088 bits | pad10*1 con byte de dominio 0x01 | Ethereum, Tron (TVM), todas las cadenas EVM |
| SHA3-256 | Esponja Keccak, tasa de 1088 bits | pad10*1 con byte de dominio 0x06 (FIPS 202) | Aplicaciones NIST, algunas cadenas no EVM |
| SHA-256 | Merkle–Damgård (SHA-2) | relleno de longitud, bloques de 512 bits | Bitcoin, txID de Tron, TLS, Base58Check |
Ejemplo práctico: el SHA3-256 de abc en una biblioteca FIPS 202 devuelve 0x3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532, mientras que el Keccak-256 de los mismos tres bytes es el valor 0x4e03657a… de la tabla anterior. Si el valor de un contrato o de un explorador no coincide con el de tu biblioteca, el byte de relleno es lo primero que debes revisar.