Saltar al contenido principal
Change page

Bloques

Los bloques son lotes de transacciones con un hash del bloque anterior en la cadena. Esto enlaza los bloques entre sí (en una cadena) porque los hashes se derivan criptográficamente de los datos del bloque. Esto previene el fraude, porque un cambio en cualquier bloque del historial invalidaría todos los bloques siguientes, ya que todos los hashes posteriores cambiarían y todos los que ejecutan la cadena de bloques se darían cuenta.

Requisitos previos

Los bloques son un tema muy accesible para principiantes. Pero para ayudarle a comprender mejor esta página, le recomendamos que primero lea sobre Cuentas, Transacciones y nuestra introducción a Ethereum.

¿Por qué bloques?

Para garantizar que todos los participantes en la red Ethereum mantengan un estado sincronizado y estén de acuerdo con el historial preciso de las transacciones, agrupamos las transacciones en bloques. Esto significa que docenas (o cientos) de transacciones se comprometen, se acuerdan y se sincronizan todas a la vez.

A diagram showing transaction in a block causing state changes Diagrama adaptado de Ethereum EVM illustrated (opens in a new tab)

Al espaciar los compromisos, damos a todos los participantes de la red tiempo suficiente para llegar a un consenso: aunque las solicitudes de transacciones ocurren docenas de veces por segundo, los bloques solo se crean y comprometen en Ethereum una vez cada doce segundos.

Cómo funcionan los bloques

Para preservar el historial de transacciones, los bloques están estrictamente ordenados (cada nuevo bloque creado contiene una referencia a su bloque principal), y las transacciones dentro de los bloques también están estrictamente ordenadas. Excepto en casos raros, en cualquier momento dado, todos los participantes de la red están de acuerdo sobre el número exacto y el historial de los bloques, y están trabajando para agrupar las solicitudes de transacciones en vivo actuales en el siguiente bloque.

Una vez que un validador seleccionado al azar en la red arma un bloque, este se propaga al resto de la red; todos los nodos agregan este bloque al final de su cadena de bloques, y se selecciona un nuevo validador para crear el siguiente bloque. El proceso exacto de ensamblaje de bloques y el proceso de compromiso/consenso están especificados actualmente por el protocolo de "prueba de participación (PoS)" de Ethereum.

Protocolo de prueba de participación (PoS)

La prueba de participación (PoS) significa lo siguiente:

  • Los nodos validadores tienen que depositar en garantía 32 ETH en un contrato de depósito como colateral contra el mal comportamiento. Esto ayuda a proteger la red porque la actividad demostrablemente deshonesta conduce a que se destruya parte o la totalidad de esa participación.
  • En cada slot (espaciados por doce segundos), se selecciona al azar un validador para que sea el proponente de bloque. Agrupan las transacciones, las ejecutan y determinan un nuevo 'estado'. Envuelven esta información en un bloque y la transmiten a otros validadores.
  • Otros validadores que se enteran del nuevo bloque vuelven a ejecutar las transacciones para asegurarse de que están de acuerdo con el cambio propuesto al estado global. Suponiendo que el bloque sea válido, lo agregan a su propia base de datos.
  • Si un validador se entera de dos bloques conflictivos para el mismo slot, utiliza su algoritmo de elección de bifurcación para elegir el que esté respaldado por la mayor cantidad de ETH en participación.

Más sobre la prueba de participación (PoS)

¿Qué hay en un bloque?

Hay mucha información contenida dentro de un bloque. En el nivel más alto, un bloque contiene los siguientes campos:

CampoDescripción
slotel slot al que pertenece el bloque
proposer_indexel ID del validador que propone el bloque
parent_rootel hash del bloque anterior
state_rootel hash raíz del objeto de estado
bodyun objeto que contiene varios campos, como se define a continuación

El body del bloque contiene varios campos propios:

CampoDescripción
randao_revealun valor utilizado para seleccionar al siguiente proponente de bloque
eth1_datainformación sobre el contrato de depósito
graffitidatos arbitrarios utilizados para etiquetar bloques
proposer_slashingslista de validadores a los que se les aplicará un recorte
attester_slashingslista de atestadores a los que se les aplicará un recorte
attestationslista de atestaciones realizadas contra slots anteriores
depositslista de nuevos depósitos al contrato de depósito
voluntary_exitslista de validadores que salen de la red
sync_aggregatesubconjunto de validadores utilizados para servir a clientes ligeros
execution_payloadtransacciones pasadas desde el cliente de ejecución

El campo attestations contiene una lista de todas las atestaciones en el bloque. Las atestaciones tienen su propio tipo de datos que contiene varios datos. Cada atestación contiene:

CampoDescripción
aggregation_bitsuna lista de qué validadores participaron en esta atestación
dataun contenedor con múltiples subcampos
signaturefirma agregada de un conjunto de validadores contra la parte data

El campo data en la attestation contiene lo siguiente:

CampoDescripción
slotel slot al que se refiere la atestación
indexíndices para los validadores que atestan
beacon_block_rootel hash raíz del bloque baliza visto como la cabeza de la cadena
sourceel último punto de control justificado
targetel último bloque de límite de época

La ejecución de las transacciones en el execution_payload actualiza el estado global. Todos los clientes vuelven a ejecutar las transacciones en el execution_payload para asegurarse de que el nuevo estado coincida con el del campo state_root del nuevo bloque. Así es como los clientes pueden saber que un nuevo bloque es válido y seguro para agregarlo a su cadena de bloques. El execution payload en sí es un objeto con varios campos. También hay un execution_payload_header que contiene información resumida importante sobre los datos de ejecución. Estas estructuras de datos se organizan de la siguiente manera:

El execution_payload_header contiene los siguientes campos:

CampoDescripción
parent_hashhash del bloque principal
fee_recipientdirección de la cuenta a la que se pagan las tarifas de transacción
state_roothash raíz para el estado global después de aplicar los cambios en este bloque
receipts_roothash del trie de recibos de transacciones
logs_bloomestructura de datos que contiene registros de eventos
prev_randaovalor utilizado en la selección aleatoria de validadores
block_numberel número del bloque actual
gas_limitgas máximo permitido en este bloque
gas_usedla cantidad real de gas utilizada en este bloque
timestampel tiempo de bloque
extra_datadatos adicionales arbitrarios como bytes sin procesar
base_fee_per_gasel valor de la tarifa base
block_hashHash del bloque de ejecución
transactions_roothash raíz de las transacciones en la carga útil
withdrawal_roothash raíz de los retiros en la carga útil

El execution_payload en sí contiene lo siguiente (tenga en cuenta que esto es idéntico al encabezado, excepto que en lugar del hash raíz de las transacciones incluye la lista real de transacciones y la información de retiro):

CampoDescripción
parent_hashhash del bloque principal
fee_recipientdirección de la cuenta a la que se pagan las tarifas de transacción
state_roothash raíz para el estado global después de aplicar los cambios en este bloque
receipts_roothash del trie de recibos de transacciones
logs_bloomestructura de datos que contiene registros de eventos
prev_randaovalor utilizado en la selección aleatoria de validadores
block_numberel número del bloque actual
gas_limitgas máximo permitido en este bloque
gas_usedla cantidad real de gas utilizada en este bloque
timestampel tiempo de bloque
extra_datadatos adicionales arbitrarios como bytes sin procesar
base_fee_per_gasel valor de la tarifa base
block_hashHash del bloque de ejecución
transactionslista de transacciones a ejecutar
withdrawalslista de objetos de retiro

La lista withdrawals contiene objetos withdrawal estructurados de la siguiente manera:

CampoDescripción
addressdirección de la cuenta que ha retirado
amountcantidad del retiro
indexvalor del índice de retiro
validatorIndexvalor del índice del validador

Tiempo de bloque

El tiempo de bloque se refiere al tiempo que separa los bloques. En Ethereum, el tiempo se divide en unidades de doce segundos llamadas 'slots'. En cada slot, se selecciona un solo validador para proponer un bloque. Suponiendo que todos los validadores estén en línea y sean completamente funcionales, habrá un bloque en cada slot, lo que significa que el tiempo de bloque es de 12 s. Sin embargo, ocasionalmente los validadores pueden estar desconectados cuando se les llama para proponer un bloque, lo que significa que los slots a veces pueden quedar vacíos.

Esta implementación difiere de los sistemas basados en prueba de trabajo (PoW), donde los tiempos de bloque son probabilísticos y se ajustan mediante la dificultad de minería objetivo del protocolo. El tiempo de bloque promedio (opens in a new tab) de Ethereum es un ejemplo perfecto de esto, por el cual la transición de la prueba de trabajo (PoW) a la prueba de participación (PoS) se puede inferir claramente en función de la consistencia del nuevo tiempo de bloque de 12 s.

Tamaño del bloque

Una nota final importante es que los bloques en sí tienen un tamaño limitado. Cada bloque tiene un tamaño objetivo de 30 millones de gas, pero el tamaño de los bloques aumentará o disminuirá de acuerdo con las demandas de la red, hasta el límite de gas del bloque de 60 millones (2 veces el tamaño objetivo del bloque). El límite de gas del bloque se puede ajustar hacia arriba o hacia abajo en un factor de 1/1024 con respecto al límite de gas del bloque anterior. Como resultado, los validadores pueden cambiar el límite de gas del bloque a través del consenso. La cantidad total de gas gastada por todas las transacciones en el bloque debe ser menor que el límite de gas del bloque. Esto es importante porque garantiza que los bloques no puedan ser arbitrariamente grandes. Si los bloques pudieran ser arbitrariamente grandes, los nodos completos de menor rendimiento dejarían gradualmente de poder mantenerse al día con la red debido a los requisitos de espacio y velocidad. Cuanto más grande sea el bloque, mayor será la potencia informática necesaria para procesarlos a tiempo para el siguiente slot. Esta es una fuerza centralizadora, que se resiste limitando el tamaño de los bloques.

Lecturas adicionales

¿Conoce algún recurso de la comunidad que le haya ayudado? ¡Edite esta página y agréguelo!

Última actualización de la página: 23 de febrero de 2026