O que é codificação ABI?
A codificação ABI é a regra da especificação de ABI de contratos Solidity para transformar uma chamada de função em bytes: um seletor de 4 bytes seguido dos argumentos empacotados em palavras de 32 bytes, com valores estáticos inline e valores dinâmicos (bytes, strings, arrays dinâmicos) colocados depois de um cabeçalho (head) que guarda seus offsets em bytes. Um codificador ABI monta esse calldata a partir de uma assinatura e de valores; um decodificador faz o caminho inverso.
Como funciona o layout
Para f(uint256,uint32[],bytes10,bytes) chamada com (0x123, [0x456, 0x789], "1234567890", "Hello, world!") a codificação é: o seletor 0x8be65246, depois o head de quatro palavras (o uint256, um offset de 0x80 para o array, o bytes10 preenchido à direita, um offset de 0xe0 para os bytes), depois o tail: o tamanho do array 2 e seus dois elementos, depois o tamanho dos bytes 13 e os dados preenchidos. Clique em "f() da documentação Solidity" acima para ver palavra por palavra.
Regras em resumo
- Todo valor ocupa um múltiplo de 32 bytes. Inteiros e endereços são preenchidos à esquerda,
bytesNé preenchido à direita. - Inteiros negativos usam complemento de dois em 256 bits.
- Valores dinâmicos são referenciados por offsets em bytes medidos a partir do início do corpo da tupla ou array que os contém.
- Um array estático
T[k]deTestático é inline; um array dinâmicoT[]começa com seu tamanho. - Tuplas seguem a mesma regra head/tail recursivamente, e é assim que structs e arrays aninhados são codificados.
Exemplo prático: uma transferência ERC-20
transfer(address,uint256) com destinatário 0x1111111111111111111111111111111111111111 e 25 USDT (25.000.000 unidades brutas) codifica em 68 bytes: seletor a9059cbb, depois 12 bytes zero de preenchimento à esquerda seguidos do endereço de 20 bytes, depois 25.000.000 = 0x17d7840 preenchido à esquerda até uma palavra de 32 bytes. Toda transferência ERC-20 em todo explorador tem exatamente esse formato, e é por isso que o decodificador consegue nomear a função e recuperar os argumentos só a partir do seletor.
Relacionados
Calcule apenas seletores com a ferramenta de seletor de função; converta quantidades de tokens em inteiros brutos com o conversor de decimais de token; inspecione palavras individuais com o conversor de hex para decimal.