Un smart contract no es un documento legal en PDF ni una persona. Es un programa informático que se ejecuta en una blockchain (como Ethereum) y que se activa automáticamente cuando se cumplen unas condiciones predefinidas. Una vez desplegado, es inmutable, transparente y no necesita intermediarios (como un notario o un abogado). Las reglas se escriben en código (normalmente en Solidity), la red de nodos ejecuta el código y el resultado (por ejemplo, transferir dinero) se registra en la blockchain. Te explico cómo funciona la Máquina Virtual de Ethereum (EVM), qué es el gas, cómo se escriben y despliegan, y por qué los oráculos son necesarios para traer datos externos.
¿Qué es un smart contract? Diferencias con un contrato tradicional
Un contrato inteligente fue conceptualizado por Nick Szabo en 1994 (mucho antes de Bitcoin). La idea es un protocolo de transacción informatizado que ejecuta los términos de un contrato automáticamente. La blockchain, especialmente Ethereum, hizo posible esta idea al proporcionar una máquina virtual descentralizada donde el código se ejecuta sin censura ni intermediarios.
Diferencias con el contrato tradicional en papel:
- Ejecución automática: no hace falta que un juez o un abogado lo ejecute. Si se cumplen las condiciones, el código se ejecuta (transfiere tokens, emite un NFT, etc.).
- Inmutable: una vez desplegado en la blockchain, no se puede modificar (salvo que el propio contrato prevea mecanismos de actualización).
- Transparente: cualquier persona puede ver el código fuente verificado en el explorador de bloques (Etherscan).
- Sin confianza (trustless): no necesitas confiar en la otra parte; confías en el código (siempre que esté bien escrito).
Un ejemplo típico: un contrato de depósito en garantía (escrow). Ana quiere comprar un NFT por 1 ETH a Ben. El contrato recibe el ETH de Ana, lo retiene, y cuando Ben envía el NFT a la dirección de Ana (demostrado mediante una firma o verificación en la blockchain), el contrato libera el ETH a Ben. No necesita un intermediario.
Ethereum: la primera blockchain con smart contracts programables
Bitcoin tiene un lenguaje de scripting muy limitado (no Turing completo). Ethereum (lanzado en 2015) fue diseñado expresamente como “computadora mundial” descentralizada con un lenguaje Turing completo (Solidity). Actualmente otras blockchains (Solana, BNB Chain, Cardano, Avalanche, Polkadot) también soportan smart contracts.
La Máquina Virtual de Ethereum (EVM) y el lenguaje Solidity
La Ethereum Virtual Machine (EVM) es un entorno de ejecución descentralizado que corre en cada nodo de la red Ethereum. Cada operación (sumar, almacenar, transferir) tiene un coste en gas (medido en gwei). El código fuente de un smart contract suele escribirse en Solidity (lenguaje de alto nivel similar a JavaScript o C++).
Ejemplo de contrato simple (almacenar y recuperar un número):
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract MiPrimerContrato {
uint256 numero;
function guardar(uint256 _numero) public {
numero = _numero;
}
function leer() public view returns (uint256) {
return numero;
}
}
El código se compila a bytecode interpretable por la EVM y se despliega pagando una fee (gas) por el despliegue. Una vez desplegado, el contrato tiene una dirección en la blockchain. Los usuarios interactúan enviando transacciones a esa dirección con los datos de la función (guardar, leer).
Solidity soporta herencia, librerías, eventos (logs), y tipos complejos (arrays, mappings, structs). Alternativas a Solidity: Vyper (similar a Python), Rust (para Solana) y otros.
Gas fees: por qué ejecutar un smart contract cuesta dinero (ETH)
El gas es la unidad que mide el trabajo computacional necesario para ejecutar una operación en la EVM. Cada operación elemental (suma, acceso a almacenamiento, creación de contrato) consume una cantidad fija de gas. El usuario paga el gas con ETH (la moneda nativa de Ethereum) a un precio en gwei (1 gwei = 10⁻⁹ ETH).
Factores que afectan el gas:
- Complejidad del código: un contrato que escribe en almacenamiento (SSTORE) consume mucho más gas que uno que solo lee (SLOAD).
- Congestión de la red: si muchos usuarios quieren ejecutar transacciones, el precio base del gas (base fee) sube (EIP-1559).
- Propina (priority fee): los usuarios pueden añadir una propina para que los validadores incluyan su transacción antes.
Si el gas proporcionado es insuficiente, la transacción se revierte (no tiene efecto) pero se cobra el gas consumido hasta el fallo. Siempre es recomendable simular transacciones en testnet primero.
Las blockchains alternativas (Solana, BNB Chain, Polygon, Arbitrum) tienen gas mucho más barato, pero con diferentes modelos de seguridad y descentralización.
Ciclo de vida de un smart contract: desarrollo, despliegue e interacción
Un contrato puede tener funciones de solo lectura (view/pure) que no modifican el estado y por lo tanto no cuestan gas si se ejecutan localmente (llamada estática).
Los contratos también pueden autodestruirse (selfdestruct) enviando su saldo de ETH a una dirección, aunque esta operación está en desuso por motivos de seguridad en nuevas versiones.
Oráculos (Chainlink): cómo un smart contract obtiene datos del mundo real (precios, clima, resultados deportivos)
Los smart contracts son deterministas y no pueden acceder directamente a datos externos (como el precio del Bitcoin en dólares o la temperatura de Madrid) porque eso rompería el consenso: cada nodo podría tener una fuente diferente. Para solucionarlo, se usan oráculos descentralizados. El más conocido es Chainlink.
Un oráculo es un servicio que obtiene datos del mundo real (a través de APIs) y los entrega a la blockchain mediante una transacción firmada. Chainlink agrega datos de múltiples fuentes (intercambios, sensores) para proporcionar un resultado confiable y resistente a la manipulación.
Ejemplo de uso de Chainlink Price Feeds en Ethereum:
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
contract PrecioETH {
AggregatorV3Interface internal priceFeed;
constructor() {
priceFeed = AggregatorV3Interface(0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419);
}
function obtenerPrecio() public view returns (int) {
(,int price,,,) = priceFeed.latestRoundData();
return price;
}
}
Sin oráculos, los contratos DeFi (Uniswap, Aave, Compound) no podrían conocer los precios de los activos para liquidar posiciones.
Tipos de oráculos
- Oráculos de software: recuperan datos de APIs de internet (Chainlink, API3).
- Oráculos de hardware: sensores IoT (temperatura, humedad) que firman datos criptográficamente.
- Oráculos de consenso: múltiples nodos acuerdan un valor (ej. median price).
Un oráculo malicioso puede arruinar contratos (ataque de oráculo). Por eso Chainlink utiliza múltiples nodos y fuentes para mitigar el riesgo.
Casos de uso principales: DeFi (Uniswap, Aave), NFTs (ERC-721), DAOs, juegos blockchain
Los smart contracts impulsan la economía descentralizada:
- DeFi (Finanzas Descentralizadas):
- Uniswap: exchange descentralizado (DEX) que permite intercambiar tokens sin intermediarios usando “pools de liquidez”.
- Aave: préstamos/endeudamiento con colateral (sobrecolateralización). Las tasas se determinan por algoritmos.
- MakerDAO: emisión de DAI (stablecoin) con colateral.
- NFTs (Non-Fungible Tokens): estándares ERC-721 o ERC-1155. Cada token es único y su metadata (imagen, atributos) se vincula mediante una URL o IPFS. Los contratos de mercado (OpenSea, Blur) permiten listar y vender NFTs.
- DAOs (Organizaciones Autónomas Descentralizadas): contratos que gestionan tesorería y votaciones con tokens de gobernanza. Ej. Uniswap DAO, MakerDAO. Los holders de tokens votan propuestas, y el contrato ejecuta automáticamente las decisiones (transferencias, parametrizaciones).
- Juegos blockchain (GameFi): Axie Infinity (descentralizado), The Sandbox; los smart contracts registran la propiedad de personajes y skins, y distribuyen recompensas.
Seguridad y riesgos: bugs, reentrancy attacks, hacks famosos (The DAO, Poly Network)
Un smart contract es inmutable; si tiene un error, no se puede parchear fácilmente (a menos que tenga mecanismo de actualización tipo proxy). Los errores se traducen en pérdidas millonarias de fondos. Algunos famosos:
- The DAO (2016): un ataque de reentrancia (reentrancy attack) drenó 3,6 millones de ETH (60 millones USD en ese momento). Ethereum tuvo que hacer un hard fork para revertir el robo, dando lugar a Ethereum (ETH) y Ethereum Classic (ETC).
- Parity Wallet (2017): un bug en una librería provocó que 500.000 ETH quedaran bloqueados indefinidamente.
- Poly Network (2021): un error de lógica permitió robar 600 millones en múltiples activos (luego devueltos por el hacker).
Prácticas para minimizar riesgos:
- Auditorías externas (múltiples empresas).
- Blocos de pruebas con Bug Bounties.
- Uso de estándares seguros (OpenZeppelin).
- Contratos de actualización con patrón de proxy (UUPS, transparent proxy).
- Limitación de permisos (multifirma para funciones críticas).
Ataque de reentrancia: cómo funciona
Un contrato atacante llama a una función del contrato víctima que transfiere fondos antes de actualizar el estado interno (balance). Si el atacante en su función de recepción (receive) vuelve a llamar a la misma función víctima, se puede drenar varias veces el balance. La solución: actualizar el estado antes de transferir (checks-effects-interactions pattern) o usar modificadores de bloqueo (nonReentrant de OpenZeppelin).