Deployando un contrato en Testnet 2 de StarkNet

dub.zn
Starknet en español
4 min readNov 22, 2022

No es un secreto que la Testnet de StarkNet no está funcionando de la mejor manera últimamente, el tráfico elevado trae como consecuencia largos tiempos a la hora de deployar y utilizar nuestros contratos. Debido a este problema, StarkNet lanzó la TestNet 2 para los desarrolladores.

Soy un desarrollador Cairo construyendo y aprendiendo sobre el ecosistema en general, entonces esto es una fricción cuando quiero probar los contratos implementados. Como todo esto es muy reciente, no pude encontrar alguna documentación/guía oficial de cómo hacer esto, por lo que en esta publicación voy a explicar paso a paso cómo pude deployar un contrato en la Testnet 2 utilizando comandos en una terminal.

Para ir directo al grano, voy a asumir que tienen instalado lo básico para desarrollar en Cairo. (psst: Setting up the environment).

1. Configurando la cuenta de StarkNet

Para interactuar con StarkNet, necesitamos deployar una cuenta (contrato). Para empezar, debemos tener dos variables de entornos que serán utilizadas por los comandos de StarkNet:

Es posible también especificar un nombre para la cuenta que vayamos a crear/utilizar usando --account=my_account si es que deseas mantener múltiples cuentas. Si este campo no es especificado entonces se usará la cuenta por defecto llamada __default__.

# En tu terminal primero declaramos las variables de entorno
export STARKNET_NETWORK=alpha-goerli2
export STARKNET_WALLET=starkware.starknet.wallets.open_zeppelin.OpenZeppelinAccount

# Luego ejecutamos el comando para crear la cuenta
starknet new_account

# Si queremos crear una cuenta y luego utilizarla,
# debemos recordar que en cada comando debemos utilizar el flag --account=account_name
# para referirnos a una cuenta especificamente.
starknet new_account --account=account_name
# Output
Account address: 0x78d796e87cfa496bffad27be9ed42f2709bd6e32a6366f842fdf38664a1412d
Public key: ...
Move the appropriate amount of funds to the account, and then deploy the account
by invoking the 'starknet deploy_account' command.

NOTE: This is a modified version of the OpenZeppelin account contract. The signature is computed
differently.

Ahora debemos transferir fondos a la dirección de la cuenta que obtuvimos como output. En mi caso transferí 0.05 Goerli ETH a la dirección (El monto puede variar, pero este paso es obligatorio o no seremos capaces de avanzar).

¿No tienes fondos en una cuenta de Testnet 2? Te dejo unos links que me ayudaron a resolver esto 😄.

⚠️ Idealmente en esta parte debemos primero obtener Goerli ETH en una cuenta creada en Testnet 1, luego transferirla por medio del contrato proxy a la cuenta en la Tesnet 2.

2. Deployando la cuenta

Una vez que transferimos el Goerli ETH y pudimos confirmar que la transacción se realizó con éxito, podemos continuar deployando la cuenta creada previamente.

# El flag --account=account_name es opcional aqui, 
# si no especificamos una cuenta, utilizará __default__ por defecto.
starknet deploy_account
# Output
Sent deploy account contract transaction.

Contract address: ...
Transaction hash: ...

⚠️ Podemos ver los datos de las cuentas creadas en el siguiente archivo: ~/.starknet_accounts/starknet_open_zeppelin_accounts.json

3. Compilar el contrato

# El archivo 'contract.cairo' es un nombre de ejemplo, 
# debería ser el path al contrato que deseamos deployar
starknet-compile contract.cairo --output contract_compiled.json --abi contract_abi.json

Si todo salió bien, entonces se debieron generar dos archivos en nuestro workspace.

El archivo ABI contiene una lista de todas las funciones que podemos llamar y sus inputs esperados.

4. Declarar el contrato en la Testnet 2 de StarkNet

Ejecuta el siguiente comando para declarar el ‘contract class’ en la Testnet 2 de StarkNet.

# El flag --account=account_name es opcional aqui, 
# si no especificamos una cuenta, utilizará __default__ por defecto.
starknet declare --contract contract_compiled.json
# Output
Declare transaction was sent.
Contract class hash: 0x1e2208b571b2cb68908f37a196ed5e391c8933a6db23bb3939acedee40d9b8a
Transaction hash: 0x762e166dd3326b2e263eb5bcfdccd225dc88e067fdf7c92cf8ce5e4ea01f9f1

Podemos ver el class hash de tu nuevo contrato. El class hash es un dato necesario para deployar una instancia del contrato utilizando el deploy system call.

5. Deployando el contrato en la Testnet de Starknet

Ejecutamos el siguiente comando para deployar el contrato en la Testnet 2 (debes reemplazar $CLASS_HASH con el class hash obtenido cuando ejecutamos el comando starknet declare)

# El flag --account=account_name es opcional aqui, 
# si no especificamos una cuenta, utilizará __default__ por defecto.

# Si nuestro contrato no tiene parametros en el constructor
starknet deploy --class_hash $CLASS_HASH2
# El flag --account=account_name es opcional aqui, 
# si no especificamos una cuenta, utilizará __default__ por defecto.

# Si nuestro contrato no tiene parametros en el constructor
starknet deploy --class_hash $CLASS_HASH --inputs input1 input2..

# [EJEMPLO]
# Este constructor tiene dos parametros llamados 'owner' y 'url'
# entonces cuando deployemos nuestro contrato:
@constructor
func constructor{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}(owner: felt, url: felt) {
ERC1155_initializer(url);
Ownable.initializer(owner);
return ();
}

# En este caso, el comando para deployar será el siguiente
starknet deploy --class_hash $CLASS_HASH --inputs owner_value url_value
# Si todo salió bien, el output de nuestro deploy será el siguiente
Invoke transaction for contract deployment was sent.
Contract address: 0x039564c4f6d9f45a963a6dc8cf32737f0d51a08e446304626173fd838bd70e1c
Transaction hash: 0x125e4bc5251af8ee2664ea0d1495b36c593f25f78f1a78f637a3f7aafa9e22

Ingresando a https://goerli-2.voyager.online/contract/{contract_address} podremos ver e interactuar con nuestro contrato deployado 💙.

La información presentada fue obtenida de la documentación oficial de StarkNet:

Dejo una pequeña aclaración, este documento puede contener errores dado que no soy un experto. Pero siguiendo estos pasos, fui capaz de deployar un contrato en la Testnet 2.

La finalidad de este documento es ayudar a otros developers, espero te haya sido de utilidad, hasta la próxima! 🤓

🐤 Twitter: https://twitter.com/dub_zn

--

--