Ethereum: de historia a labs

Artículo 28 de 48

58%

completado al llegar aquí

Sistemas distribuidosNota de investigación13 min de lectura

The Merge: cómo se apagó proof-of-work sin apagar Ethereum

Cómo funcionó The Merge: Bellatrix, Paris, el bloque terminal por dificultad total, la Engine API y qué cambió para contratos y aplicaciones.

Ruta Ethereum: 0/48

¿Cómo cambias el motor de un sistema distribuido que mueve dinero sin detenerlo y sin que nadie tenga que migrar? Ethereum lo hizo el 15 de septiembre de 2022. Ese día la red principal dejó de depender de la minería y empezó a seguir los bloques que decidía la Beacon Chain.

No se perdió historia: el estado de cuentas, contratos y transacciones desde la génesis de 2015 siguió intacto. Lo que cambió fue quién decide el siguiente bloque. Este capítulo sigue el mecanismo paso a paso: el disparador, el bloque de transición, el canal entre clientes y las consecuencias para quien escribe contratos o aplicaciones.

Brújula de lectura

Actor, evidencia y estado

Antes de avanzar, ubica quién actúa, qué prueba queda y qué parte del sistema cambia.

Actor

Cliente de consenso

Desde la transición, ordena al cliente de ejecución qué bloque es la cabeza.

Evidencia

Dificultad total terminal

El paso se disparó por un valor acumulado de trabajo, no por un número de bloque.

Estado

Mismo estado de ejecución

Cuentas, contratos e historial siguieron en la misma cadena.

Preguntas guía

  • ¿Por qué la transición se disparó con dificultad total acumulada y no con un número de bloque?
  • ¿Qué campos de la cabecera de bloque pasaron a ser constantes?
  • ¿Qué mensajes intercambian el cliente de consenso y el de ejecución en cada slot?
  • ¿Qué devuelve hoy el opcode que antes se llamaba DIFFICULTY?

Conexiones dentro de la serie

Historia de la transición: dos actualizaciones y un disparador

The Merge fueron dos actualizaciones coordinadas, una por capa. En la capa de consenso, Bellatrix se activó el 6 de septiembre de 2022, en la epoch 144 896. Además de preparar el fork choice para la transición, hizo que los clientes de consenso conocieran el valor de dificultad total terminal y llevó las penalizaciones por inactividad y por slashing a sus valores completos.

En la capa de ejecución, Paris fue la actualización que apagó la minería. No tenía un número de bloque fijo. Se disparaba cuando la cadena de prueba de trabajo superara una terminal total difficulty (TTD): la suma de la dificultad de todos los bloques desde la génesis.

El valor de mainnet es TERMINAL_TOTAL_DIFFICULTY = 58 750 000 000 000 000 000 000. Ese umbral se alcanzó en el bloque 15 537 393, el 15 de septiembre de 2022, y el bloque siguiente, 15 537 394, fue el primero producido con prueba de participación.

¿Por qué dificultad total y no altura? Como razonamiento: la altura es barata de falsificar en una rama minoritaria, pero la dificultad acumulada mide trabajo real. Usarla ataba la transición a la cadena con más trabajo, la misma que la regla de prueba de trabajo ya consideraba canónica.

Traza de ejecución del bloque de transición

EIP-3675 define el mecanismo con precisión. Un bloque PoW es terminal si su dificultad total es mayor o igual que la TTD y la de su padre es menor. Puede haber más de uno, por ejemplo dos hijos del mismo padre. Los clientes no deben importar bloques PoW que desciendan de un bloque terminal: el terminal es el último bloque de trabajo de la cadena canónica.

El primer bloque de prueba de participación, TRANSITION_BLOCK, tiene que ser hijo de un bloque terminal. A partir de él, varios campos de cabecera pasan a constantes: difficulty = 0, nonce = 0x0000000000000000 y la lista de ommers (bloques tío) vacía. EIP-3675 también fijaba mixHash en ceros, pero EIP-4399 reutilizó ese campo para llevar la mezcla RANDAO de la Beacon Chain. La verificación de Ethash desaparece y también las recompensas de bloque y de tío; las comisiones de transacción siguen igual.

Del lado de consenso, el bloque de ejecución viaja dentro del bloque beacon como un ExecutionPayload, con campos como parent_hash, fee_recipient, state_root, prev_randao, block_number, base_fee_per_gas, block_hash y la lista de transacciones. La figura sigue esa traza.

Figura 1

El bloque terminal y el primer payload de prueba de participación

Fuentes:

[4][2][3]
El bloque terminal y el primer payload de prueba de participación
Cómo leer esta figura

Dos filas. Arriba, Beacon Chain (prueba de participación desde 2020): un bloque beacon sin transacciones, una línea vertical discontinua marcada Bellatrix, un bloque beacon con payload vacío, un bloque beacon con payload 15 537 394 y otro con payload 15 537 395, unidos por flechas. Abajo, Cadena de prueba de trabajo: el bloque 15 537 392 con dificultad total menor que la TTD, el bloque 15 537 393 marcado como terminal con dificultad total mayor o igual que la TTD, y una caja discontinua roja de hijos PoW que no se importan. Una flecha verde sube desde el bloque terminal al bloque beacon con payload 15 537 394, etiquetada padre del payload. Dos notas al pie: Bellatrix, 6 de septiembre de 2022, epoch 144 896, la capa de consenso ya conoce la TTD; Paris, 15 de septiembre de 2022, primer bloque PoS 15 537 394, TTD igual a 58 750 000 000 000 000 000 000.

Visual original de TrautsLab. La Beacon Chain producía bloques sin transacciones desde 2020. Cuando la cadena de prueba de trabajo alcanzó la TTD en el bloque 15 537 393, su hijo llegó como payload de ejecución dentro de un bloque beacon y los descendientes PoW dejaron de importarse.

Engine API: el contrato entre los dos clientes

Después de la transición, el cliente de ejecución ya no decide cuál es la cabeza. EIP-3675 reemplaza la regla del "más trabajo acumulado" por eventos POS_FORKCHOICE_UPDATED que nombran la cabeza y el último bloque finalizado; el cliente de ejecución no puede adelantar la cabeza por su cuenta. En la práctica esos eventos llegan por la Engine API, que define tres métodos centrales:

Traza

Un slot visto desde la Engine API

Versión V1 de los métodos, la de Paris; las actualizaciones posteriores añaden versiones nuevas.
  1. engine_forkchoiceUpdatedV1Consenso indica cabeza, bloque safe y bloque finalizado; si propone, envía atributos del payload.
  2. engine_getPayloadV1El proponente pide a ejecución el payload construido.
  3. engine_newPayloadV1Cada nodo entrega el payload recibido a su cliente de ejecución para validarlo.
  4. PayloadStatusV1Ejecución responde VALID, INVALID, SYNCING, ACCEPTED o INVALID_BLOCK_HASH.

El estado forkchoiceState tiene tres hashes: headBlockHash, safeBlockHash y finalizedBlockHash. El bloque safe debe ser igual a la cabeza o un antepasado suyo. Los atributos para construir un bloque son tres: timestamp, prevRandao y suggestedFeeRecipient. Un ejemplo ilustrativo del cuerpo de la llamada, con valores inventados y hashes abreviados:

JSON
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "engine_forkchoiceUpdatedV1",
  "params": [
    {
      "headBlockHash": "0x3b8f...",
      "safeBlockHash": "0x3b8f...",
      "finalizedBlockHash": "0x9a1c..."
    },
    {
      "timestamp": "0x6321d8c3",
      "prevRandao": "0x5d2a...",
      "suggestedFeeRecipient": "0x00000000000000000000000000000000000000aa"
    }
  ]
}

Para operadores, ethereum.org resume las obligaciones: correr un cliente de consenso además del de ejecución, autenticarlos con un secreto JWT compartido y, si se valida, fijar una dirección fee recipient para cobrar las propinas. Sin las dos primeras, el nodo aparece "offline".

Qué cambió para contratos y aplicaciones

El opcode 0x44 se llamaba DIFFICULTY. Con la dificultad fijada en 0, EIP-4399 lo renombra a PREVRANDAO y le hace devolver el campo mixHash, que ahora contiene la mezcla RANDAO del bloque beacon anterior. Un valor mayor que 2^64 indica que la transacción se ejecuta en un bloque de prueba de participación.

No lo uses como lotería segura. La misma EIP advierte que cada proponente tiene un bit de influencia por slot: puede no publicar su bloque para que la mezcla no cambie, o retrasar una transacción al bloque siguiente cuya mezcla ya conoce.

solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
 
/// Ilustrativo: leer la mezcla RANDAO. No es aleatoriedad resistente a sesgo.
contract RandaoProbe {
    function currentMix() external view returns (uint256) {
        return block.prevrandao; // opcode 0x44 tras EIP-4399
    }
}

Las aplicaciones también ganaron dos etiquetas de bloque en JSON-RPC. safe es el bloque más reciente a salvo de reorganizaciones bajo mayoría honesta y ciertos supuestos de sincronía; finalized es el más reciente con seguridad criptoeconómica, que no se reorganiza salvo intervención manual coordinada por la comunidad. Un indexador que solo lee latest está aceptando bloques que pueden desaparecer en condiciones normales.

Bash
# Ilustrativo: puerto de ejemplo del cliente de ejecución.
curl -s -X POST http://localhost:8545 -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_getBlockByNumber","params":["finalized",false]}'

Dos creencias frecuentes son falsas. The Merge no bajó el gas: cambió el mecanismo de consenso, no la capacidad de la red. Tampoco aceleró de forma notable las transacciones: los slots de 12 segundos frente a un objetivo de unos 13,3 segundos con prueba de trabajo son una diferencia pequeña. Lo que sí apareció es la finalidad, que el capítulo siguiente desarma.

Referencias

Bibliografía académica

Formato IEEENumerado para ingeniería, sistemas y protocolos.
  1. [1]

    ethereum.org, "The Merge," Ethereum roadmap, accessed 2026-11-12.

    official docsID: ETH-MERGE-2022Abrir fuente (abre en otra pestaña)

    Fecha de ejecución, historia intacta, requisitos para operadores y conceptos erróneos sobre gas y velocidad.

  2. [2]

    ethereum.org, "Timeline of all Ethereum forks (2014 to present)," accessed 2026-11-12.

    official docsID: ETH-FORKS-HISTORYAbrir fuente (abre en otra pestaña)

    Bellatrix en la epoch 144 896; Paris disparado en el bloque 15 537 393 y primer bloque PoS 15 537 394; EIPs incluidas.

  3. [3]

    ethereum/consensus-specs, "configs/mainnet.yaml," GitHub specification, accessed 2026-11-12.

    specID: CONSENSUS-SPECS-MAINNETAbrir fuente (abre en otra pestaña)

    TERMINAL_TOTAL_DIFFICULTY = 58750000000000000000000 y BELLATRIX_FORK_EPOCH = 144896.

  4. [4]

    M. Kalinin, D. Ryan, and V. Buterin, "EIP-3675: Upgrade consensus to Proof-of-Stake," Ethereum Improvement Proposals, 2021.

    Bloque PoW terminal, constantes de cabecera, fin de recompensas de bloque y regla de fork choice gobernada por POS_FORKCHOICE_UPDATED.

  5. [5]

    M. Kalinin and D. Ryan, "EIP-4399: Supplant DIFFICULTY opcode with PREVRANDAO," Ethereum Improvement Proposals, 2021.

    El opcode 0x44 devuelve la mezcla RANDAO de la Beacon Chain; consideraciones de sesgo del proponente.

  6. [6]

    ethereum/consensus-specs, "Bellatrix: The Beacon Chain," GitHub specification, accessed 2026-11-12.

    specID: CONSENSUS-SPECS-BELLATRIXAbrir fuente (abre en otra pestaña)

    Contenedor ExecutionPayload dentro del bloque beacon y penalizaciones a valor completo.

  7. [7]

    ethereum/execution-apis, "Engine API: Paris," GitHub specification, accessed 2026-11-12.

    engine_newPayloadV1, engine_forkchoiceUpdatedV1, engine_getPayloadV1 y estados VALID, INVALID, SYNCING y ACCEPTED.

  8. [8]

    ethereum/execution-apis, "Block schema: BlockTag," GitHub specification, accessed 2026-11-12.

    specID: EXEC-API-BLOCK-TAGSAbrir fuente (abre en otra pestaña)

    Semántica de las etiquetas latest, safe y finalized en JSON-RPC.

Fuentes primarias, papers seminales y especificaciones técnicas citadas en esta investigación.

Rutas vecinas

Si este tema te abrió hambre, sigue por aquí.

Series y labs que comparten área o dependen de esta ruta. Pocas opciones, para no convertir la curiosidad en menú infinito.

Sigue leyendo

Ideas conectadas con este artículo

Una ruta corta para continuar sin abrir veinte pestañas y perder el hilo.

Los comentarios se cargan al final de la lectura para no meter peso antes de tiempo.