Cairo es un lenguaje inspirado en Rust que se compila en bytecode, el cual se ejecuta en la Cairo Virtual Machine. La máquina virtual de Cairo es una máquina virtual de conocimiento cero (ZKVM) que puede ejecutar cualquier programa de Cairo. A diferencia de Solidity, que está diseñado específicamente solo para contratos inteligentes, Cairo es un lenguaje de programación de propósito general diseñado para crear programas demostrables (provable programs).
Esta serie de tutoriales se centra en el uso de Cairo para contratos inteligentes en Starknet. No asumimos experiencia previa con Rust o pruebas de conocimiento cero. Sin embargo, esta serie de tutoriales asume experiencia previa con Solidity. Esperamos que el lector sepa cómo programar un ERC-20 y un ERC-721 y tenga una idea conceptual de cómo funcionan dApps como Uniswap V2.
Cairo ha sido cuidadosamente diseñado para ayudar a los desarrolladores de Solidity a aprender el lenguaje rápidamente, y esta serie destaca sus similitudes para que los desarrolladores de Solidity puedan reutilizar los modelos mentales adquiridos con Solidity para entender rápidamente Cairo.
Empezando con Cairo
Para empezar a escribir contratos inteligentes en Cairo, necesitarás Scarb (el administrador de paquetes y herramienta de construcción de Cairo) y Starknet Foundry (un conjunto de herramientas para desarrollar, desplegar y probar contratos inteligentes en Cairo).
Instalación
Para instalar estas herramientas, usa starkup, que automáticamente instala asdf y luego lo utiliza para instalar Scarb, Starknet Foundry y el compilador de Cairo en un solo comando. Abre tu terminal e introduce el siguiente comando:
curl --proto '=https' --tlsv1.2 -sSf https://sh.starkup.dev | sh
Una vez que se complete la instalación, reinicia tu terminal o ejecuta:
source ~/.bashrc # or source ~/.zshrc if using zsh
Verifica las instalaciones:
scarb --version
snforge --version
Deberías ver una salida similar a:

Creando tu primer proyecto
Crea un directorio vacío solo con letras minúsculas y guiones bajos (por ejemplo, hello_world). Evita letras mayúsculas o guiones medios (-), ya que los nombres de los paquetes de Scarb deben seguir la convención snake_case.
Navega al directorio, luego ejecuta:
scarb init
Cuando se te solicite, selecciona Starknet Foundry (default) de la lista de opciones.

Esto crea un contrato simple de Cairo que almacena y actualiza un único valor de balance (similar al contrato Counter predeterminado de Foundry para Solidity).
Estructura del proyecto
Cuando abras el proyecto en tu editor de código, verás la siguiente estructura de proyecto:
hello_world/
├── src/
│ └── lib.cairo # Your main contract code
├── tests/
│ └── test_contract.cairo # Test files go here
├── Scarb.toml # Project configuration and dependencies
├── Scarb.lock # Lock file for exact dependency versions
├── snfoundry.toml # Starknet Foundry configuration
└── .gitignore # Git ignore file
src/es donde viven los archivos del contrato.lib.cairoes el punto de entrada principal; por defecto, Scarb genera un contratoHelloStarknetsimple para administrar el balance.tests/contiene los archivos de prueba para verificar la funcionalidad del contrato.Scarb.tomldefine las dependencias del proyecto, la versión del compilador de Cairo, los metadatos del paquete y la configuración de compilación (similar apackage.jsonen Node.js oCargo.tomlen Rust). Aquí es donde gestionas qué bibliotecas usa tu contrato.Scarb.lockregistra las versiones exactas de las dependencias.snfoundry.tomlconfigura los ajustes de Starknet Foundry: endpoints RPC, configuraciones de cuentas y opciones de ejecución de pruebas. Mientras queScarb.tomlgestiona tu proyecto y sus dependencias,snfoundry.tomlconfigura las herramientas de Foundry.
Configurando el resaltado de sintaxis
Si utilizas VS Code o un fork del mismo, instala la extensión Cairo 1.0 para el resaltado de sintaxis. Una vez instalada, VS Code reconocerá los archivos .cairo y proporcionará funciones como el autocompletado y el resaltado de errores. Ten en cuenta que las extensiones falsas de VSCode son una táctica común de ingeniería social, así que verifica dos veces al editor.

Abre src/lib.cairo para ver el código generado por Scarb. Explicaremos la sintaxis en el siguiente capítulo.

Para compilar tu contrato, ejecuta:
scarb build
Esto compila tu código de Cairo y genera los archivos del contrato compilados en el directorio target/. Estos archivos son los que desplegarás en Starknet.
Luego puedes probar el proyecto con:
scarb test
Conceptos de Cairo similares a Solidity
Los contratos inteligentes en Cairo tienen un concepto de “variables de almacenamiento” que admite los tipos a los que los desarrolladores de Solidity están acostumbrados, como enteros, cadenas, mapeos, arrays, booleanos, y demás.
Los siguientes conceptos tienen análogos 1-1 o casi 1-1 en Solidity:
- variables de almacenamiento y ranuras de almacenamiento
- emisión de eventos
- funciones public, internal y view
- declaraciones require
msg.sender,block.timestampyblock.number- constructor
- interfaces para declarar funciones external
- los contratos pueden llamar a otros contratos y usar una ABI para saber cómo llamarlos
- los contratos pueden crear otros contratos
- las transacciones cuestan “gas” para desincentivar el spam
- OpenZeppelin sirve como la “biblioteca estándar” de facto para el lenguaje
Diferencias clave con Solidity
Los contratos en Cairo tienen las siguientes capacidades y/o diferencias en comparación con Solidity:
- Cairo admite hashmaps en memoria (Solidity solo admite mapeos en el almacenamiento)
- Los arrays en memoria de Solidity deben tener un tamaño definido en el momento en que se declaran, pero Cairo no tiene esta restricción
- Cairo tiene una sintaxis de flujo de control mucho más expresiva que hereda de Rust (como el pattern matching)
- Al igual que Rust, Cairo no está orientado a objetos y por lo tanto no soporta la herencia. Sin embargo, Cairo proporciona otras formas de componer código en conjunto
- Los contratos de Solidity se actualizan a través de patrones proxy; sin embargo, los contratos de Cairo pueden actualizar su bytecode manteniendo el almacenamiento intacto
- No hay un “token nativo” en Cairo y por ende no hay
msg.value. Por defecto, el gas se paga usando el token STRK, que es un token ERC-20. Puedes ver el token en el explorador aquí. - Starknet tiene account abstraction integrada en el protocolo, por lo que no existe el concepto de una “Externally Owned Address (EOA)”
El último punto puede causar cierta confusión para los desarrolladores que provienen de cadenas compatibles con la EVM, pero no te preocupes, exploraremos esto en gran detalle más adelante.
Creación de Cuentas en Starknet
Para entender el ciclo de vida de la creación de una cuenta en Starknet, puedes crear una billetera usando la billetera Ready (anteriormente Argent) o Braavos. El siguiente video muestra el proceso de creación de una billetera Ready usando la extensión del navegador.
Después de instalar la billetera, ten en cuenta que se configura por defecto en mainnet. Para este tutorial, cambia a la testnet de Sepolia haciendo clic en el selector de red en la parte superior de tu billetera Ready y eligiendo “Sepolia”. Luego, crea una cuenta nueva en Sepolia siguiendo el proceso que se muestra en el video a continuación:
A continuación, copia la dirección de tu billetera y pégala en un explorador de bloques de Starknet. Puedes usar Starkscan o Voyager. Asegúrate de cambiar el explorador también a la testnet de Sepolia (en la parte superior derecha de la página).
Dado que es una billetera recién creada sin historial de transacciones, el explorador aún no mostrará ningún resultado.

Para empezar a realizar transacciones, necesitamos tokens STRK para cubrir las comisiones de gas. Ve al Faucet de Starknet, pega la dirección de tu billetera y solicita tokens de testnet.
Método 1 para inicializar una cuenta: Enviar una transacción
Una cuenta de Starknet se inicializa enviando su primera transacción. A diferencia de Ethereum, donde las Externally Owned Accounts (EOAs) existen como simples pares de claves pública-privada sin código de contrato on-chain, las cuentas de Starknet son contratos inteligentes. Sin embargo, estos contratos de cuenta no se despliegan por defecto cuando generas la dirección de tu billetera. Una forma de desplegarlos es enviando tu primera transacción. En ese momento, Starknet despliega automáticamente el contrato de cuenta y ejecuta tu transacción en un solo paso.
Enviémonos 1 STRK a nosotros mismos desde la billetera para iniciar esto:
Ahora, pega nuevamente tu dirección en la búsqueda del explorador. Verás que se ha desplegado un contrato en la dirección de tu billetera. Esta primera transacción desplegó automáticamente el contrato de tu cuenta, como se muestra en la siguiente imagen:

Método 2 para inicializar una cuenta: Desplegar directamente la billetera inteligente
Alternativamente, puedes desplegar el contrato de cuenta directamente. Después de recibir tokens STRK en tu billetera, verás una opción para desplegar el contrato de la cuenta. El GIF de Ready a continuación ilustra esto en mainnet (el proceso es el mismo para Sepolia):

Starknet no tiene EOAs
En Starknet, no hay EOAs. Cada dirección tiene bytecode y almacenamiento.
Entonces, ¿cómo distinguimos entre un contrato inteligente (como una aplicación DeFi) y un contrato destinado a mantener “nuestros fondos”?
Los contratos destinados a servir como billeteras deben implementar un trait (interfaz) particular conocido como SNIP-6. Discutiremos esto en detalle en un tutorial posterior, pero por ahora basta decir que un contrato SNIP-6 debe implementar una función __execute__, que es la forma en que recibe sus instrucciones de un usuario.
Aquí está la distinción:
En Ethereum, una clave privada se utiliza para derivar una dirección de Ethereum, a la que otros contratos inteligentes pueden referirse como una cuenta.
En Starknet, las claves privadas no se convierten en una dirección. Más bien, se usan para la autenticación al llamar al comando __execute__.
Esta es otra distinción importante entre Ethereum y Starknet. En Ethereum, el entorno de ejecución valida la firma criptográfica de la transacción de la billetera. En Starknet, la billetera con la función __execute__ puede utilizar cualquier método de autenticación que desee, esto significa que Starknet puede soportar características como passkeys y métodos de autenticación de criptografía resistente a nivel cuántico sin necesidad de un hard fork. Todo lo que se requiere es programar la cuenta del contrato inteligente para que soporte el algoritmo criptográfico deseado.
La “dirección de Starknet” que se muestra en tu billetera es la dirección del contrato inteligente (“counterfactual address” si el contrato aún no existe). Cuando la aplicación de la billetera (el software off-chain en tu dispositivo) genera tu frase semilla, deriva una clave privada y predice dónde se desplegará el contrato posteriormente. La billetera te muestra esta dirección predicha como tu “dirección” por conveniencia, aunque el contrato no exista on-chain hasta que lo inicialices.
No es posible que tu “billetera” (el software off-chain) “posea” nada en Starknet. A diferencia de Ethereum, donde las firmas prueban la propiedad directamente, Starknet requiere un contrato inteligente on-chain para mantener los activos. La aplicación de tu billetera simplemente crea firmas que el contrato de tu billetera on-chain verifica antes de ejecutar transacciones (como enviar tokens o llamar a otros contratos). Exploraremos este concepto con mayor detalle en un capítulo posterior sobre account abstraction.
Cuidado con las versiones anteriores de Cairo
Al momento de escribir este artículo, la versión actual de Cairo es la 2.13.1. Ten en cuenta que las búsquedas en internet y las consultas a LLMs a menudo devuelven código escrito para Cairo 1.x o versiones anteriores (0.x), las cuales son incompatibles con Cairo 2.x. La sintaxis ha cambiado significativamente entre versiones, por lo que el código de versiones anteriores no funcionará. Siempre verifica la versión de Cairo al copiar ejemplos de código.
Técnicas de prompting si te atascas
Al igual que otros lenguajes diseñados para blockchain, Cairo no tiene una presencia web tan significativa como lenguajes como JavaScript o Python.
- Para solucionar problemas de compilación, pregunta cómo resolver el problema en Rust. El 80% de los problemas de compilación que encontrarás probablemente serían el mismo problema de compilación si escribieras el código en Rust.
- Scarb es muy similar al cargo de Rust. Si encuentras problemas con Scarb, haz una búsqueda en internet con tu mensaje de error usando “cargo” en lugar de Scarb para aumentar tus posibilidades de encontrar una solución relevante.
En el próximo capítulo, escribiremos nuestro primer programa en Cairo.
Este artículo es parte de una serie de tutoriales sobre Programación en Cairo en Starknet