Saltar al contenido
0%

¿Qué es un ABI de un smart contract?

Alchemy team headshot

Escrito por Alchemy

Publicado el 9 de marzo de 20223 min de lectura

La Application Binary Interface (ABI) de un smart contract le da al contrato la capacidad de comunicarse e interactuar con aplicaciones externas y otros smart contracts. Recibir datos de fuentes externas puede ser fundamental para cumplir los objetivos de la aplicación y del usuario.

En el desarrollo web tradicional, el intercambio de datos ocurre entre aplicaciones y servidores a través de API's (Application Program Interface). Los servidores actúan como fuentes centralizadas de información que envían datos a la aplicación cuando se solicitan.

En una blockchain, no existe esa centralización de datos. Los nodos funcionan esencialmente como servidores y los smart contracts son funciones "alojadas" on-chain. Las aplicaciones fuera de la blockchain (y otros smart contracts) necesitan una forma de comunicarse con los smart contracts que están on-chain. Aquí es donde entra en juego el ABI.

¿Por qué ABI?

Antes de entrar en más detalles sobre qué es el ABI, conviene entender por qué existe.

Los smart contracts son las aplicaciones centrales de la EVM (Ethereum Virtual Machine). El propósito de los smart contracts es ejecutar transacciones cuando se cumplen ciertas condiciones definidas en el contrato. Estas condiciones pueden ser eventos tanto on-chain como off-chain. Los smart contracts se escriben en lenguajes de alto nivel como Solidity, pero se almacenan en la EVM como bytecode ejecutable, es decir, en formato binario.

Diagrama de código de contrato inteligente almacenado en la EVM como bytecode ejecutable
EVM como bytecode ejecutable

Dado que este bytecode no es legible para humanos, requiere interpretación para poder entenderlo. El ABI le permite a cualquier persona que escriba un smart contract comunicarse entre una aplicación web escrita en un lenguaje de alto nivel como Javascript y el bytecode que entiende la EVM.

¿Qué es un ABI?

Al igual que su prima en Web2, la API, el ABI actúa como un selector de funciones, definiendo los métodos específicos que se pueden invocar en un smart contract para su ejecución. Estos métodos específicos y sus tipos de datos asociados se listan en un archivo JSON RPC generado.

Diagrama de una ABI actuando como selector de funciones para métodos de contratos inteligentes
Selector de funciones de la ABI

A diferencia de una API, no podemos simplemente enviar una solicitud directamente en formato JSON a un smart contract y esperar una respuesta, ya que un contrato solo se comunica en bytecode. Para traducir esto en algo que la EVM entienda, esta información se codifica mediante ABI encoding. Estas codificaciones incluyen firmas de función y declaraciones de variables, de modo que la EVM sepa exactamente qué función ejecutar dentro del smart contract.

Ejemplo de codificación ABI traduciendo una llamada de función a bytecode de la EVM
Codificación ABI

Las respuestas también están en bytecode, por lo que se requiere interpretación antes de que una aplicación web pueda procesarlas. La ventaja de usar bytecode en la respuesta es que también podemos esperar cierta estructura al llamar a una función de un contrato.

¿Cómo usar el ABI?

Generación

Si estás usando herramientas como Hardhat/Truffle o un IDE como Remix, el ABI del contrato se genera automáticamente. También puedes crear el ABI manualmente usando el paquete NPM del compilador de Solidity. Después de instalar el paquete, puedes ejecutar el comando 'solcjs contractname.sol --abi' en una terminal. Esto generará un archivo .abi si se ejecuta correctamente.

Ahora que tienes un ABI generado, veamos algunos de los elementos de este archivo:

Ejemplo de un archivo JSON de ABI de contrato inteligente generado
ABI de contrato generada

Ejecución

Dado que el ABI funciona como intérprete entre el bytecode de la EVM y el Javascript de un sitio web, es necesario siempre que se quiera ejecutar cualquier función de un smart contract. Además del ABI, se requiere la dirección del contrato en la blockchain. Aquí hay un pequeño fragmento de código Javascript que muestra cómo se hace esto:

Fragmento de JavaScript ejecutando una función de contrato usando su ABI y dirección
Ejecución de ABI

Si te interesa encontrar el ABI de un contrato ya desplegado, puedes buscarlo en Etherscan usando la dirección del contrato. Por ejemplo aquí:

Página de contrato en Etherscan mostrando la ABI de un contrato ya desplegado
ABI de un contrato ya desplegado

Codificación

Dado que toda la comunicación se hace en bytecode, sería difícil esperar que los desarrolladores codifiquen estos mensajes por su cuenta. Por suerte, compiladores populares como Remix también pueden encargarse de la codificación por ti. Estas codificaciones siguen un patrón determinado, así que se puede entender mejor qué está pasando revisando la Especificación ABI.

Los primeros cuatro bytes son la firma de la función, que indica qué tipo de función del smart contract se está ejecutando. Un identificador de función popular es a9059cbb, que indica que se trata de una transferencia ERC20. Existe un directorio de base de datos de firmas de función donde puedes explorar más.

Ejemplos de hashes de firmas de funciones ABI, incluyendo el selector de transfer de ERC20
Hashes de funciones ABI

A partir del quinto byte en adelante es donde se codifican los argumentos. Las respuestas siguen una estructura similar, pero sin incluir la firma de la función.

Conclusión

El ABI a menudo puede ser un aspecto que se pasa por alto al trabajar con smart contracts, pero cumple un rol importante en la usabilidad de esta tecnología. Practicar con tutoriales de smart contracts es una excelente manera de entender el poder de este trabajador silencioso y de aplicar lo aprendido.

Background gradient

Construye magia blockchain

Alchemy combina los productos y herramientas de desarrollo Web3 más potentes con recursos, comunidad y un soporte legendario.