Codificador / decodificador ABI de Ethereum

Convierte una firma de función más sus argumentos en calldata exacto, o pega el calldata de una transacción y decodifícalo. Compatibilidad completa con ABI v2: arrays anidados, tuplas, bytes y strings dinámicos, con un desglose palabra por palabra.

Los enteros pueden ser decimales o hex 0x (comillas opcionales). Direcciones, bytes y strings van entre comillas. bytesN acepta hex 0x o texto.
Ejemplos:

Se calcula en tu navegador con JavaScript. Las direcciones nunca se suben ni se almacenan.

¿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

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.

Preguntas frecuentes

¿Qué es la codificación ABI?

La Application Binary Interface define cómo se disponen los argumentos en el campo data de una transacción: un selector de 4 bytes seguido de palabras de 32 bytes. Los tipos estáticos se colocan en línea; los tipos dinámicos (bytes, string, arrays dinámicos y tuplas que los contienen) se referencian mediante un desplazamiento en la cabecera y se colocan en la cola.

¿Cómo escribo los argumentos?

Como un array JSON en el orden de los parámetros. Los enteros pueden ir sin más o en hex 0x, con o sin comillas; los valores grandes deben ir entre comillas o escribirse en hex. Direcciones y strings van entre comillas. Arrays y tuplas son arrays anidados, por ejemplo [[1,2],[3]] para uint256[][].

¿Por qué mi valor decodificado aparece como string?

Los enteros mayores que 253 no se pueden representar con exactitud como números JSON, así que todos los enteros se muestran como cadenas decimales. Las direcciones se muestran con suma de verificación EIP-55.

¿Puedo decodificar una transacción de Etherscan?

Sí. Copia los datos de entrada (input data), pégalos junto con la firma de la función, y el selector se comprueba contra la firma antes de decodificar. Si el selector no coincide, obtienes un error en lugar de basura.

¿Cuál es la diferencia entre abi.encode y abi.encodePacked?

abi.encode sigue las reglas estándar anteriores y rellena cada valor hasta 32 bytes, por lo que se puede decodificar. abi.encodePacked concatena los valores con su ancho mínimo, sin relleno ni desplazamientos; es más corto pero ambiguo y no se puede decodificar sin conocer los tipos. Esta herramienta implementa solo la codificación estándar.

¿Admite errores personalizados y eventos?

Las reglas de codificación son idénticas, así que puedes codificar o decodificar datos de error con la firma del error. Los logs de eventos son distintos: los parámetros no indexados se codifican en ABI en el campo data, así que decodifica esa parte con una firma que contenga solo los tipos no indexados.