Configurando entorno + Capture The Ether (Hardhat, Metamask y varios)
09 May 2022
Tiempo de lectura ~12 minutos
En este primer posteo, lo que haremos será:
- Crear un proyecto con Hardhat
- Conectar nuestra cuenta de Metamask con Hardhat.
- Resolver un desafío de CTE con nuestro entorno ya listo.
1. Hardhat
¿Qué es?
Hardhat es un entorno de trabajo blockchain que nos facilitará el desarrollo de Pruebas de Concepto (En inglés PoC) mediante ayudas tales como una blockchain local, ejecución de tests, scripts y más. En otras palabras, una caja de herramientas para hacer nuestro trabajo más amigable.
Instalación
Primero debemos inicializar nuestro proyecto con npm init
. Una vez creado, dentro del mismo ejecutamos.
npm i -D hardhat @nomiclabs/hardhat-ethers @nomiclabs/hardhat-waffle @types/mocha @types/chai @types/node chai ethereum-waffle ethers ts-node typescript
npm i dotenv
i
Refiere a Install.-D
Indica que es una dependencia de desarrollo (no es necesario que quien vaya a utilizar nuestra app las use).
Con Hardhat instalado, pasaremos a crear nuestro primer proyecto. Ejecutamos npx hardhat
y se nos aparecerá un menú como este.
Como verán, la opción que eligiremos será Create an advanced sample project that uses Typescript ¿Por qué? Siento que es mejor acostumbrarse a utilizar typescript desde el inicio. Es una ventaja que nos ayuda a preveer inconvenientes y solucionarlos fácilmente. Sin embargo, para no quitarte la sonrisa, podemos simplificar nuestro proyecto eliminando los siguientes archivos (tranquile, mantendré todo lo más sencillo posible) .eslintignore
.eslintrc.js
.npmignore
.prettierignore
.prettierrc
.solhint.json
.solhintignore
README.md
Pese a ello, recomiendo a aquelles que sean o apunten a convertirse en desarrolladores, echar un vistazo a los archivos de arriba (solhint.json en particular). Podrían encontrarle mucha utilidad 😉
¡Sigamos!
Solo nos restan 2 cosas para terminar nuestra configuración de Hardhat. Lo primero, será copiar este archivo de configuración y reemplazarlo por el que teníamos (de nada amigue). La segunda y no menos complicada, será copiar este otro gist y reemplazarlo por el ya existente .env.example (cambiando el nombre a .env solo). Sin embargo, nuestro .env tendrá información que vamos a querer mantener privada: API Key de Alchemy + Mnemonic. Así que expliquemos un poco ambas.
API KEY Alchemy
Para no tener que hostear un nodo que se comunique con la blockchain que querramos, podemos utilizar nodos hosteados por otra persona o grupo. Dentro de estos seres de luz se encuentra Alchemy, que nos provee un nodo completo, lo que será importante para tareas futuras.
Simplemente nos creamos una cuenta y en el panel principal, damos click en CREATE APP.
Creamos la aplicación en nuestro panel.
Una vez creada, damos click en VIEW KEY (bien a la derecha del renglón donde se muestra la nueva app creada). La copiamos y pegamos en nuestro .env en la sección correspondiente.
Mnemonic
Cuando hablamos de mnemonic, nos estamos refiriendo a lo que probablemente hayas leído o escuchado como “frase semilla” o “seed phrase” si pintó el inglés. No es la gran ciencia, son solo una serie de palabras generadas de forma aleatoria para proteger una cuenta o dirección (por eso es importante no compartirlas con nadie). Con esta información nos alcanza. Mantengamos las cosas simples.
Para generar un mnemonic, podemos utilizar ésta página. Elegimos generar un mnemonic de 12 palabras, damos click en GENERATE y voilà, ¡Tenemos nuestro mnemonic! (Con rojo en la siguiente imagen)
Lo colocamos en nuestro .env en la sección correspondiente y listorti.
Finalmente, nunca está de más revisar que nuestro .gitignore incluya nuestro .env. Solo por si las moscas 😊
2. Conectar Metamask
Este paso es sumamente sencillo. Podés poner a calentar la pava para esos buenos matemáticos mientras conectás al zorrito naranja de la siguiente manera.
Instalación
Buscá y descargá la extensión de Metamask para tu navegador preferido. Una vez que la tengas, abrila y seleccioná la opción de Importar cartera. Dentro, pega el mnemonic que creaste en el paso anterior.
Creá una contraseña y aceptá los términos y condiciones (no sin antes leerlos rufián). Ahora que tenemos Metamask, necesitamos no solo ver la red de Ethereum (también llamada mainnet), si no también las redes de prueba (testnet). Para ello hacemos click en la red (rectángulo verde) –> Show/Hide y activamos la opción Show test networks.
Ahora, al dar click en el logo circular ubicado a la derecha de la red, podemos ir a la configuración de Metamask. Dentro de ella, hacemos el caminito de: Redes –> Localhost –> Identificador de cadena –> Cambiamos el 1337 por 31337
Si me seguiste al pie de la letra, ya estás en condiciones de digievolucionar. Abrí una consola a la altura de nuestro proyecto, y ejecutá el comando.
npx hardhat node
Si todo está en orden, al cambiar de Red Ethereum a Localhost en Metamask, deberías poder ver cómo tu cuenta coincide con la Account 0 listada.
¿Qué indica esto? Que la conexión Hardhat-Metamask ya está hecha. ¡Felicitaciones! Andá por esos merecidos materiales.
3. Hora de probar todo con CTE
¿Qué es Capture The Ether (CTE)?
Capture The Ether es un juego que presenta una serie de desafíos relacionados a seguridad blockchain. Para jugar primero debemos ir a su página web. Dentro, se nos pedirá que conectemos nuestra cuenta Metamask y que cambiemos la red a Ropsten.
Tal vez no lo sepas, pero existen varias redes de prueba. Al momento de escribir este posteo, este juego utiliza la red de Ropsten, aunque también existen otras como Rinkeby, Kovan o Goerli, por ejemplo. Dicho esto, debo confesarte algo: necesitarás Ether dentro de esta red Ropsten para jugar.
Amado amigue, necesitas Ether. ¿Dónde conseguirlo? No puedo decirte. ¿Cómo continuarás? No puedes saberlo. Pero puedo decirte algo, cada vez que escuches al viento, susurrará Bengala y la rep…
¡Mentira! Todavía no insultes a ningún familiar mío. Si bien a veces es complicado conseguir Ether en redes de prueba, siempre se puede conseguir algo siguiendo instrucciones en algún faucet como Paradigm o Egorfine. Sin embargo, recomiendo MUCHO interactuar con gente y manguear algunos ETH. ¿Por qué? Ni idea, pero hablar con los demás siempre es bueno 😏
Ok. Ya tenés tus Ether mangueados, ¿Y ahora? Solo resta divertirse con el dinero ajeno. Hora de resolver un desafío en CTE.
Atenti: A continuación resolveremos el desafío número 3 del juego. Estaría buenísimo que pudieras resolver los otros 2 por tu propia cuenta. La página está en inglés pero son bastante cortitos (no dije fáciles ni difíciles). Confío en vos tanto como confía la gente en los términos y condiciones de Whatsapp.
Nivel 3: Choose a nickname
Al entrar al nivel, nos encontraremos con el siguiente código
Ahora:
- Copiamos el código mencionado en un archivo Nickname.sol dentro del directorio contracts
- Creamos un archivo nickname.ts dentro de la carpeta test. Este será el test que correremos para solucionar el desafío.
ALERTA SPOILER: Si querés investigar por tu cuenta cómo utilizar el entorno para resolver los desafíos, este es un excelente momento para que lo hagas. A continuación voy a explicar cómo interactuar con todo lo que hemos configurado para resolver el desafío 3, por lo que indefectiblemente, tendré que mostrar la solución del problema.
Desglocémoslo de a poco
- Para los test siempre (o casi siempre) utilizaremos ethers js para conectar con la red Ethereum, mocha como framework para tests y chai como librería de aserción.
- Arriba de todo, ubicaremos las variables globales que vayamos a utilizar, indicando su tipo. En este caso tendremos un contrato tipo Contract (no me digas 😋).
- La sección beforeEach es un bloque de código que se ejecutará antes de cada test. Nos servirá para generar un estado por defecto o precondición. En esta ocasión, no es realmente necesario debido a que solo tenemos una prueba, pero no es un mal momento para saber cómo armar una buena estructura. Acá, la precondición que vamos a generar es la de tener a nuestra disposición el contrato CaptureTheEther para poder invocar su función de setNickname, y para ello utilizaremos el plugin de hardhat con ethers js. Con él, podemos usar el método getContractFactory, que tomará el contrato que tenga el nombre indicado en su argumento (en este caso “CaptureTheEther”) y nos creará un objeto ContractFactory. Este, nos permite utilizar el método attach, al cual podemos pasarle la dirección del contrato que queremos traernos. Genial, ¿No? (Si no lo decís vos, lo digo yo: Gracias hardhat-ethers).
- Parte final.
- describe: Sección que contiene uno o más tests. Recibe como primer parámetro un nombre representativo de lo que se va a testear, y como segundo la función que contendrá los tests a correr. Es una buena idea que este segundo parámetro sea una función asíncrona (le clavamos el async adelante).
- it: El test en sí. Recibe como primer parámetro el nombre del test y como segundo el bloque de código a probar.
- Invocando función setNickname.
- ¿Desde qué cuenta se llama a la función? Bueno, ¿Te acordás cuando al correr
npx hardhat node
Hardhat nos mostró como 20 cuentas? Ethers va a usar la primera de todas, es decir, nuestra Account 0. En otro momento, tal vez necesitemos invocar funciones de contratos desde otras cuentas, pero no te preocupes, eso es problema de tu yo del futuro. - ¿Await? Las transacciones no ocurren al instante. Por eso es necesario esperar y mantener un orden. Paciencia muchache…
- ¿formatBytes32String? Si te fijás, en el código propuesto por el juego, la función setNickname recibe por parámetro un nickname de tipo bytes32. Así como muchos lenguajes, solidity también tiene sus tipos (esto no es javascript papi). Con el tiempo aprenderás todos, no son muchos pero hay algunas trampitas. Sin embargo no estamos soles en esta lucha, ethers nos va a echar una mano muchas veces con sus métodos dentro de utils, por ejemplo. A medida que avanzemos, te va a servir muchísimo leer su documentación, que podés encontrarla acá por cierto.
- expect: Necesitamos tener la certeza de que nuestro test logró su cometido. Con expect podemos ver si nuestro resultado es el esperado.
- ¿Desde qué cuenta se llama a la función? Bueno, ¿Te acordás cuando al correr
¡Listo, estamos a punto de terminar! Ya tenemos todo lo necesario para completar el nivel, solo restan 3 pasitos más: 1) Activar el nivel 2) Correr nuestro test localmente y 3) Correr el test en la red de Ropsten.
Activar el nivel
Solo basta con entrar al nivel en la página del juego, dar click al botón de Begin Challenge y esperar que termine la creación del nivel (metamask dará un aviso de transacción confirmada)
Correr nuestro test localmente
¿Ves la dirección donde está el contrato de tu desafío? La marqué en verde.
Si le dás click, algo maravilloso pasará: entrarás al explorador de bloques de la red Ropsten. Los exploradores de bloques tienen muchas utilidades. Nosotros simplemente queremos conocer el bloque en el que se creó nuestro desafío, lo cual podemos observar al entrar al apartado Internal Txns
Lo copiamos y lo pegamos como valor de blockNumber en nuestro hardhat.config.ts. ¿Qué ganamos con esto? Principalmente acelerar la velocidad hasta 20 veces más. Hardhat utiliza este bloque como “bloque fijo” para poder crear una especie de memoria caché en disco con la información referida a la blockchain. Para ello le es imprescindible contar con un nodo completo como el que elegimos anteriormente de Alchemy (todo va conectándose poco a poco, ¿viste?). Así que eso, estaremos constantemente cambiando el blockNumber desafío a desafío. ¡No te olvides!
Ya con el blockNumber establecido, corremos nuevamente npx hardhat node
, mientras que en otra consola, ejecutamos el test con
npx hardhat test .\test\nickname.ts --network localhost
--network
Sirve para especificar la red en la que queremos correr nuestro test.
Deberíamos observar nuestro test funcionando correctamente.
Dato de color, si revisamos la consola en la que levantamos la blockchain local con hardhat (sí, esa del npx hardhat node
), podemos observar cómo llegó la transacción y se “minó” sin inconvenientes.
Correr el test en la red de Ropsten
No es nada distinto a lo que hicimos anteriormente, solo hay que cambiar de objetivo. Como ya tenemos configurada nuestra red Ropsten en hardhat.config.ts, lo hacemos de la siguiente forma
npx hardhat test .\test\nickname.ts --network ropsten
Finalizado el test, puedes dar click en el botón de Check solution y disfrutar de tus 200 puntos y un nombre que quedará en la historia.
¡Y eso fue todo! Las configuraciones siempre son tediosas (o al menos para mí), así que si llegaste hasta acá, quiero que sepas que acabás de aprender M U C H Í S I M O. Algunos temas no fueron explicados al detalle simplemente por ser un post enfocado en “configurar para comenzar”, así que si te gusta entender a fondo cómo funcionan las cosas, espero que los siguientes posteos sean de tu agrado.
Que tengas buen día, no te alteres :)
bengalaQ