¿Cuándo actualiza Bitcoin el conjunto UTXO?

Estoy un poco confundido con algo. Espero que me lo puedas aclarar...

Digamos que quiero hacer una transacción. Entonces mi billetera de intercambio hace eso por mí. La forma en que lo hace es que primero toma la lista de UTXO (digamos que la tiene en el disco D ), toma los que se pueden usar y, al usar esos UTXO, crea una transacción con las entradas válidas. Luego, esta transacción va al mempool del nodo. Luego, cuando comienza a extraer un bloque, el nodo toma esas transacciones, las coloca en un bloque y comienza la extracción.

Pregunta 1) ¿cuándo se actualizará la lista UTXO en el disco D ? ¿Antes de poner una transacción en un mempool, o después de que un minero resuelve un bloque o tal vez en ese momento cuando el minero obtiene transacciones del mempool?

Si la respuesta es: antes de colocar una transacción en un mempool, entonces, las cosas se complican porque si ese nodo no resuelve el bloque, existe la posibilidad de que la actualización de UTXO no debería haber ocurrido, lo que significa que el nodo revertirá el utxo volver a lo que era.

Si la respuesta es: después de que un minero resuelve un bloque, entonces es posible que mi nodo me permita hacer la misma transacción dos veces, ya que antes de crear una transacción, verifica la lista de UTXO.

Si la respuesta es: cuando un minero toma transacciones de mempool, entonces esto es bastante incorrecto, ya que mempool ya contiene transacciones validadas.

¿Qué opinas?

ACTUALIZAR PREGUNTA:

Digamos que tengo 1 BTC y publiqué una transacción de 1 BTC para Bob en el nodo A y la misma transacción de 1 BTC para Alice en el nodo B.

Entonces, digamos que la transmisión de transacciones no ocurrió, entonces ellos (nodoA, nodoB) no conocen la transacción del otro.

Ahora, el nodo A extrajo primero un bloque y lo transmitió. nodeB recibió este bloque. Ahora, nodeB usa muchos UTXO diferentes como dijiste. Una verificación que se realiza es que el nodo B recorre las transacciones del bloque del nodo A y si se puede encontrar alguna de las transacciones (compara las identificaciones de transacciones) en su mempool, la elimina. Ahora, ¿cómo eliminará el nodo B la transacción a Alice (que ahora es un gasto doble)? ¿Cómo se llega a esta conclusión?

Respuestas (1)

Esto depende de la implementación, pero en Bitcoin Core no hay un solo conjunto de UTXO:

  1. El conjunto UTXO en el disco en el chainstate/directorio de una base de datos. Corresponde al estado del último bloque vaciado (y no incluye los efectos de ninguna transacción de mempool o de ningún bloque desde el último vaciado).
  2. El caché de monedas en memoria es un caché en la parte superior del conjunto UTXO en el disco (1), con gastos/creaciones de bloques recientes sin vaciar aplicados. Solo almacena físicamente los valores modificados; consultarlo por otros UTXO provocará una lectura de la base de datos del disco (1) en su lugar.
  3. El mempool define implícitamente otro conjunto UTXO además de (2). Esto no se materializa en absoluto: al consultar, solo verificamos si (2) o el mempool tiene la salida de transacción solicitada Y si no hay ninguna transacción de mempool que lo gaste. El mempool siempre se mantiene consistente con la cadena de bloques (por ejemplo, si se confirma una transacción que entra en conflicto con una transacción de mempool, esa transacción de mempool se elimina).
  4. Durante el procesamiento de un bloque, se mantiene un caché temporal de cambios de UTXO, como un parche encima de (2). Esto permite que los bloques gasten salidas creadas por ellos mismos, mientras que si un bloque no es válido por cualquier motivo, ese caché temporal puede descartarse sin hacer un trabajo adicional. Solo si el bloque es realmente completamente válido, los cambios de este caché temporal se fusionan en (2) y el mempool (3) se actualiza para ser consistente con el resultado.
  5. Los monederos conceptualmente también mantienen su propio conjunto de UTXO (que el propietario vigila y/o gasta), aunque no utilizan la misma interfaz en el código base. Esto es necesario porque una billetera puede contener transacciones que no están confirmadas y no están en el mempool (por ejemplo, porque se eliminaron debido a un desalojo, pero aún queremos volver a intentar insertarlas).

Finalmente, es importante tener en cuenta que cada nodo tiene su(s) propio(s) conjunto(s) de UTXO. Su propia billetera/nodo no actualizará nada cuando un minero (¿cuál?) comience a incluir su transacción en sus bloques candidatos; ni siquiera tiene forma de saber que lo están haciendo.

Pieter, muchas gracias por una gran respuesta. Agregué solo una pregunta, vea la pregunta nuevamente. Realmente agradecería la respuesta lo antes posible. Gracias de antemano.
Creo que respondí eso en el punto 3: el mempool siempre se mantiene consistente con el mejor bloque aceptado. Cuando el nodo B recibe el bloque del nodo A, se acepta como el mejor bloque. Cualquier cosa que esté en el mempool de nodeB que entre en conflicto con ese nuevo bloque será desechada.
Sí, pero la comparación de transacciones con txid entre la transacción de bloques del nodo A y entre el mempool del nodo B no ocurrirá ya que las identificaciones de mis transacciones de doble gasto son diferentes. ¿Estás de acuerdo con lo que acabo de decir? el nodoB recibirá el bloque del nodoA (actualizará el utxo del disco - 1 escriba su respuesta) y luego, el nodoB recorrerá las transacciones de su mempool y aplicará la verificación nuevamente para cada transacción dependiendo del utxo recién actualizado, si falla (debido a que no hay suficiente saldo, se eliminará del mempool). correcto ?
y otro. Entonces, si tuviera 2 BTC y publiqué una transacción de 1 BTC en un nodo y otra de 1 BTC en otro nodo, ambos serán aceptados en la cadena de bloques final, ya que la verificación anterior que mencioné no fallará. correcto ?
No hay saldos en Bitcoin. Los UTXO se crean una vez y se gastan una vez en su totalidad. Cualquier transacción de mempool que gaste un UTXO que ya no existe después de que se recibió un bloque se eliminará del mempool.
Sí, mencioné el equilibrio para una comprensión más fácil. Entonces, si tuviera 2 BTC y publiqué una transacción de 1 BTC en un nodo y otra de 1 BTC en otro nodo, ambos serán aceptados en la cadena de bloques final, ya que la verificación anterior que mencioné no fallará. correcto ?
Estás perdiendo el punto. Los números no importan. No hay saldos, hay UTXO. Si tx T tuviera una salida, independientemente de su cantidad, esa salida se puede gastar una vez. Si tuviera dos salidas, cada una de esas salidas se puede gastar una vez, posiblemente en transacciones distintas o incluso en bloques distintos. Una transacción entra en conflicto con otra transacción si directa o indirectamente gastan la misma salida.
Entiendo. Mi punto es que si tengo 2BTC y transfiero 1btc a alice en el nodoA, y 1btc a bob en el nodoB (supongamos que la transmisión de la transacción no ocurre). lo que podría pasar es que uno de ellos aún podría ser rechazado. bien ? ya que podrían haber usado las mismas salidas para las entradas. correcto ?
Depende de si esos 2 BTC estaban en una o varias salidas. Si solo hubiera una salida, entonces una transacción que moviera 1 BTC a alice gastaría la salida de 2 BTC y crearía una salida de 1 BTC asignada a alice y otra salida de 1 BTC de regreso al remitente. Cuando se confirma esa transacción, los 2 BTC ya no existen y nada más puede gastarlos. En su lugar, una nueva transacción necesitaría gastar la salida de cambio de 1 BTC. Si hubiera dos salidas de 1 BTC para empezar, y las transacciones gastaran cada una, entonces esas transacciones no necesariamente entrarían en conflicto.
Pieter, esta discusión me llevó a algo. Digamos que en un bloque de génesis, solo hay 1 transacción, 50 BTC a mi dirección: addr123. ¿Puedo hacer 2 transacciones inmediatamente para que esas 2 transacciones terminen en el segundo bloque? La forma en que esto funcionaría es después de crear la primera transacción, utxo se actualizaría. y la segunda transacción usaría una salida diferente. ¿Cuál es tu pensamiento?
Bueno, el bloque de génesis no tiene salidas (intencionalmente o debido a un descuido en el código base original). Ignorando eso, si tiene un solo UTXO de 50 BTC, sí puede construir dos transacciones que pueden terminar en el mismo bloque. El primero gastaría los 50 BTC y crearía, por ejemplo, una salida de 10 BTC y 40 BTC para usted. Otra transacción gastaría la salida de 40 BTC y crearía, por ejemplo, una salida de 5 BTC y una salida de 35 BTC. Estas dos transacciones pueden aparecer legalmente en el mismo bloque, y el efecto neto es dividir 50 BTC en 10 BTC + 5 BTC + 35 BTC.
La razón por la que pregunté esto es porque tal vez la salida solo se pueda usar si esa salida ya está incluida en una cadena de bloques. En mi ejemplo de creación de 2 transacciones, la salida de la segunda transacción no estará en blockchain. Será solo en el utxo temporal que se actualizó con la primera transacción. Entonces, supongo que la segunda transacción aún puede ser válida al usar la salida de la transacción que aún no se ha extraído. Bien ?
Sí, expliqué esto en el punto 4: es por eso que se usa un conjunto UTXO temporal durante la validación de un bloque: las transacciones en un bloque pueden gastar salidas creadas por transacciones (anteriores) en el mismo bloque (y también no gastar salidas que ya estaban gastado en el mismo bloque).