¿Cómo identifica la billetera qué UTXO pertenecen a una dirección pública al crear una nueva transacción?

Soy un principiante aquí. La salida de una transacción tiene un campo para el monto y un script de bloqueo, pero no tiene un campo directo para la dirección pública a la que está destinada la salida. Cuando se crea una nueva transacción, la billetera busca en el conjunto UTXO las salidas que están bloqueadas en una de las direcciones públicas de la billetera.

Mi pregunta es, ¿cómo sabe la billetera, mientras busca, que un UTXO en particular está bloqueado en su dirección pública?

¿Comprueba cada UTXO mediante un script de desbloqueo para saber si está bloqueado en su dirección pública?

¿O mantiene una base de datos separada que asigna direcciones públicas a UTXO destinadas a él, o algo similar para una búsqueda más rápida?

¿Cómo encuentra este subconjunto de UTXO que está bloqueado en la dirección pública?

Respuestas (3)

La salida de una transacción tiene un campo para el monto y un script de bloqueo, pero no tiene un campo directo para la dirección pública a la que está destinada la salida.

Esto no es del todo correcto y parece ser la fuente de la confusión. Un "script de bloqueo" contiene la parte esencial de una dirección rodeada de los comandos adicionales necesarios para bloquear (o gravar ) los bitcoins en esa salida a la dirección. Veamos un ejemplo; primero obtenemos una dirección:

$ bitcoin-cli getnewaddress
397yNmAFc1w6AK1gqkKNxJPb44jnvznm2b

Entonces, preguntemos a la billetera qué sabe sobre esta dirección:

$ bitcoin-cli validateaddress 397yNmAFc1w6AK1gqkKNxJPb44jnvznm2b
{
  "isvalid": true,
  "address": "397yNmAFc1w6AK1gqkKNxJPb44jnvznm2b",
  "scriptPubKey": "a91451812710fc166bf61033afc0d2a8d7cda7a0fd8c87",
  "isscript": true,
  "iswitness": false
}

Tenga en cuenta el scriptPubKey --- eso es lo que está llamando el "script de bloqueo". Veamos qué dice ese script:

$ bitcoin-cli decodescript a91451812710fc166bf61033afc0d2a8d7cda7a0fd8c87
{
  "asm": "OP_HASH160 51812710fc166bf61033afc0d2a8d7cda7a0fd8c OP_EQUAL",
  "reqSigs": 1,
  "type": "scripthash",
  "addresses": [
    "397yNmAFc1w6AK1gqkKNxJPb44jnvznm2b"
  ]
}

El asmcampo es la forma interpretada del script de bloqueo; OP_HASH160y OP_EQUALson dos partes del gravamen de estilo P2SH para direcciones que comienzan con un 3. El valor en el medio 5181...fd8ces la forma hexadecimal del componente esencial de la dirección (otras partes de la dirección son un byte de versión y una suma de verificación; estos no son No es necesario poner el script de bloqueo).

Entonces, en resumen, la dirección 397yNmAFc1w6AK1gqkKNxJPb44jnvznm2bes una representación de lo mismo que scriptPubKey a91451812710fc166bf61033afc0d2a8d7cda7a0fd8c87. La scriptPubKey son los datos que realmente se colocan en la salida para indicar que un determinado conjunto de bitcoins está controlado por el propietario de la dirección correspondiente.

¿Cómo encuentra este subconjunto de UTXO que está bloqueado en la dirección pública?

Una billetera que es parte de un nodo completo simplemente escanea cada transacción que recibe el nodo completo para ver si alguna de sus salidas paga una de las scriptPubKeys (direcciones) de esa billetera. Si lo hace, la billetera guarda ese UTXO en su propia base de datos hasta que sea el momento de gastarlo.

Las billeteras livianas generalmente solicitan nodos completos o servidores para ayudarlos a encontrar los resultados. A veces, esto implica escanear bloques básicamente de la misma manera que lo hace la billetera de nodo completo con algunos pasos adicionales (ver BIP37 ), a veces el servidor construye una base de datos gigante de cada dirección que se ve y realiza consultas de búsqueda en ella (ver servidores Electrum ), y a veces el El nodo completo crea un índice muy compacto y lo envía al cliente ligero para que el cliente pueda solicitar bloques que puedan contener sus transacciones (ver BIP158 ).

En particular, las billeteras necesitan saber qué UTXO le pagó para mostrarle su saldo, por lo que las billeteras no buscan UTXO cuando gastan , las buscan cuando reciben.

Muchas gracias. Mi comprensión del "script de bloqueo" era incorrecta. Gracias de nuevo por la ayuda. :)

El script de UTXO contiene una clave pública (en las salidas P2PK, que ya no se usa realmente) o un HASH_160 de la clave pública o el script de canje. Las salidas de Segwit contienen de manera similar un hash del script testigo (aunque este es un SHA256, no HASH_160).

Su billetera sabe qué scripts y claves de canje contiene, y puede calcular los valores hash relevantes. Luego, simplemente verifica nuevos bloques para ver si alguna salida coincide con una para su billetera. No necesita intentar desbloquear ninguna salida.

Dado que la billetera escanea los bloques a medida que ingresan (y la cadena la primera vez que se crea), puede mantener un conjunto UTXO local. Esto significa que no necesita buscar en toda la cadena cada vez que desee realizar un tx.

La salida de una transacción tiene un campo para el monto y un script de bloqueo, pero no tiene un campo directo para la dirección pública a la que está destinada la salida.

Una forma de la dirección se incluye en el script.

El tipo de script al que te refieres es pay-to-public-key-hash (P2PKH). Su condición de bloqueo (secuencia de comandos de salida) requiere que el beneficiario proporcione una firma que coincida con una clave pública identificada por su valor hash.

OP_DUP OP_HASH160 <pubkeyhash> OP_EQUALVERIFY OP_CHECKSIGNATURE

La condición de desbloqueo en el script de entrada proporciona la clave pública y la firma.

<signature> <pubkey>

Primero se ejecuta la condición de desbloqueo, luego la condición de bloqueo, lo que genera este script de validación:

<signature> <pubkey> OP_DUP OP_HASH_160 <pubkeyhash> OP_EQUALVERIFY OP_CHECKSIGNATURE

Mi pregunta es, ¿cómo sabe la billetera, mientras busca, que un UTXO en particular está bloqueado en su dirección pública?

La billetera conoce la clave pública que quiere buscar. A partir de la clave pública, puede generar <pubkeyhash>. Usando el hash, puede consultar un conjunto de salidas en busca de bloqueos P2PKH que coincidan con el hash de la clave pública.