¿Cómo se ordenan correctamente las txns en los árboles de Merkle entre nodos y se validan a través de la Prueba de trabajo?

Estoy interesado en saber exactamente qué sucede con las transacciones en el bloque pendiente (bloque que se está minando en ese momento). Por lo que entiendo, las transacciones se almacenan como un hash de árbol de Merkle dentro del bloque, junto con el hash principal, la marca de tiempo y el nonce. Durante la minería, el minero está procesando los datos del bloque con diferentes nonces tratando de lograr el hash objetivo. Supongo que lo que están procesando son todos los datos del bloque, incluida la raíz de Merkle. Pero la raíz Merkle debe ser diferente para cada minero/nodo debido al orden de transacción y la transacción de generación, entonces, ¿cómo llegan a un consenso otros nodos si sus transacciones son diferentes? Hay un agujero en mi entendimiento.

Además, cuando las transacciones se transmiten a través de la red, los nodos las recibirán en diferentes momentos debido a la latencia de la red, etc. y los mineros pueden reorganizar el orden de las transacciones debido a los incentivos de las tarifas, pero esto cambia la raíz de merkle. Entiendo que los mineros prueban que han hecho el trabajo para validar las transacciones, pero ¿qué pasos toman otros nodos para que parezcan legítimos? Me imagino que usarían el nonce proporcionado por el creador del bloque para codificar su propia copia del bloque y ver si está dentro del objetivo.

Además, si PoW se realiza en los datos del bloque con la raíz Merkle, ¿cómo se pueden agregar nuevas transacciones al bloque? ¿No tendría que volver a hacerse el hash del árbol y el PoW tendría que empezar desde el principio? ¿Un minero espera que se alcance el límite de tamaño de bloque antes de realizar PoW? No entiendo cómo se puede hacer PoW en un flujo dinámico de transacciones, y cómo cada nodo puede tener exactamente el mismo conjunto de todo para hacer PoW.

¿Alguien puede explicar lo que me estoy perdiendo? ¿Cómo se ordenan las transacciones por diferentes nodos? ¿Cómo ingresan las transacciones al árbol merkle? ¿Cómo validan otros nodos el nuevo bloque?

muchas gracias

Respuestas (1)

Pero la raíz de merkle debe ser diferente para cada minero/nodo debido al orden de transacción y la transacción de generación,

Correcto.

Entonces, ¿cómo llegan a un consenso otros nodos si sus transacciones son diferentes?

ellos no Cada minero es totalmente responsable de la elección de sus propias transacciones. No es necesario que diferentes mineros estén de acuerdo con la selección de la transacción. El minero ganador decide el contenido del bloque ganador, y otros aceptan su selección de transacción (a menos que las transacciones incluidas sean objetivamente inválidas, lo que hace que el bloque no sea válido para los mineros y otros nodos).

Me imagino que usarían el nonce proporcionado por el creador del bloque para codificar su propia copia del bloque y ver si está dentro del objetivo.

Hay muchas reglas de validez de bloque que realizan todos los nodos, incluida la verificación de la prueba de trabajo, como usted dice. Otras reglas incluyen verificar que todas las transacciones sean válidas, que no haya habido robo, que no haya doble gasto, que no se imprima dinero por bloque (más allá del subsidio permitido),...

¿No habría que volver a triturar el árbol?

Sí.

Hay una serie de capas involucradas en la actualización del bloque de candidatos de un minero. Cada uno es mucho más rápido que el anterior, pero se hace con mucha más frecuencia:

  1. Por lo general, el software de minería ocasionalmente (digamos, cada pocos segundos) crea una nueva plantilla de bloque para trabajar, que incluye la selección de transacciones.

  2. Una capa intermedia cambia la transacción de la base de monedas (que incluye la dirección de pago, así como un "nonce adicional") de vez en cuando. Cada vez que esto sucede, la raíz de Merkle cambia. Sin embargo, al almacenar en caché los nodos internos del árbol de Merkle que están justo a la derecha de la rama más a la izquierda en el árbol, esto es solo un trabajo de O (log (n)) en la cantidad de transacciones (por ejemplo, un bloque con 2048 transacciones solo necesita 11 hash pasos para volver a calcular la raíz de Merkle).

  3. La capa de hardware de nivel más bajo recorre los 2 32 nonces en el encabezado del bloque, todos con la misma raíz de Merkle. Esto es extremadamente eficiente.

y el PoW tendría que empezar desde el principio.

Sí, pero esto es irrelevante. PoW no tiene "progreso". No pierdes nada por empezar de nuevo, siempre y cuando sigas probando hachís todo el tiempo. Cada bloque candidato que pruebe (combinación de selección de tx, coinbase tx, nonce) tiene una probabilidad independiente de alcanzar el objetivo de PoW (una probabilidad igual a 2 256 / objetivo). Si esa posibilidad es 1/c, y realiza h hashes por día, encontrará un bloque h/c por día, independientemente de las transacciones para las que sean esos intentos.

¡Gracias Peiter! Respuesta muy útil de hecho. Entiendo que los bloques se suponen legítimos a menos que se rechacen después, lo que provoca una bifurcación. ¿Cómo obtienen los nodos la información de transacciones del bloque que se acaba de minar para validarlos? ¿Los nodos completos tienen que almacenar transacciones en texto sin formato y otros nodos solicitan esta información? No entiendo cómo se pueden encontrar transacciones desde una raíz de merkle, tendría que ser "sin hash". En cuanto a la confirmación de transacciones a través de criptografía, ¿esto se realiza en los nodos antes de que se agreguen al árbol merkle? ¿O en el mempool de alguna manera? Gracias
Agregando a mi comentario; Entiendo que la raíz de merkle es parte del encabezado del bloque y los nodos completos almacenan txns. ¿Los nodos pueden verificar la inclusión de transacciones en un árbol merkle solo desde su raíz? ¿Cómo es esto posible cuando la raíz es un hash que es unidireccional? Del mismo modo, ¿cómo obtienen los exploradores de blockchain la información de las transacciones (entrada, salida, etc.) con solo el ID de la transacción?
Los nodos solicitan los datos del bloque completo entre sí cuando transmiten un nuevo bloque. Verifican la raíz de Merkle recalculándola a partir de las transacciones.