Saltar a contenido

Capítulo 30 — Web3

Introducción

Web3 es la visión de una internet descentralizada, donde los usuarios son dueños de sus datos y las aplicaciones no dependen de un servidor central.

Se apoya en blockchain, contratos inteligentes y billeteras criptográficas. Ha generado tanto entusiasmo como escepticismo, y hay mucho ruido alrededor.

Este capítulo explica los conceptos técnicos reales, sin promesas de humo.

Web 1.0, 2.0 y 3.0

Etapa Características Ejemplos
Web 1.0 (1990-2004) Estática, solo lectura Webs personales, foros
Web 2.0 (2004-hoy) Dinámica, social, centralizada Facebook, YouTube, Twitter
Web 3.0 (¿hoy?) Descentralizada, propiedad del usuario dApps, DAOs, DeFi

Web3 no sustituye a Web2. Conviven. Y hay cosas que funcionan mejor en una que en otra.

Blockchain: la base

Una blockchain es una base de datos distribuida donde los registros se agrupan en bloques encadenados criptográficamente. Una vez escrito, un bloque no se puede modificar sin reescribir toda la cadena.

Propiedades clave

  • Descentralizada: no hay un dueño.
  • Inmutable: los datos no se pueden cambiar.
  • Transparente: cualquiera puede auditarla.
  • Sin permisos: cualquiera puede participar.

Redes principales

Red Uso Velocidad
Ethereum Contratos inteligentes, dApps 12 s/bloque
Bitcoin Valor, almacenamiento 10 min/bloque
Solana Alto rendimiento 400 ms/bloque
Polygon Capa 2 de Ethereum (más barata) 2 s/bloque

Wallets y claves

Una wallet no guarda criptomonedas. Guarda claves privadas que dan acceso a direcciones en la blockchain.

  • Clave pública → dirección (como un IBAN).
  • Clave privada → firma de transacciones (como la contraseña del banco).
  • Frase semilla → 12-24 palabras que permiten recuperar la wallet.

Nunca compartas tu clave privada

Nadie legítimo te la pedirá. Si la pierdes, pierdes acceso para siempre. Si alguien la obtiene, puede vaciar tu wallet.

Wallets populares: MetaMask, Rabby, Phantom, Ledger (hardware).

Conectar una wallet en tu web

npm install ethers
import { BrowserProvider } from 'ethers';

async function conectar() {
  if (!window.ethereum) {
    alert('Instala MetaMask para continuar');
    return;
  }

  const provider = new BrowserProvider(window.ethereum);
  const cuentas = await provider.send('eth_requestAccounts', []);

  console.log('Conectado como:', cuentas[0]);
  return cuentas[0];
}

Para más wallets a la vez, usa RainbowKit o ConnectKit (React).

Contratos inteligentes

Un smart contract es un programa que vive en la blockchain. Se ejecuta automáticamente cuando se cumplen sus condiciones.

Se escriben normalmente en Solidity:

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

contract Contador {
    uint256 public cuenta;

    event Incrementado(uint256 nuevaCuenta, address por);

    function incrementar() public {
        cuenta += 1;
        emit Incrementado(cuenta, msg.sender);
    }

    function reiniciar() public {
        cuenta = 0;
    }
}

Se despliega en la red y queda accesible para siempre. Cada llamada cuesta gas (tarifa de la red).

Interactuar con un contrato desde el frontend

import { BrowserProvider, Contract } from 'ethers';

const ABI = [
  'function cuenta() view returns (uint256)',
  'function incrementar()',
];

const DIRECCION = '0x...';

async function interactuar() {
  const provider = new BrowserProvider(window.ethereum);
  const signer = await provider.getSigner();
  const contrato = new Contract(DIRECCION, ABI, signer);

  const cuenta = await contrato.cuenta();
  console.log('Cuenta actual:', cuenta.toString());

  const tx = await contrato.incrementar();
  await tx.wait();
  console.log('Incrementado');
}

dApps (aplicaciones descentralizadas)

Una dApp es una aplicación web que interactúa con la blockchain. Componentes:

  • Frontend: HTML/CSS/JS normal.
  • Wallet: MetaMask, WalletConnect…
  • Contrato: lógica en Solidity.
  • IPFS: almacenamiento descentralizado (opcional).

Ejemplos:

  • Uniswap — exchange descentralizado.
  • OpenSea — mercado de NFTs.
  • Aave — préstamos.
  • ENS — dominio .eth (como DNS).

NFTs

Un NFT (Non-Fungible Token) es un token único en la blockchain. Representa propiedad de algo digital o físico.

Casos legítimos:

  • Arte digital con procedencia verificable.
  • Entradas de eventos (evitan reventa fraudulenta).
  • Certificados académicos o profesionales.
  • Dominios descentralizados.
  • Objetos de juegos con propiedad real.

Casos polémicos:

  • Especulación.
  • Derechos de autor cuestionables.
  • Alto consumo energético (menos con Ethereum post-Merge).

DAOs

Una DAO (Decentralized Autonomous Organization) es una organización gobernada por contratos y votos de sus miembros.

  • Sin jerarquía tradicional.
  • Votaciones on-chain.
  • Tesorería transparente.
  • Código como ley.

Ejemplos: MakerDAO, Uniswap DAO, Gitcoin DAO.

IPFS: almacenamiento descentralizado

IPFS (InterPlanetary File System) es un sistema de archivos distribuido. Los archivos se identifican por su contenido (hash), no por su ubicación.

import { create } from 'ipfs-http-client';

const ipfs = create({ url: 'https://ipfs.infura.io:5001' });
const { cid } = await ipfs.add('Hola, mundo');
console.log('CID:', cid.toString());

Accedes al archivo con: https://ipfs.io/ipfs/<CID>.

Retos reales de Web3

Problemas técnicos

  • Escalabilidad limitada en algunas redes.
  • Coste de gas variable y a veces alto.
  • Experiencia de usuario complicada (wallets, seeds, gas).
  • Finalidad lenta en algunas transacciones.

Problemas de percepción

  • Especulación domina la conversación.
  • Estafas y rug pulls frecuentes.
  • Consumo energético (aunque Ethereum ya no).
  • Falta de regulación clara.

Problemas de diseño

  • No todo necesita descentralización.
  • La inmutabilidad complica corregir errores.
  • Transparencia total ≠ privacidad.

¿Cuándo tiene sentido Web3?

✅ Buen caso

  • Censura resistente: contenidos que no pueden ser borrados.
  • Propiedad verificable: arte, coleccionables.
  • Pagos sin intermediarios: transferencias internacionales.
  • Votaciones transparentes.
  • Identidad soberana.

❌ Mal caso

  • Redes sociales generales (mejor con Web2).
  • Aplicaciones donde el rendimiento importa.
  • Casos donde un servidor central funciona bien.
  • Cuando el usuario no sabe qué es una wallet.

Regla de oro

Si no necesitas descentralización, no la uses. Añadir blockchain no hace mejor una app. La hace más compleja y, a menudo, peor.

Seguridad en Web3

  • Verifica siempre las direcciones antes de enviar.
  • Usa hardware wallet para cantidades grandes.
  • Revoca permisos antiguos en revoke.cash.
  • Desconfía de regalos y airdrops no solicitados.
  • Verifica contratos en Etherscan.
  • No firmes transacciones que no entiendas.

Impacto ambiental

Ethereum migró a Proof of Stake en 2022 (The Merge), reduciendo su consumo energético un 99,95%. Bitcoin sigue con Proof of Work, muy intensivo en energía.

Si te preocupa el impacto, prefiere redes PoS: Ethereum, Polygon, Solana, Cardano.

Diagrama: cómo interactúa una dApp

sequenceDiagram
    participant U as Usuario
    participant W as Wallet<br/>MetaMask
    participant D as dApp<br/>Frontend
    participant C as Contrato<br/>Solidity
    participant B as Blockchain

    U->>D: Clic en "Conectar wallet"
    D->>W: eth_requestAccounts
    W-->>U: Pide permiso
    U-->>W: Acepta
    W-->>D: Dirección 0x...
    D->>C: Llama función
    C->>B: Transacción firmada
    B-->>C: Confirmación
    C-->>D: Evento emitido
    D-->>U: Actualiza UI

Una dApp no accede directamente a la blockchain: la wallet actúa como intermediaria y firma cada transacción en nombre del usuario.

Buenas prácticas para desarrolladores

  • Empieza por entender los fundamentos antes de programar.
  • Usa testnets (Sepolia, Mumbai) para pruebas.
  • Audita tus contratos antes del mainnet.
  • Nunca despliegues sin tests — no hay "rollback" en blockchain.
  • Maneja errores con gracia en el frontend.
  • Ofrece fallback si el usuario no tiene wallet.
  • No prometas más de lo que la tecnología puede.

Ejercicios

  1. Instala MetaMask y crea una wallet en testnet.
  2. Conecta tu web a MetaMask con eth_requestAccounts.
  3. Lee el balance de una dirección con ethers.
  4. Despliega un contrato Contador en Sepolia y úsalo desde el frontend.
  5. Muestra información de un NFT existente desde OpenSea API.
  6. Sube un archivo a IPFS y accede vía gateway.
  7. Escribe el mismo formulario con Web2 y con Web3. Compara la complejidad.

⬅️ Capítulo 29 — WebXR | ➡️ Apéndices