¿Cómo se calcula el saldo de la dirección?

No parece práctico escanear cada transacción en una cadena de bloques para determinar el saldo de una cuenta. A medida que crece la cadena de bloques, esto parece aún más difícil y requiere más recursos. Quizás todas las transacciones estén agrupadas en lo que solíamos llamar un registro, específicamente un registro de longitud variable. dirección..trans1, trans2, etc...transN para la última transacción.

Tenga en cuenta que para bitcoin, "dirección" y "cuenta" son cosas separadas, ¿de cuál está hablando?

Respuestas (3)

Bitcoin utiliza el llamado modelo UTXO (salida de transacciones no gastadas).
La primera vez no es muy intuitivo porque es diferente del modelo de contabilidad tradicional en el que simplemente gastas y envías a una cuenta.
Piensa en huchas llenas que no se pueden llenar más de lo que son y que tienes que abrir antes de poder gastar el contenido:

  1. Bob tiene 1 alcancía, quiere pagarle a Alicia con la mitad del contenido de la alcancía.
  2. Él rompe su alcancía.
  3. Toma la mitad y se la da a Alice, quien lo pondrá todo en una alcancía nueva que le pertenece.
  4. Pones la mitad restante en una nueva alcancía más pequeña que te pertenece y que está esperando a que la abras.

Cada hucha/UTXO está vinculada a una dirección. Por supuesto, un usuario de Bitcoin puede tener varios UTXO relacionados con su dirección. La suma de los UTXO da la cantidad de bitcoins que posee la dirección (que es una de las funciones de las billeteras).
Cada entrada de transacción es la salida de una transacción anterior. Aunque el software de billetera da la sensación de que "transfiere" bitcoins o satoshis, no gasta de una cuenta , gasta UTXO .
Usted gasta de transacciones realizadas previamente a usted.

Una forma algo más intuitiva de pensar en los cálculos de saldo es pensar que usted usa una billetera fiduciaria real.

Si desea ver cuánto dinero tiene físicamente en este momento , abriría su billetera, sacaría todos los billetes de diferentes denominaciones y los sumaría. Esto le da su saldo.

Bitcoin hace algo similar, donde una dirección es similar a su billetera física. Una misma dirección puede tener varios utxos vinculados. El saldo de esa dirección es la suma de todos los utxos.

La clave aquí es que bitcoin solo rastrea las salidas de transacciones no gastadas . Por lo tanto, para llegar al saldo de la dirección, solo necesita iterar a través de la cadena de bloques, agregar nuevas salidas cuando se crean y eliminar las antiguas cuando se gastan. Además, este es un proceso extensible. Si conoce el conjunto utxo a partir del bloque 100, no necesita volver a calcular desde el bloque 0 para actualizar con los datos del bloque 101. Simplemente puede actualizar su conjunto desde el bloque 100.

Esto nuevamente es similar a cómo usamos billeteras físicas. Nadie realiza un seguimiento de todos los billetes y monedas que ha tenido en el pasado (salidas de transacciones gastadas). Solo llevan la cuenta de lo que tienen actualmente (utxo). Cuando ocurre una nueva transacción (digamos que compra leche), solo actualiza el estado actual de su billetera eliminando una nota y devolviendo el cambio. No necesitas calcularlo desde la primera vez que usaste dinero.

Bitcoin lleva esto un paso más allá y tiene un concepto de cuentas, que son múltiples direcciones que actúan como una billetera. Una analogía similar sería si todos en su casa reunieran el dinero de todas sus billeteras, para que puedan gastarlo como uno solo. De nuevo, el saldo de una cuenta es simplemente la suma del saldo de las direcciones que contiene.

Editar:

Cálculo del saldo de la dirección

El saldo de una dirección se calcula sumando todos los valores de las salidas de transacciones no gastadas (UTXO) que el par de claves correspondiente a esa dirección puede gastar.

Estructura de almacenamiento

Para responder a la pregunta más amplia: "¿por qué escanea cada transacción en toda la cadena de bloques para determinar su saldo?"

El núcleo de Bitcoin no necesita saber el saldo de una dirección para realizar la validación. Sin embargo, debe poder escanear todas las salidas de transacciones anteriores para validar las nuevas. Para hacer esto, escanea una base de datos indexada generada (por txid) de todas las transacciones para las salidas anteriores a las que hace referencia una nueva transacción y verifica que la firma satisface la salida anterior (UTXO). Tenga en cuenta que esto solo requiere escanear salidas no gastadas, no todas las transacciones.

La optimización de este almacenamiento de datos para el cálculo del saldo mediante la indexación por dirección y txid podría facilitar el cálculo del saldo, pero no es necesario para la validación y sería a expensas de la eficiencia de la verificación de transacciones. Es mejor dejar esto a una aplicación de billetera por el bien de la red.

Respuesta anterior:

La respuesta anterior explica cómo indexar transacciones en el núcleo de bitcoin, lo que puede ayudar a una billetera o a un explorador de bloques a determinar el saldo de una dirección de manera más eficiente.

Puede indexar las transacciones en la cadena de bloques para que sea más fácil buscarlas. Bitcoin-core permite esto usando la -txindex=1bandera.

De la Wiki de Bitcoin :

txindex| Mantener un índice de transacción completo, utilizado por la llamada rpc getrawtransaction (predeterminado: 0)

Esto no tiene nada que ver con los saldos de direcciones.
Estoy de acuerdo, el título no parece coincidir con la pregunta. La pregunta habla más sobre la practicidad de escanear todas las transacciones y cómo podría hacerse.
Y la respuesta no tiene relación con eso, porque el txindex ni siquiera se usa para la validación.
Sí, eso tiene sentido, la pregunta es de más alto nivel.
Acabo de actualizar la respuesta para abordar mejor la pregunta.
No se utiliza ningún índice de txids (o índice alguno) en ningún momento durante la validación.
¿Esta respuesta se refiere a un índice utxo diferente, entonces? bitcoin.stackexchange.com/a/29782/60443
Bitcoin Core mantiene una base de datos de todas las salidas de transacciones no gastadas. No es un índice, ya que no indexa en nada más. No se accede a las transacciones o bloques originales que crearon las salidas que se están gastando. Es simplemente agregar nuevos resultados a la base de datos y eliminar los que se gastan.