O que é Keccak-256?
Keccak-256 é a função de hash esponja de 256 bits que o Ethereum usa em todo lugar: um endereço são os últimos 20 bytes do Keccak-256 da chave pública, um seletor de função são os primeiros 4 bytes do Keccak-256 da assinatura canônica, e tópicos de eventos, checksums EIP-55 e slots de armazenamento derivam todos dele. É a submissão original do Keccak, que difere do SHA3-256 finalizado pelo NIST apenas no byte de preenchimento (padding), por isso as duas funções produzem digests diferentes para a mesma entrada.
Usos típicos
- Seletor de função: faça o hash de
transfer(address,uint256)como texto e pegue os primeiros 4 bytes:0xa9059cbb. A ferramenta de seletores faz isso para várias assinaturas de uma vez e normaliza declarações Solidity. - Tópico de evento: o Keccak-256 completo de
Transfer(address,address,uint256)é o topic[0] de todo log de transferência ERC-20. - Endereço a partir da chave pública: faça o hash da chave pública não comprimida de 64 bytes (sem o prefixo 0x04) como hex e pegue os últimos 20 bytes.
- Slot de armazenamento de mapping: faça o hash de
abi.encode(key, slot)como bytes hex para descobrir onde ficam as entradas demapping(address => uint). - Commit-reveal e hashes de conteúdo: faça o hash de texto arbitrário ou de arquivos representados em hex.
Vetores de teste
| Entrada | Keccak-256 |
|---|---|
| (vazio) | 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 |
abc | 0x4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45 |
Transfer(address,address,uint256) | 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef |
Cole qualquer um deles para confirmar a implementação antes de confiar nela.
Keccak-256 vs. SHA3-256 vs. SHA-256
| Função | Família | Padding / construção | Usada por |
|---|---|---|---|
| Keccak-256 | Esponja Keccak, taxa de 1088 bits | pad10*1 com byte de domínio 0x01 | Ethereum, Tron (TVM), todas as redes EVM |
| SHA3-256 | Esponja Keccak, taxa de 1088 bits | pad10*1 com byte de domínio 0x06 (FIPS 202) | Aplicações NIST, algumas redes não EVM |
| SHA-256 | Merkle–Damgård (SHA-2) | padding de comprimento, blocos de 512 bits | Bitcoin, txID da Tron, TLS, Base58Check |
Exemplo prático: o SHA3-256 de abc em uma biblioteca FIPS 202 retorna 0x3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532, enquanto o Keccak-256 dos mesmos três bytes é o valor 0x4e03657a… da tabela acima. Se um valor de contrato ou de explorador não bate com a sua biblioteca, o byte de padding é a primeira coisa a verificar.