En este taller, aprenderás a crear un smart contract simple en Starknet, implementar funciones públicas, eventos y acceder a contratos externos.
Después de completar cada paso, ejecuta el script asociado para verificar que se haya implementado correctamente.
Utiliza el Cairo book y la Documentación de Starknet como referencia.
- Clona este repositorio.
- Crea un nuevo archivo llamado
counter.cairo
dentro de la carpetasrc
. - Remueve del .gitignore la linea que excluye src/counter.cairo.
- Copia el siguiente código en el archivo.
#[starknet::contract]
mod Counter {
#[storage]
struct Storage {}
}
Nota: Trabajarás en el archivo
counter.cairo
para completar los requisitos de cada paso. El archivoprev_solution.cairo
aparecerá en pasos futuros como una forma de ponerte al día con el taller si te quedas atrás. No modifiques ese archivo.
Los siguientes pasos de configuración dependerán de si prefieres usar Docker para gestionar dependencias globales o no.
- Instala Scarb 2.6.3 (instrucciones).
- Instala Starknet Foundry 0.20.0 (instrucciones).
- Instala la extensión Cairo 1.0 para VSCode (marketplace).
- Ejecuta los tests para verificar que el proyecto esté configurado correctamente.
scarb test
- Asegúrate de que Docker esté instalado y en funcionamiento.
- Instala la extensión Dev Containers para VSCode (marketplace).
- Lanza una instancia de VSCode dentro del contenedor yendo a Ver -> Paleta de comandos -> Dev Containers: Reconstruir y reabrir en contenedor.
- Abre el terminal integrado de VSCode y ejecuta los tests para verificar que el proyecto esté configurado correctamente.
scarb test
Nota: Todos los comandos mostrados a partir de este punto asumirán que estás utilizando el terminal integrado de una instancia de VSCode ejecutándose dentro del contenedor. Si quieres ejecutar los tests en un terminal diferente, necesitarás usar el comando
docker compose run test
.
Crea una rama step1
para habilitar los tests de verificación para esta sección.
git checkout -b step1 origin/step1
O Simplemente cambia de rama a step1
si ya la tienes creada.
git checkout step1
En este paso, necesitarás hacer lo siguiente:
- Almacenar una variable llamada
counter
como tipou32
en la estructuraStorage
. - Implementar la función del constructor que inicializa la variable
counter
con un valor de entrada dado. - Implementar una función pública llamada
get_counter()
que devuelva el valor de la variablecounter
.
- La función
get_counter()
debe estar dentro de la interfaz del contrato llamadaICounter
.
Nota: Cualquier otro nombre dado a la interfaz del contrato rompería el test, ¡asegúrate de tener el nombre correcto!
Cuando completes, ejecuta la suite de tests para verificar que has cumplido con todos los requisitos de esta sección.
scarb test
- Las variables de Storage son la forma más común de interactuar con el almacenamiento de tu contrato. Puedes leer más sobre esto en el Capítulo 12.3.1 - Storage de Contratos.
- La función del constructor es un tipo especial de función que se ejecuta solo una vez. Puedes leer más sobre esto en el Capítulo 12.3.2 - Función de Constructor.
- Para crear una interfaz de contrato, necesitarás definir un trait con el nombre
ICounter
(de lo contrario, los tests fallarán) y marcar el trait con el atributo[starknet::interface]
. Puedes leer más sobre esto en el Capítulo 12.5 Interfaces. - La función
get_counter()
solo debería poder leer el estado del contrato y no modificarlo. Puedes leer más sobre esto en el Capítulo 12.3.2 - Funciones de Lectura.
Crea una rama step2
para habilitar los tests de verificación para esta sección.
git checkout -b step2 origin/step2
O Simplemente cambia de rama a step2
si ya la tienes creada.
git checkout step2
Si te quedaste atrás, el archivo prev_solution.cairo
contiene la solución al paso anterior.
Implementa una función llamada increase_counter()
que pueda incrementar el valor actual del counter
en 1
cada vez que se invoque.
Cuando completes, ejecuta la suite de tests para verificar que has cumplido con todos los requisitos de esta sección.
scarb test
- La función
increase_counter()
debe ser capaz de modificar el estado del contrato (también llamada una función externa) y actualizar el valor decounter
dentro deStorage
. Puedes leer más sobre esto en el Capítulo 12.3.2 - Funciones Externas.
Crea una rama step3
para habilitar los tests de verificación para esta sección.
git checkout -b step3 origin/step3
O Simplemente cambia de rama a step3
si ya la tienes creada.
git checkout step3
Si te quedaste atrás, el archivo prev_solution.cairo
contiene la solución al paso anterior.
En este paso, necesitarás hacer lo siguiente:
- Importar la interfaz del contrato
KillSwitch
a tu proyecto. - Almacenar una variable llamada
kill_switch
como tipoIKillSwitchDispatcher
enStorage
. - Actualizar la función del constructor para recibir una variable de entrada adicional con el tipo
ContractAddress
. - Actualizar la función del constructor para inicializar la variable
kill_switch
con la nueva variable de entrada añadida. Ten en cuenta que necesitas usarIKillSwitchDispatcher
que espera unContractAddress
como su tipo.
Nota: Analiza el código de
KillSwitch
para entender la interfaz y la estructura del contrato desde aquí. Esto ya está añadido como una dependencia en tu archivoScarb.toml
.
Cuando completes, ejecuta la suite de tests para verificar que has cumplido con todos los requisitos de esta sección.
scarb test
- Necesitas importar
Dispatcher
yDispatcherTrait
del contrato KillSwitch. Estos despachadores son creados y exportados automáticamente por el compilador. Puedes encontrar más información sobre el Despachador de Contratos en el Capítulo 12.5.2 - Despachador de Contratos. - En el constructor, puedes actualizar la variable
kill_switch
conIKillSwitchDispatcher { contract_address: ??? }
, que espera la dirección del contrato externo.
Nota: Si deseas desplegar el contrato
Counter
, puedes usar la siguiente dirección del contratoKillSwitch
desplegado.Goerli
Dirección del Contrato:
0x033b2c899fd8f89e3e1d5b69c4d495f1018a1dbb8c19b18795c2e16b078da34d
Sepolia
Dirección del Contrato:
0x048fd89591a02ee84a9080bf014889892c5600d2253b3d2da17fb37629b64f2f
Crea una rama step4
para habilitar los tests de verificación para esta sección.
git checkout -b step4 origin/step4
O Simplemente cambia de rama a step4
si ya la tienes creada.
git checkout step4
Si te quedaste atrás, el archivo prev_solution.cairo
contiene la solución al paso anterior.
Implementa el mecanismo KillSwitch
en la función increase_counter()
llamando a la función is_active()
del contrato KillSwitch
.
- Si la función
is_active()
del contrato KillSwitch devuelvetrue
, entonces permite queincrease_counter()
incremente el valor. - Si la función
is_active()
del contrato KillSwitch devuelvefalse
, entonces devuelve sin incrementar el valor.
Cuando completes, ejecuta la suite de tests para verificar que has cumplido con todos los requisitos de esta sección.
scarb test
- Puedes acceder a la función
is_active()
desde tu variablekill_switch
. Usa esto para crear la lógica en la funciónincrease_counter()
.
Crea una rama step5
para habilitar los tests de verificación para esta sección.
git checkout -b step5 origin/step5
O Simplemente cambia de rama a step5
si ya la tienes creada.
git checkout step5
Si te quedaste atrás, el archivo prev_solution.cairo
contiene la solución al paso anterior.
En este paso, necesitarás hacer lo siguiente:
- Implementar un evento llamado
CounterIncreased
que emita el valor actual delcounter
. - Emitir este evento cuando la variable
counter
haya sido incrementada exitosamente.
Cuando completes, ejecuta la suite de tests para verificar que has cumplido con todos los requisitos de esta sección.
scarb test
- Los eventos son estructuras de datos personalizadas que son emitidas por un contrato. Puedes encontrar más información sobre Eventos en el Capítulo 12.3.3 - Eventos de Contratos.
Crea una rama step6
para habilitar los tests de verificación para esta sección.
git checkout -b step6 origin/step6
O Simplemente cambia de rama a step6
si ya la tienes creada.
git checkout step6
Si te quedaste atrás, el archivo prev_solution.cairo
contiene la solución al paso anterior.
Verifica que hayas creado correctamente un contrato de cuenta para Starknet ejecutando la suite completa de tests:
scarb test
Si la suite de tests pasa, felicidades, has creado tu primer Contrato Inteligente de Contador en Starknet.