Saltar al contenido principal

Contrato inteligente Hola Mundo para principiantes

Solidity
Hardhat
Alchemy
contratos inteligentes
despliegue
Principiante
elanh
31 de marzo de 2021
13 minutos de lectura

Si eres nuevo en el desarrollo de cadenas de bloques y no sabes por dónde empezar, o si simplemente quieres entender cómo desplegar e interactuar con contratos inteligentes, esta guía es para ti. Te guiaremos en la creación y el despliegue de un contrato inteligente simple en la red de prueba Sepolia utilizando una billetera virtual MetaMask (se abre en una pestaña nueva), Solidity (se abre en una pestaña nueva), Hardhat (se abre en una pestaña nueva) y Alchemy (se abre en una pestaña nueva) (no te preocupes si aún no entiendes qué significa todo esto, te lo explicaremos).

Una vez que tu contrato esté desplegado, puedes crear una interfaz de usuario para él.

Si tienes preguntas en cualquier momento, ¡no dudes en comunicarte en el Discord de Alchemy (se abre en una pestaña nueva)!

Paso 1: Conectarse a la red Ethereum

Hay muchas formas de hacer solicitudes a la cadena de Ethereum. Para simplificar, usaremos una cuenta gratuita en Alchemy, una plataforma para desarrolladores de cadenas de bloques y API que nos permite comunicarnos con la cadena de Ethereum sin tener que ejecutar nuestros propios nodos. La plataforma también cuenta con herramientas de desarrollo para monitoreo y análisis que aprovecharemos en este tutorial para entender qué sucede internamente en el despliegue de nuestro contrato inteligente. Si aún no tienes una cuenta de Alchemy, puedes registrarte gratis aquí (se abre en una pestaña nueva).

Paso 2: Crear tu aplicación (y clave API)

Una vez que hayas creado una cuenta de Alchemy, puedes generar una clave API creando una aplicación. Esto nos permitirá hacer solicitudes a la red de prueba Sepolia. Si no estás familiarizado con las redes de prueba (testnets), consulta esta página.

  1. Navega a la página "Create new app" (Crear nueva aplicación) en tu panel de Alchemy seleccionando "Select an app" (Seleccionar una aplicación) en la barra de navegación y haciendo clic en "Create new app"

Hello world create app

  1. Nombra tu aplicación "Hello World", ofrece una breve descripción y elige un caso de uso, por ejemplo, "Infra & Tooling". A continuación, busca "Ethereum" y selecciona la red.

create app view hello world

  1. Haz clic en "Next" (Siguiente) para continuar, luego en "Create app" (Crear aplicación) ¡y eso es todo! Tu aplicación debería aparecer en el menú desplegable de la barra de navegación, con una clave API disponible para copiar.

Paso 3: Crear una cuenta de Ethereum (dirección)

Necesitamos una cuenta de Ethereum para enviar y recibir transacciones. Para este tutorial, usaremos MetaMask, una billetera virtual en el navegador que se utiliza para administrar la dirección de tu cuenta de Ethereum. Más información sobre transacciones.

Puedes descargar MetaMask y crear una cuenta de Ethereum de forma gratuita aquí (se abre en una pestaña nueva). Cuando estés creando una cuenta, o si ya tienes una, asegúrate de cambiar a la red de prueba "Sepolia" usando el menú desplegable de redes (para que no estemos lidiando con dinero real).

Si no ves Sepolia en la lista, abre el menú en la esquina superior derecha, selecciona "Networks" (Redes) y activa "Show test networks" (Mostrar redes de prueba) en la parte inferior de la lista de redes (consulta la guía de MetaMask para ver redes de prueba (se abre en una pestaña nueva)). Luego selecciona "Sepolia" en el menú de selección de red.

metamask sepolia example

Paso 4: Añadir ether desde un faucet

Para desplegar nuestro contrato inteligente en la red de prueba, necesitaremos algo de ETH falso. Para obtener ETH de Sepolia, puedes ir a los detalles de la red Sepolia para ver una lista de varios faucets. Si uno no funciona, prueba con otro, ya que a veces pueden quedarse sin fondos. Algunos faucets tienen reglas de elegibilidad; por ejemplo, el faucet de Sepolia de Alchemy requiere que la dirección receptora tenga al menos 0.001 ETH en la red principal de Ethereum. Puede tomar algún tiempo recibir tu ETH falso debido al tráfico de la red. ¡Deberías ver ETH en tu cuenta de MetaMask poco después!

Paso 5: Comprobar tu saldo

Para verificar que nuestro saldo esté ahí, hagamos una solicitud eth_getBalance usando la herramienta composer de Alchemy (se abre en una pestaña nueva). Esto devolverá la cantidad de ETH en nuestra billetera. Después de ingresar la dirección de tu cuenta de MetaMask y hacer clic en "Send Request" (Enviar solicitud), deberías ver una respuesta como esta:

{ "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" }

NOTA: Este resultado está en Wei, no en ETH. Wei se utiliza como la denominación más pequeña de ether. La conversión de Wei a ETH es: 1 eth = 1018 Wei. Así que si convertimos 0x2B5E3AF16B1880000 a decimal obtenemos 5*10¹⁸, lo que equivale a 5 ETH.

¡Uf! Nuestro dinero falso está todo ahí .

Paso 6: Inicializar nuestro proyecto

Primero, necesitaremos crear una carpeta para nuestro proyecto. Navega a tu línea de comandos y escribe:

mkdir hello-world
cd hello-world

Ahora que estamos dentro de la carpeta de nuestro proyecto, usaremos npm init para inicializar el proyecto. Si aún no tienes npm instalado, sigue las instrucciones de instalación de Node.js (se abre en una pestaña nueva) (necesitaremos Node.js y npm para este tutorial).

npm init

Realmente no importa cómo respondas a las preguntas de instalación, aquí te mostramos cómo lo hicimos como referencia:

Aprueba el archivo package.json. Hardhat 3, que instalaremos a continuación, solo admite proyectos de módulos ES, así que marca el proyecto como tal:

npm pkg set type=module

¡Y ya estamos listos para continuar!

Paso 7: Descargar Hardhat (se abre en una pestaña nueva)

Hardhat es un entorno de desarrollo para compilar, desplegar, probar y depurar tu software de Ethereum. Ayuda a los desarrolladores a construir contratos inteligentes y aplicaciones descentralizadas (dapps) localmente antes de desplegarlos en la cadena en vivo.

Hardhat 3 requiere Node.js v22.13.0 o posterior. Dentro de nuestro proyecto hello-world ejecuta:

npm install --save-dev hardhat

Consulta esta página para obtener más detalles sobre las instrucciones de instalación (se abre en una pestaña nueva).

Paso 8: Crear un proyecto de Hardhat

Ejecutar npx hardhat --init generaría un proyecto de muestra completo, pero para este tutorial configuraremos las cosas a mano para que puedas ver cada pieza. En la raíz de la carpeta de tu proyecto, crea un archivo llamado hardhat.config.js con el siguiente contenido:

import { defineConfig } from "hardhat/config"

export default defineConfig({
  solidity: "0.8.34",
})

Aquí es donde especificaremos toda la configuración de nuestro proyecto (en el paso 13). Por ahora, solo le dice a Hardhat qué versión del compilador de Solidity usar.

Paso 9: Añadir carpetas del proyecto

Para mantener nuestro proyecto organizado, crearemos dos carpetas nuevas. Navega al directorio raíz de tu proyecto en tu línea de comandos y escribe:

mkdir contracts
mkdir scripts
  • contracts/ es donde guardaremos el archivo de código de nuestro contrato inteligente hola mundo.
  • scripts/ es donde guardaremos los scripts para desplegar e interactuar con nuestro contrato.

Paso 10: Escribir nuestro contrato

Puede que te estés preguntando, ¿cuándo diablos vamos a escribir código? Bueno, aquí estamos, en el paso 10.

Abre el proyecto hello-world en tu editor favorito (a nosotros nos gusta VSCode (se abre en una pestaña nueva)). Los contratos inteligentes están escritos en un lenguaje llamado Solidity, que es el que usaremos para escribir nuestro contrato inteligente HelloWorld.sol.‌

  1. Navega a la carpeta "contracts" y crea un nuevo archivo llamado HelloWorld.sol
  2. A continuación se muestra un contrato inteligente de muestra de Hola Mundo de la Fundación Ethereum que usaremos para este tutorial. Copia y pega el contenido a continuación en tu archivo HelloWorld.sol, y asegúrate de leer los comentarios para entender qué hace este contrato:

Este es un contrato inteligente súper simple que almacena un mensaje al momento de su creación y puede actualizarse llamando a la función update.

Paso 11: Conectar MetaMask y Alchemy a tu proyecto

Hemos creado una billetera MetaMask, una cuenta de Alchemy y hemos escrito nuestro contrato inteligente, ahora es el momento de conectar los tres.

Cada transacción enviada desde tu billetera virtual requiere una firma utilizando tu clave privada única. Para proporcionar a nuestro programa este permiso, podemos almacenar de forma segura nuestra clave privada (y la clave API de Alchemy) en un archivo de entorno.

Para obtener más información sobre el envío de transacciones, consulta la documentación de transacciones.

Crea un archivo .env en el directorio raíz de nuestro proyecto y añade tu clave privada de MetaMask y la URL HTTP de la API de Alchemy.

get alchemy api key

Copia la URL de la API de Alchemy

Tu archivo .env debería verse así:

API_URL="https://eth-sepolia.g.alchemy.com/v2/your-api-key"
PRIVATE_KEY="your-metamask-private-key"

Para conectar realmente estos elementos a nuestro código, haremos referencia a estas variables en nuestro archivo hardhat.config.js en el paso 13. Node.js puede leer archivos .env por sí solo, por lo que no hay ningún paquete adicional que instalar.

¡No hagas commit de .env! Asegúrate de nunca compartir ni exponer tu archivo .env con nadie, ya que al hacerlo estás comprometiendo tus secretos. Si estás utilizando un control de versiones, añade tu .env a un archivo gitignore.

Paso 12: Instalar Ethers.js

Ethers.js es una biblioteca que facilita la interacción y la realización de solicitudes a Ethereum al envolver los métodos estándar de JSON-RPC con métodos más fáciles de usar.

Hardhat hace que sea súper fácil integrar Plugins (se abre en una pestaña nueva) para herramientas adicionales y funcionalidad extendida. Aprovecharemos el plugin de Ethers (se abre en una pestaña nueva) para el despliegue de contratos (Ethers.js (se abre en una pestaña nueva) tiene algunos métodos de despliegue de contratos súper limpios).

En el directorio de tu proyecto escribe:

npm install --save-dev @nomicfoundation/hardhat-ethers ethers

También añadiremos el plugin a nuestro hardhat.config.js en el siguiente paso.

Paso 13: Actualizar hardhat.config.js

Hemos añadido varias dependencias y plugins hasta ahora, ahora necesitamos actualizar hardhat.config.js para que nuestro proyecto sepa de todos ellos.

Actualiza tu hardhat.config.js para que se vea así:

configVariable le dice a Hardhat que lea cada valor de una variable de entorno solo cuando sea necesario, por lo que comandos como compile funcionan incluso antes de que se establezcan los valores. Si prefieres no mantener tu clave privada en un archivo de texto sin formato, Hardhat también puede leer variables de configuración desde un almacén de claves cifrado (se abre en una pestaña nueva).

Paso 14: Compilar nuestro contrato

Para asegurarnos de que todo funciona hasta ahora, compilemos nuestro contrato. La tarea compile es una de las tareas integradas de Hardhat.

Desde la línea de comandos ejecuta:

npx hardhat compile

La primera vez que compilas, Hardhat descarga el compilador de Solidity. Luego deberías ver algo como Compiled 1 Solidity file with solc 0.8.34. Si no es así, siempre puedes enviar un mensaje en el Discord de Alchemy (se abre en una pestaña nueva).

Paso 15: Escribir nuestro script de despliegue

Ahora que nuestro contrato está escrito y nuestro archivo de configuración está listo, es hora de escribir nuestro script de despliegue del contrato.

Navega a la carpeta scripts/ y crea un nuevo archivo llamado deploy.js, añadiendo el siguiente contenido:

Repasemos qué hace cada una de estas líneas de código.

const { ethers } = await network.create()

En Hardhat 3, un script abre una conexión a una red explícitamente. network.create() se conecta a la red que elijas con la opción --network cuando ejecutas el script, y el plugin hardhat-ethers añade un objeto ethers a esa conexión.

const HelloWorld = await ethers.getContractFactory("HelloWorld")

Un ContractFactory en Ethers.js es una abstracción utilizada para desplegar nuevos contratos inteligentes, por lo que HelloWorld aquí es una fábrica para instancias de nuestro contrato hola mundo. Al usar el plugin hardhat-ethers, las instancias de ContractFactory y Contract están conectadas al primer firmante por defecto.

const hello_world = await HelloWorld.deploy("Hello World!")

Llamar a deploy() en un ContractFactory iniciará el despliegue y devolverá una Promise que se resuelve en un Contract. Este es el objeto que tiene un método para cada una de las funciones de nuestro contrato inteligente. Los argumentos que pasas a deploy() van al constructor del contrato, aquí el mensaje inicial.

waitForDeployment() espera hasta que la transacción de despliegue se incluya en un bloque, y getAddress() devuelve la dirección del nuevo contrato. Consulta la documentación de contratos de Ethers.js (se abre en una pestaña nueva) para obtener más detalles.

Paso 16: Desplegar nuestro contrato

¡Finalmente estamos listos para desplegar nuestro contrato inteligente! Navega a la línea de comandos y ejecuta:

npx hardhat run scripts/deploy.js --network sepolia

Luego deberías ver algo como:

Contract deployed to address: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570

Si vamos al Etherscan de Sepolia (se abre en una pestaña nueva) y buscamos la dirección de nuestro contrato, deberíamos poder ver que se ha desplegado con éxito. La transacción se verá algo así:

etherscan contract

La dirección From (De) debería coincidir con la dirección de tu cuenta de MetaMask y la dirección To (Para) dirá "Contract Creation" (Creación de contrato), pero si hacemos clic en la transacción veremos la dirección de nuestro contrato en el campo To:

etherscan transaction

¡Felicidades! Acabas de desplegar un contrato inteligente en la cadena de Ethereum 🎉

Para entender qué está sucediendo internamente, puedes mirar las solicitudes que recibió tu aplicación "Hello World" en tu panel de Alchemy (se abre en una pestaña nueva).

Allí verás un puñado de llamadas JSON-RPC que Hardhat/Ethers hizo internamente por nosotros cuando llamamos a la función .deploy(). Dos importantes a destacar aquí son eth_sendRawTransaction, que es la solicitud para escribir realmente nuestro contrato en la cadena Sepolia, y eth_getTransactionByHash, que es una solicitud para leer información sobre nuestra transacción dado el hash (un patrón típico al enviar transacciones). Para obtener más información sobre el envío de transacciones, consulta la documentación de transacciones.

Eso es todo por este tutorial. A continuación, puedes crear una interfaz de usuario para tu contrato.