¿Un bloque contiene la lista de transacciones? ¿O solo el árbol de Merkle?

Me preguntaba cómo un bloque codifica su conjunto de transacciones. Sé que se genera un Merkle Tree y que codifica una versión Hashed de las transacciones. Pero, ¿el Merkle Tree está incluido en el Bloque que se envía a los otros nodos para su validación? ¿Hay una lista de transacciones que también envió?

En mi entendimiento, cuando un Nodo desea 'Mine', ellos:

  1. Generar un nuevo bloque
  2. Crear una transacción de base de monedas
  3. Reúna un subconjunto de las otras transacciones incompletas (aquellas que aún no se han colocado en un bloque) de su copia de la cadena de bloques.
  4. Genere un Merkle Tree usando las transacciones de los pasos 2 y 3
  5. Incremente un Nonce repetidamente hasta que el Hash del <Previous Hash, Nonce, Transactions from 4>comienzo con un cierto número de 0s.

Parece que para validar cada transacción individual (para garantizar que el dinero no se gaste dos veces), sería bueno incluir una lista de transacciones. Pero para verificar que la prueba de trabajo realmente se haya completado, los otros nodos necesitan que el árbol Merkle se ejecute rápidamente.

Es muy posible que también haya una forma de obtener la lista de transacciones de un árbol Merkle, pero no entiendo cómo es ese proceso.

PD: estoy construyendo mi propia implementación de demostración de Python de una moneda de cadena de bloques, de ahí las preguntas más teóricas/menos prácticas.

Gracias.

Respuestas (2)

No puede obtener una lista de transacciones del árbol Merkle.

La raíz del árbol merkle es parte del encabezado del bloque, que como dijiste, permite una verificación rápida de la prueba de trabajo.

Después del encabezado del bloque, cada bloque contiene una lista de transacciones serializadas en el orden en que aparecen en el árbol Merkle. Un bloque completo es un encabezado de bloque + lista de transacciones.

Al validar un bloque, los nodos verificarán:

  1. La prueba de trabajo (esto se puede hacer solo con el encabezado del bloque. Sin embargo, solo porque el encabezado del bloque valida, no significa que el bloque sea válido)
  2. El árbol merkle: los nodos tomarán la lista de transacciones y reconstruirán el árbol merkle para garantizar que la raíz coincida con lo que está en el encabezado.
  3. Cada transacción individual: las entradas y salidas individuales se validan para garantizar que cumplan con las reglas de la red y que no existan gastos dobles.
Responde perfectamente a mi pregunta.

Para validar un bloque, los nodos deben tener las transacciones reales, incluso una lista es insuficiente.

Pero la pregunta "¿Contiene un bloque X?" es un poco como preguntar "¿Cuál es el sonido de una mano aplaudiendo?". Sería válido decir que un "bloque" no es más que su encabezado de bloque o incluso que ese hash de un bloque es "el bloque". No puede validar un bloque solo a partir de su hash o su encabezado, al igual que no puede validar un bloque sin los datos que aprendió de los bloques anteriores, pero la forma en que obtiene esos datos depende de usted y de la(s) parte(s). ) que le informan sobre el bloque.

Esto es relevante porque hoy en la red de Bitcoin, los bloques generalmente se transmiten sin enviar las transacciones de acuerdo con BIP152; en su lugar, asumimos que el proceso regular de transmisión de transacciones ya le ha dado a cada nodo la mayoría o todas las transacciones y envía a nuestros pares una representación compacta. eso les permite usar sus mempools para descubrir qué había en el bloque. Si les faltan algunos de los datos que necesitan, pueden solicitarlos.