Cómo Crear un Smart Contract en Ethereum: Guía 2024

27/11/2024

Valoración: 4.07 (3752 votos)

El universo de la blockchain ha evolucionado a un ritmo vertiginoso en los últimos años. Términos como DeFi (Finanzas Descentralizadas), DEX (Exchange Descentralizado) y DAO (Organización Autónoma Descentralizada) inundan las conversaciones, pero detrás de todas estas innovaciones se encuentra una tecnología fundamental: los smart contracts o contratos inteligentes. Comprender cómo funcionan es la clave para desentrañar el potencial de la Web3. Esta guía te llevará desde los conceptos más básicos hasta la creación de un contrato funcional en la red de Ethereum, el ecosistema más grande para aplicaciones descentralizadas.

Índice de contenido

¿Qué es Exactamente un Smart Contract?

Imagina un contrato tradicional, como el de alquiler de una vivienda. Este acuerdo depende de la confianza entre las partes y, a menudo, de intermediarios como abogados o notarios para garantizar su cumplimiento. Un smart contract es la versión digital y autoejecutable de este acuerdo. Es, en esencia, un programa informático que reside en la blockchain. Sus reglas y condiciones están escritas en código, y una vez que se cumplen esas condiciones predefinidas, el contrato se ejecuta automáticamente sin necesidad de intermediarios. Al vivir en la blockchain, sus transacciones son inmutables, transparentes y rastreables, lo que lo convierte en una herramienta increíblemente poderosa para generar confianza y automatizar procesos.

How does blockchain work step by step for beginners?
HOW DOES BLOCKCHAIN WORK? , Step 1 – Record the transaction. A blockchain transaction shows the movement of physical or digital assets from one party to another in the blockchain network. ... , Step 2 – Gain consensus. ... , Step 3 – Link the blocks. ... , Step 4 – Share the ledger.

Además de ejecutar lógica, un smart contract puede almacenar datos (conocidos como variables de estado) directamente en la blockchain y gestionar la transferencia de activos digitales, como criptomonedas y tokens. Esto abre un abanico de posibilidades ilimitado, desde sistemas de votación descentralizados hasta loterías automáticas y complejos instrumentos financieros.

Primeros Pasos: Preparando el Entorno de Desarrollo

La mejor forma de entender un smart contract es construyendo uno. Para este tutorial, crearemos un caso de uso práctico: un sistema para registrar credenciales educativas en la blockchain, garantizando su autenticidad y evitando fraudes. Antes de escribir una sola línea de código, necesitamos configurar nuestro entorno.

  • Remix IDE: Es un entorno de desarrollo integrado (IDE) basado en la web, diseñado específicamente para escribir, compilar, desplegar y probar smart contracts en Solidity (el lenguaje de programación de Ethereum). No requiere instalación, solo necesitas acceder a su web.
  • MetaMask: Es una billetera de criptomonedas que funciona como una extensión del navegador. Nos permitirá interactuar con la red Ethereum, gestionar nuestras cuentas y pagar las "tasas de gas" necesarias para desplegar y ejecutar los contratos.
  • Goerli Testnet: Desplegar contratos en la red principal de Ethereum (mainnet) cuesta dinero real (Ether). Para aprender y experimentar, usaremos una red de prueba o "testnet" como Goerli. Funciona exactamente igual que la red principal, pero utiliza Ether de prueba que se puede obtener de forma gratuita a través de "faucets" (grifos).

Creando Nuestro Primer Contrato: Almacén de Credenciales Educativas

El objetivo es almacenar un registro que verifique la autenticidad de un título universitario. No queremos guardar la información personal del estudiante directamente en la blockchain por dos razones cruciales: el alto costo de almacenamiento y la privacidad. La blockchain pública es visible para todos. En su lugar, almacenaremos el hash del documento. Un hash es una huella digital única de longitud fija generada a partir de los datos. Si un solo carácter del documento cambia, el hash será completamente diferente. Esto nos permite verificar la autenticidad sin exponer la información original.

A continuación, el código de nuestro contrato, que llamaremos EduCredentialsStore.sol:

// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract EduCredentialsStore { // Mapeo para almacenar el hash (bytes32) y el número de bloque donde se guardó (uint) mapping (bytes32 => uint) private proofs; // Dirección de la cuenta que despliega el contrato address public owner; // Evento para notificar al frontend cuando se almacena una credencial event CredentialStored(address indexed storedBy, bytes32 indexed proofHash, uint blockNumber); constructor() { owner = msg.sender; } // Función para generar el hash de un documento function getProofFor(string calldata document) private pure returns (bytes32) { return sha256(bytes(document)); } // Función externa para almacenar la credencial function storeEduCredentials(string calldata document) external { // Solo el propietario del contrato puede llamar a esta función require(msg.sender == owner, "Solo el propietario puede almacenar credenciales."); bytes32 proof = getProofFor(document); // Asegurarse de que no ha sido almacenado previamente require(proofs[proof] == 0, "Esta credencial ya ha sido registrada."); proofs[proof] = block.number; emit CredentialStored(msg.sender, proof, block.number); } // Función pública para verificar si una credencial existe function checkEduCredentials(string calldata document) public view returns (uint) { bytes32 proof = getProofFor(document); return proofs[proof]; } }

Desglosando el Código

  • pragma solidity ^0.8.0;: Indica al compilador la versión de Solidity para la que está escrito el código.
  • contract EduCredentialsStore { ... }: Define el cuerpo de nuestro contrato.
  • mapping (bytes32 => uint) private proofs;: Un mapping es similar a un diccionario o tabla hash. Aquí, lo usamos para asociar un hash (la clave) con el número de bloque en el que se almacenó (el valor). Se declara private para que solo se pueda acceder desde dentro del contrato.
  • address public owner;: Una variable de estado para guardar la dirección de la billetera que desplegó el contrato.
  • constructor() { ... }: Una función especial que se ejecuta solo una vez, en el momento del despliegue del contrato. Aquí la usamos para asignar la dirección del creador (msg.sender) a la variable owner.
  • storeEduCredentials(): La función principal para guardar el registro. Es external, lo que significa que solo puede ser llamada desde fuera del contrato. Incluye una validación con require() para restringir su uso solo al propietario.
  • checkEduCredentials(): Una función public y view que permite a cualquiera verificar si un documento es auténtico. Al ser view, solo lee datos de la blockchain y no modifica nada, por lo que su llamada no consume gas.

Compilación y Despliegue con Remix

Una vez que tienes el código en Remix, el siguiente paso es compilarlo. En la pestaña "Solidity Compiler", activa la opción "Auto compile". Si no hay errores, verás un tic verde. En este punto, Remix genera dos elementos cruciales:

  • ABI (Application Binary Interface): Un archivo JSON que describe cómo interactuar con el contrato: sus funciones, los parámetros que aceptan y lo que devuelven. Es esencial para que las aplicaciones frontend (como una página web) puedan llamar al contrato.
  • Bytecode: Es la versión del contrato compilada en un formato que la Máquina Virtual de Ethereum (EVM) puede entender y ejecutar. Esto es lo que realmente se despliega en la blockchain.

Para desplegarlo:

  1. Ve a la pestaña "Deploy & Run Transactions".
  2. En "ENVIRONMENT", selecciona "Injected Provider - MetaMask". Esto conectará Remix con tu billetera. Asegúrate de que MetaMask esté en la red Goerli.
  3. Haz clic en el botón "Deploy". MetaMask se abrirá pidiéndote que confirmes la transacción y pagues el gas.
  4. Una vez confirmada, tu contrato estará vivo en la testnet y aparecerá en la sección "Deployed Contracts" de Remix, listo para interactuar.

Interactuando y Mejorando el Contrato

En Remix, ahora puedes usar las funciones. Si intentas llamar a storeEduCredentials desde una cuenta que no es la propietaria, la transacción fallará gracias a nuestra sentencia require(). Sin embargo, cualquiera puede llamar a checkEduCredentials para verificar un documento.

Aceptando Pagos en Ether

¿Y si quisiéramos cobrar una pequeña tarifa por el servicio de verificación? Podemos modificar nuestro contrato para que acepte pagos en Ether. Para ello, usamos la palabra clave payable.

Modifiquemos la función checkEduCredentials:

function checkEduCredentials(string calldata document) public payable returns (uint) { require(msg.value >= 0.001 ether, "Se requiere un pago de al menos 0.001 ETH."); bytes32 proof = getProofFor(document); return proofs[proof]; } 

Ahora, para llamar a esta función, el usuario deberá enviar al menos 0.001 Ether junto con la transacción. El Ether recibido se almacenará en el balance del propio contrato. Para poder retirarlo, necesitaríamos añadir otra función, como withdraw(), que transfiera los fondos a la cuenta del propietario.

El Siguiente Nivel: Tokens ERC-20

Los smart contracts no solo manejan la criptomoneda nativa de la red (Ether), sino que también pueden crear y gestionar sus propios activos digitales: los tokens. El estándar más común para tokens fungibles (intercambiables entre sí, como el dinero) en Ethereum es el ERC-20.

Crear un token desde cero es complejo, pero gracias a librerías como las de OpenZeppelin, podemos hacerlo de forma segura y sencilla. OpenZeppelin proporciona implementaciones auditadas y seguras de los estándares más comunes.

How to develop smart contracts on Ethereum?
After you've created your free Ethereum endpoint, copy your HTTP Provider endpoint: We'll deploy our contract on the Ropsten testnet. To get started, you will need the Metamask browser extension to create an ETH wallet and some test ETH, which you can get by going to the Ropsten faucet.

Creando un Token Básico

En Remix, crea un nuevo archivo llamado MyToken.sol:

// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.0.0/contracts/token/ERC20/ERC20.sol"; contract MyToken is ERC20 { constructor(uint256 initialSupply) ERC20("My Awesome Token", "MAT") { _mint(msg.sender, initialSupply * (10 ** decimals())); } } 

¡Y ya está! Este simple contrato hereda toda la funcionalidad de un token ERC-20 del contrato de OpenZeppelin. Al desplegarlo, debes proporcionar un suministro inicial. El constructor le asigna un nombre ("My Awesome Token"), un símbolo ("MAT") y acuña (crea) el suministro inicial en la billetera del desplegador.

Integrando Pagos con Tokens

Ahora, podemos modificar nuestro contrato EduCredentialsStore para que, en lugar de Ether, acepte nuestro nuevo token MAT como pago. Esto requiere un flujo de dos pasos para el usuario:

  1. Aprobación (Approve): El usuario primero debe llamar a la función approve() en el contrato del token, autorizando al contrato EduCredentialsStore a gastar una cierta cantidad de sus tokens.
  2. Transferencia (TransferFrom): Luego, cuando el usuario llama a nuestra función de pago en EduCredentialsStore, este último utiliza la función transferFrom() del contrato del token para mover los fondos aprobados desde la cuenta del usuario a la suya.

Este mecanismo es fundamental en el ecosistema DeFi y permite que diferentes smart contracts interactúen entre sí de forma segura.

Preguntas Frecuentes (FAQ)

¿Qué es el "gas" en Ethereum?

El gas es la unidad que mide la cantidad de trabajo computacional requerido para ejecutar operaciones en la red Ethereum. Cada operación (desde una simple suma hasta almacenar datos) tiene un costo fijo en gas. La "tasa de gas" es lo que pagas en Ether para que los mineros/validadores procesen tu transacción. Es como la gasolina para un coche: necesitas pagar para que la red funcione.

¿Puedo modificar un smart contract una vez desplegado?

No. Los smart contracts en Ethereum son inmutables por diseño. Una vez desplegado, su código no puede ser alterado. Esta es una característica de seguridad clave. Si se necesita actualizar la lógica, se debe desplegar un nuevo contrato y migrar los datos y usuarios al nuevo, un proceso que debe planificarse cuidadosamente.

¿Es seguro almacenar datos sensibles en la blockchain?

No se deben almacenar datos personales o sensibles sin cifrar en una blockchain pública como Ethereum. Toda la información es visible para cualquiera. La práctica recomendada es almacenar solo hashes o pruebas criptográficas de los datos, manteniendo la información original fuera de la cadena (off-chain).

¿Qué es OpenZeppelin y por qué debería usarlo?

OpenZeppelin es una organización que proporciona un framework de contratos inteligentes seguros, auditados y probados por la comunidad. Usar sus implementaciones para estándares como ERC-20 o ERC-721 ahorra tiempo, reduce el riesgo de introducir vulnerabilidades y te permite construir sobre una base sólida y confiable.

Conclusión

Hemos viajado desde la definición de un smart contract hasta la creación de un caso de uso práctico, su despliegue en una red de prueba y la integración con tokens ERC-20. Este es solo el comienzo. Los smart contracts son los ladrillos con los que se está construyendo la próxima generación de internet, una web más descentralizada, transparente y controlada por los usuarios. Con las herramientas y conocimientos adecuados, tú también puedes ser un arquitecto de este nuevo futuro digital.

Si quieres conocer otros artículos parecidos a Cómo Crear un Smart Contract en Ethereum: Guía 2024 puedes visitar la categoría Criptomonedas.

Subir