Apuntes sobre Cripto

Cuando uno enseña, dos aprenden.

Smart Contracts en profundidad

Introducción: Del Libro Mayor al Código Ejecutable

En las lecciones anteriores vimos cómo Bitcoin creó un libro de cuentas digital descentralizado. Ethereum dio el siguiente paso lógico: si podemos mantener un registro compartido de transacciones sin intermediarios, ¿por qué no podemos ejecutar también programas completos de forma descentralizada?

Un Smart Contract (contrato inteligente) es, en esencia, un programa informático que vive en la blockchain y se ejecuta automáticamente cuando se cumplen ciertas condiciones. Pero a diferencia de cualquier aplicación tradicional que ejecutas en tu ordenador o en un servidor, un Smart Contract tiene tres propiedades únicas:

  1. Autonomía: Una vez desplegado, el contrato ejecuta su lógica automáticamente cuando alguien lo invoca, sin necesidad de aprobación de terceros. No hay un "administrador" que deba dar permiso para que funcione. Sin embargo, alguien tiene que llamar a sus funciones (hacer el "trigger"). El contrato no se despierta solo y dice "hoy voy a ejecutarme". Es como un cajero automático: funciona 24/7 sin supervisión humana, pero necesitas meter la tarjeta para que haga algo.
  2. Inmutabilidad: El código no puede modificarse después de publicarse en la blockchain.
  3. Gestión nativa de valor: Puede recibir, custodiar y transferir dinero (ETH o tokens) de forma programada.

La Analogía de la Máquina Expendedora

La mejor forma de entender un Smart Contract es compararlo con una máquina expendedora:

Vendedor humano tradicional:

  • Tú pides un producto
  • El vendedor decide si te lo vende
  • Podría cambiar el precio caprichosamente
  • Podría quedarse con tu dinero y no darte nada
  • Necesitas confiar en él

Máquina expendedora (Smart Contract):

  • Introduces monedas → el código verifica el importe
  • Si es correcto → el mecanismo libera el producto automáticamente
  • Las reglas están "programadas" y no pueden cambiar
  • No hay intermediario humano que pueda hacer trampa
  • No necesitas confiar en nadie, solo en que la máquina funciona

Un Smart Contract es exactamente eso: una máquina expendedora digital que ejecuta reglas predefinidas de forma automática e imparable.


¿Cómo Funciona un Smart Contract? (Nivel Conceptual)

Componentes Básicos

Todo Smart Contract tiene tres elementos fundamentales:

1. Estado Interno (Variables) El contrato puede almacenar información permanentemente en la blockchain. Por ejemplo:

  • Saldos de usuarios
  • Configuración del protocolo
  • Registros históricos
  • Listas de participantes

2. Funciones (Lógica de Ejecución) Son las "acciones" que el contrato puede realizar:

  • Funciones públicas: cualquiera puede llamarlas
  • Funciones restringidas: solo ciertos usuarios pueden ejecutarlas
  • Funciones de solo lectura: consultan información sin modificar nada

3. Eventos (Señales) El contrato puede emitir "señales" cuando ocurre algo importante:

  • "Se ha realizado una transferencia"
  • "Se ha creado una nueva propuesta de votación"
  • "Se ha liquidado un préstamo"

Estas señales quedan registradas en la blockchain y permiten que aplicaciones externas (como interfaces web) se enteren de lo que está pasando.

La Dirección del Contrato

Cuando despliegas un Smart Contract en Ethereum, este recibe su propia dirección (como 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb), exactamente igual que una wallet normal. La diferencia es que detrás de esa dirección no hay un humano con una clave privada, sino código ejecutándose.

Puedes:

  • Enviarle dinero (ETH o tokens) → el contrato lo recibe y lo custodia
  • Llamar a sus funciones → el código se ejecuta y modifica su estado
  • Consultar su información pública → leer variables sin modificarlas

Ejemplo Real Paso a Paso: Crowdfunding Descentralizado

Imaginemos un proyecto que quiere recaudar fondos para desarrollar una aplicación. El problema con plataformas tradicionales como Kickstarter: cobran comisiones, pueden censurar proyectos, y los creadores deben esperar semanas para recibir el dinero. Con un Smart Contract, todo es automático y transparente.

Funcionamiento del Contrato de Crowdfunding:

Paso 1: Despliegue del contrato El creador despliega un contrato con estas reglas programadas:

  • "Objetivo: recaudar 100 ETH"
  • "Plazo: 30 días desde hoy"
  • "Si se alcanza el objetivo → los fondos van al creador"
  • "Si NO se alcanza → cada contribuyente puede retirar su dinero"

Paso 2: Los usuarios contribuyen

  • Alice envía 5 ETH al contrato
  • Bob envía 10 ETH
  • Carol envía 2 ETH
  • El contrato registra internamente: contribuciones[Alice] = 5 ETH, contribuciones[Bob] = 10 ETH, etc.
  • Estado actual: total_recaudado = 17 ETH, estado = "en_progreso"

Paso 3: Se alcanza el objetivo antes del plazo

  • El día 20, el total llega a 100 ETH
  • El estado cambia automáticamente: estado = "objetivo_alcanzado"
  • El creador llama a la función retirarFondos()
  • El contrato verifica: "¿Se alcanzó el objetivo? Sí. ¿Quién está llamando? El creador legítimo."
  • Ejecuta: transferir(creador, 100 ETH)
  • Evento emitido: "Crowdfunding exitoso, fondos liberados"

Paso 4 alternativo: No se alcanza el objetivo

  • Pasan 30 días y solo se recaudaron 85 ETH
  • El estado cambia: estado = "fracasado"
  • Alice llama a la función reembolso()
  • El contrato verifica: "¿Alice contribuyó? Sí, 5 ETH."
  • Ejecuta: transferir(Alice, 5 ETH)
  • Bob y Carol hacen lo mismo y recuperan su dinero

¿Qué hace esto revolucionario?

  • Transparencia total: Cualquiera puede ver el código y verificar las reglas
  • No hay intermediario: Ni Kickstarter, ni banco, ni notario
  • Ejecución garantizada: Si se cumplen las condiciones, el código ejecuta. Nadie puede bloquear los fondos
  • Sin comisiones (más allá del gas de Ethereum)
  • Inmediato: Los fondos se liberan en el momento en que se alcanza el objetivo

El Lenguaje: Solidity (Una Breve Introducción)

Los Smart Contracts en Ethereum se escriben mayoritariamente en un lenguaje llamado Solidity, que tiene una sintaxis parecida a JavaScript o C++.

Ejemplo Muy Simple (Contrato de Contador)

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Contador {
    // Variable de estado (se guarda permanentemente en la blockchain)
    uint256 public numero;

    // Función para incrementar el contador
    function incrementar() public {
        numero = numero + 1;
    }

    // Función para obtener el valor actual (solo lectura)
    function obtenerNumero() public view returns (uint256) {
        return numero;
    }
}

¿Qué hace este contrato?

  • Tiene una variable numero que empieza en 0
  • Cualquiera puede llamar a incrementar() para sumar 1
  • Cualquiera puede leer el valor actual con obtenerNumero()
  • Cada vez que alguien llama a incrementar(), paga gas (porque modifica el estado de la blockchain)

Este ejemplo no pretende enseñarte Solidity (no es el objetivo de este manual), sino mostrarte que el código es legible y no tan diferente de otros lenguajes de programación. Si sabes leer JavaScript o Python, puedes intuir qué hace cada línea.

Del Código al Blockchain: El Proceso de Despliegue

  1. Escribes el código en Solidity (archivo .sol)
  2. Compilas el código a bytecode (código de máquina que entiende la EVM)
  3. Despliegas el contrato mediante una transacción especial:
  4. Pagas gas (porque estás añadiendo código nuevo a la blockchain)
  5. La red asigna una dirección al contrato
  6. El bytecode queda almacenado permanentemente
  7. Interactúas con el contrato llamando a sus funciones (cada llamada es una transacción que paga gas)

Importante: Una vez desplegado, el código es inmutable. Si descubres un bug, no puedes "parchearlo" como en software tradicional. Tu única opción es desplegar un nuevo contrato corregido y migrar a los usuarios.


Limitaciones Críticas de los Smart Contracts

1. El Problema del Oráculo: La Blockchain es Ciega

Un Smart Contract no puede acceder al mundo exterior por sí mismo. No puede:

  • Consultar el precio actual de Bitcoin en Coinbase
  • Saber si llovió ayer en Madrid
  • Verificar si un paquete llegó a su destino
  • Leer el resultado de unas elecciones

¿Por qué? Porque la EVM debe ser determinista: todos los nodos de la red deben llegar exactamente al mismo resultado al ejecutar el mismo código. Si un contrato pudiera "llamar a una API externa", cada nodo obtendría respuestas ligeramente diferentes (debido a latencia de red, cambios de estado en tiempo real, etc.), rompiendo el consenso.

Solución: Los Oráculos

Un oráculo es un servicio externo de confianza que "alimenta" datos del mundo real a la blockchain. El más conocido es Chainlink.

¿Cómo evita Chainlink la manipulación?

No usa una sola fuente. Por ejemplo, para reportar el resultado del partido Real Madrid vs Barcelona:

  • 21 nodos independientes de Chainlink consultan múltiples fuentes de datos (ESPN, BBC Sport, Reuters, AP News)
  • Cada nodo reporta su resultado a la blockchain
  • Se descartan valores anómalos (si 20 nodos dicen "2-1" y uno dice "0-10", ese se ignora)
  • Se toma la respuesta mayoritaria o la mediana como resultado oficial
  • Solo entonces el Smart Contract puede leer ese dato y ejecutar

Si alguien quisiera manipular el oráculo, tendría que hackear simultáneamente la mayoría de los nodos Y comprometer múltiples fuentes de datos independientes, lo cual es económicamente inviable.

Ejemplo práctico: Un contrato de seguro de vuelo retrasado:

  • El contrato necesita saber si el vuelo AA123 se retrasó
  • El oráculo de Chainlink consulta las APIs de FlightAware, FlightStats y la aerolínea
  • Los nodos agregan las respuestas y escriben el resultado en la blockchain: "Sí, retrasado 3 horas"
  • El contrato lee ese dato y ejecuta: "Pagar 500€ automáticamente al asegurado"

2. Determinismo Total

La EVM es una máquina determinista: mismo input = mismo output, siempre. Esto significa que:

  • No puedes generar números aleatorios "de verdad" (hay que usar técnicas especiales con hashes o servicios como Chainlink VRF)
  • No puedes acceder a la hora actual del sistema (solo al timestamp del bloque)
  • No puedes hacer llamadas HTTP a APIs
  • No puedes leer archivos del disco

Estas restricciones son necesarias para que 10.000 nodos independientes ejecuten el mismo contrato y lleguen exactamente al mismo resultado.

3. Inmutabilidad: Bug = Desastre Permanente

En software tradicional, si descubres un bug crítico, publicas un parche y actualizas. En Smart Contracts, no puedes. El código desplegado es permanente.

Consecuencias:

  • Un error de programación puede causar la pérdida de millones de dólares
  • No hay "rollback" ni "undo"
  • La única solución es desplegar un nuevo contrato corregido y convencer a los usuarios de que migren

Por eso existen las auditorías de código: empresas especializadas (como Trail of Bits, OpenZeppelin, CertiK) revisan línea por línea el código antes del despliegue, buscando vulnerabilidades conocidas.


El Desastre de The DAO: Cuando el Código es Ley (Literalmente)

En 2016 ocurrió el exploit más famoso de la historia de Ethereum.

The DAO fue el primer fondo de inversión gestionado por Smart Contracts: cualquiera podía depositar ETH y votar en qué proyectos invertir. Recaudó aproximadamente 150 millones de dólares.

El bug: El contrato permitía a los usuarios retirar su parte de ETH, pero cometía el error clásico de reentrancy: enviaba el ETH antes de actualizar el saldo interno. Un atacante escribió un contrato que al recibir el ETH volvía a llamar inmediatamente a la función de retirada, antes de que el saldo se actualizase. El bucle se repetía hasta vaciar el pool. En pocas horas drenó aproximadamente 3,6 millones de ETH, en ese momento cerca de un tercio de todo el Ether en circulación.

La controversia: La comunidad se enfrentó a dos opciones:

  • Opción A: Aceptar que el código es ley. El atacante se queda con el dinero.
  • Opción B: Hacer un hard fork para revertir las transacciones y devolver los fondos.

La mayoría votó por la Opción B. El fork se ejecutó el 20 de julio de 2016 y dio lugar al Ethereum actual. La minoría que rechazó la intervención siguió con la cadena original: hoy se llama Ethereum Classic (ETC), y en 2026 vale aproximadamente el 1-2% de ETH.

Lecciones:

  1. Un bug en un Smart Contract puede ser catastrófico e irreversible
  2. Las auditorías son absolutamente críticas
  3. “Code is law” es un ideal, pero la realidad es más compleja cuando hay dinero en juego
  4. La inmutabilidad de blockchain solo es tan fuerte como el consenso social que la sostiene

Casos de Uso Reales de Smart Contracts

Ahora que entendemos qué son y sus limitaciones, veamos para qué se usan realmente en 2026:

1. Tokens (ERC-20): Monedas como Listas de Saldos

Esto suele sorprender: cuando "tienes" tokens de la Rana Pepe (PEPE) en tu wallet, en realidad no tienes nada en tu wallet. Lo que existe es:

  1. Un Smart Contract de PEPE desplegado en Ethereum (dirección: 0x6982508145454Ce325dDbE47a25d4ec3d2311933)

  2. Dentro de ese contrato, una base de datos (un mapping) que dice:

Dirección → Saldo 0xAlice... → 1.000.000 PEPE 0xBob... → 500.000 PEPE 0xTuWallet... → 250.000 PEPE

Cuando "envías" tokens PEPE a Bob:

  1. Tu wallet llama a la función transfer(Bob, 100000) del contrato PEPE

  2. El contrato verifica: "¿Tiene Alice al menos 100.000 PEPE?" → Sí

  3. El contrato modifica su base de datos interna:

0xAlice... → 900.000 PEPE (restó 100.000) 0xBob... → 600.000 PEPE (sumó 100.000)

  1. Emite un evento: "Transferencia de Alice a Bob: 100.000 PEPE"

No se mueve ningún archivo. Solo se actualiza un número en la memoria del contrato. Tu wallet (MetaMask, etc.) consulta periódicamente ese contrato y te muestra "tienes 900.000 PEPE", pero en realidad está leyendo esa base de datos.

Por eso cualquiera puede crear un token:

  • Despliegas un contrato que siga el estándar ERC-20 (tiene las funciones transfer, balanceOf, approve, etc.)
  • Le dices "el suministro total es 1 billón de tokens"
  • Asignas esos tokens a direcciones
  • Ya existe tu token

La Rana Pepe, Shiba Inu, o cualquier memecoin es simplemente un contrato con una lista de saldos. Su valor de mercado depende de si la gente quiere comprarlo, pero técnicamente no es diferente de USDC o cualquier otro token ERC-20. En la siguiente lección veremos los distintos estándares de tokens y sus diferencias en detalle.

2. NFTs (ERC-721): Certificados de Propiedad Únicos

A diferencia de los tokens fungibles, cada NFT es único y tiene un ID específico. El contrato:

  • Registra quién es el dueño de cada ID
  • Permite transferir la propiedad
  • Almacena un enlace (URI) a los metadatos (imagen, descripción, etc.)

Nota sobre el valor: Un NFT no es la imagen/arte en sí, sino el certificado de que "tú eres el propietario reconocido de este ID único en este contrato específico". Su valor depende totalmente de si otros reconocen ese certificado como importante. Los Bored Apes valían millones porque había consenso social de que "poseer el #1234 tiene prestigio". Si ese consenso desaparece, el certificado sigue existiendo en la blockchain pero deja de tener valor económico. Profundizaremos esto en la Lección 6.

3. DeFi: Finanzas Descentralizadas

Aquí es donde los Smart Contracts muestran su verdadero potencial: recrear el sistema financiero tradicional sin bancos ni intermediarios.

Pools de Liquidez (Uniswap, 2026): Imagina un contrato que guarda dos tipos de tokens (por ejemplo, ETH y USDC) en cantidades equilibradas. Cuando quieres intercambiar ETH por USDC:

  1. Depositas tu ETH en el contrato
  2. El contrato calcula cuánto USDC corresponde según una fórmula matemática (x*y=k)
  3. Te envía el USDC automáticamente
  4. El precio se ajusta según la oferta/demanda del pool

No hay un "libro de órdenes" como en Coinbase. No hay una empresa gestionando los intercambios. Es un algoritmo matemático en un contrato que hace de "creador de mercado automático" (AMM).

Préstamos Sin Banco (Aave, Compound): Contratos que permiten:

  • Depositar USDC y recibir intereses (porque otros piden prestado)
  • Pedir prestado ETH dejando garantías en USDT (sobre-colateralizado: depositas 150€ para pedir 100€)
  • Liquidación automática si el valor de tu garantía cae por debajo del umbral

Stablecoins Algorítmicas (DAI): Un contrato que mantiene el valor de DAI anclado a 1 USD mediante un sistema de colaterales: depositas 150€ en ETH, puedes generar 100 DAI. Si el valor del ETH cae, el contrato te liquida automáticamente para proteger la paridad.

Estos sistemas gestionan decenas de miles de millones de dólares en 2026, todo mediante Smart Contracts sin intervención humana. Profundizaremos en cómo funcionan exactamente en la Lección 9 (DeFi).

4. DAOs: Organizaciones Descentralizadas

Contratos que gestionan votaciones y tesorería:

  • Los miembros depositan tokens de gobernanza
  • Pueden proponer acciones (transferir fondos, cambiar parámetros del protocolo)
  • Se vota on-chain
  • Si la propuesta pasa, el contrato ejecuta automáticamente la acción

5. Seguros Paramétricos

Contratos que pagan automáticamente si ocurre un evento verificable:

  • Seguro de cosecha: si no llueve X días según datos meteorológicos, paga al agricultor
  • Seguro de vuelo: si el vuelo se retrasa más de 2 horas, paga al pasajero
  • Usan oráculos para verificar las condiciones del mundo real

Riesgos y Seguridad: ¿Por Qué las Auditorías son Críticas?

Más allá de The DAO, los exploits de Smart Contracts han causado pérdidas de miles de millones de dólares. Algunos vectores de ataque comunes:

1. Reentrancy (Reentrada)

Ya visto en The DAO. Solución: actualizar el estado interno antes de enviar ETH, o usar guards como ReentrancyGuard de OpenZeppelin.

2. Integer Overflow/Underflow

En Solidity antiguo, si sumabas 1 a uint256 max (2^256-1), volvía a 0. Esto permitía "crear dinero de la nada". Solución: usar SafeMath o Solidity 0.8+ que tiene protecciones integradas.

3. Acceso No Autorizado

Funciones críticas (como "retirar todos los fondos") que deberían ser onlyOwner pero se dejaron públicas por error.

4. Front-Running

Un atacante ve tu transacción en el mempool (antes de que se mine) y envía otra transacción con más gas para ejecutarse antes, aprovechándose de tu movimiento. Especialmente común en DEX.

5. Flash Loan Attacks

Préstamos instantáneos (sin colateral) que permiten manipular mercados en una sola transacción, explotando asunciones erróneas sobre liquidez o precios.

Por Eso Existen las Auditorías:

Antes de que un protocolo gestione millones de dólares, empresas especializadas:

  • Revisan el código línea por línea
  • Buscan patrones de vulnerabilidades conocidas
  • Hacen pruebas de fuzzing (inputs aleatorios para buscar comportamientos inesperados)
  • Simulan ataques potenciales
  • Publican un informe detallado
  • Los proyectos serios no lanzan sin auditoría

Ejemplos de empresas auditoras: OpenZeppelin, Trail of Bits, CertiK, ConsenSys Diligence, Quantstamp.


El Concepto de "Code is Law" (El Código es Ley)

Esta frase resume la filosofía de los Smart Contracts: las reglas están escritas en código y se ejecutan automáticamente, sin excepciones.

Ventajas:

  • No hay corrupción ni favoritismo
  • No hay intermediarios que puedan bloquear o censurar
  • Las reglas son transparentes y verificables por todos
  • Ejecución garantizada sin depender de sistemas legales

Desventajas:

  • No hay tribunal de apelación
  • No hay "sentido común" ni interpretación humana
  • Un error de código es un error permanente
  • No hay margen para la compasión o circunstancias excepcionales

En el mundo tradicional, si un contrato tiene una ambigüedad, vas a un juez que interpreta la intención. En un Smart Contract, si el código dice A, se ejecuta A, aunque todos sepamos que la intención era B.

Ejemplo Real: En junio de 2022, Wintermute (una de las mayores empresas de market making del sector) perdió aproximadamente 20 millones de dólares en tokens OP por un error de configuración.

La Optimism Foundation iba a prestarle 20 millones de tokens OP para proporcionar liquidez. Wintermute proporcionó por error una dirección de su wallet multisig que existía en Ethereum (L1), pero que aún no había sido desplegada en Optimism (L2). La transacción se ejecutó correctamente según las reglas del contrato en Optimism: los tokens llegaron a esa dirección “vacía”.

Un atacante se dio cuenta antes que ellos, desplegó el contrato y se llevó todo. Wintermute rogó públicamente y se comprometió a recomprar los tokens para compensar, pero técnicamente no había forma de deshacer la transacción. El código había ejecutado exactamente lo que se le pidió.


Conclusión: Poder y Responsabilidad

Los Smart Contracts son una de las innovaciones más poderosas de la blockchain: nos dan la capacidad de ejecutar acuerdos complejos sin necesidad de confiar en intermediarios. Pero ese poder viene con responsabilidad:

  • Para desarrolladores: Cada línea de código gestiona dinero real. Un error puede arruinar vidas.
  • Para usuarios: Interactuar con un contrato es irreversible. Debes verificar el contrato antes de firmar cualquier transacción.
  • Para la industria: Las auditorías no son opcionales, son obligatorias.

En la próxima lección veremos cómo estos contratos se utilizan para crear tokens (ERC-20, ERC-721, ERC-1155), que son la base de todo el ecosistema de activos digitales en Ethereum.


Nota técnica: En 2026, la mayoría de protocolos serios usan patrones de diseño seguros como el Checks-Effects-Interactions (verificar condiciones → modificar estado → interactuar con externos), librerías auditadas como OpenZeppelin Contracts, y múltiples capas de auditoría antes del lanzamiento. Aun así, los exploits siguen ocurriendo, recordándonos que en un sistema donde el código es ley, la calidad del código es literalmente vital.

En la próxima lección: la arquitectura de los tokens y los estándares ERC.

TOP