¿Qué es la codificación ABI?
La codificación ABI es la regla de la especificación ABI de contratos de Solidity para convertir una llamada a función en bytes: un selector de 4 bytes seguido de los argumentos empaquetados en palabras de 32 bytes, con los valores estáticos en línea y los valores dinámicos (bytes, strings, arrays dinámicos) colocados después de una cabecera que contiene sus desplazamientos en bytes. Un codificador ABI construye ese calldata a partir de una firma y unos valores; un decodificador hace lo inverso.
Cómo funciona la disposición
Para f(uint256,uint32[],bytes10,bytes) llamada con (0x123, [0x456, 0x789], "1234567890", "Hello, world!") la codificación es: el selector 0x8be65246, luego la cabecera de cuatro palabras (el uint256, un desplazamiento de 0x80 al array, el bytes10 rellenado por la derecha, un desplazamiento de 0xe0 a los bytes), y luego la cola: la longitud del array, 2, y sus dos elementos, después la longitud de los bytes, 13, y los datos rellenados. Haz clic en "f() de la documentación de Solidity" arriba para verlo palabra por palabra.
Reglas en resumen
- Cada valor ocupa un múltiplo de 32 bytes. Los enteros y direcciones se rellenan por la izquierda;
bytesNse rellena por la derecha. - Los enteros negativos usan complemento a dos en 256 bits.
- Los valores dinámicos se referencian por desplazamientos en bytes medidos desde el inicio del cuerpo de la tupla o array que los contiene.
- Un array estático
T[k]deTestático va en línea; un array dinámicoT[]empieza con su longitud. - Las tuplas siguen la misma regla cabecera/cola de forma recursiva, que es como se codifican los structs y los arrays anidados.
Ejemplo práctico: una transferencia ERC-20
transfer(address,uint256) con el destinatario 0x1111111111111111111111111111111111111111 y 25 USDT (25.000.000 unidades en bruto) se codifica en 68 bytes: el selector a9059cbb, luego 12 bytes cero de relleno por la izquierda seguidos de la dirección de 20 bytes, y después 25.000.000 = 0x17d7840 rellenado por la izquierda hasta una palabra de 32 bytes. Toda transferencia ERC-20 en cualquier explorador tiene exactamente esta forma, y por eso el decodificador puede nombrar la función y recuperar los argumentos solo a partir del selector.
Relacionado
Calcula solo selectores con la herramienta de selectores de función; convierte cantidades de tokens a enteros en bruto con el conversor de decimales de tokens; inspecciona palabras individuales con el conversor de hex a decimal.