Verificación de datos de transacciones de Bitcoind

Me encuentro víctima de mis pobres habilidades para buscar en Google o de la falta de detalles en los bitcoinddocumentos.

Tengo un walletNotifyscript que se ejecuta en un nodo completo que cada vez que llega una transacción hacia / desde mi billetera, realiza una getRawTransaction(txid, 1)transacción en la ID de transacción pasada.

Ahora, si alguna de mis direcciones aparece dentro de la voutmatriz, sé que esa transacción es un depósito. Lo que me gustaría verificar es que efectivamente puedo gastar esos bitcoins.

Leí sobre transacciones no estándar (específicamente, transacciones no gastables) y entré en pánico, así que mis preguntas son:

  1. ¿ bitcoindRealiza algún tipo de verificación sobre la "gastibilidad" de los bitcoins que llegan?
  2. ¿Hay alguna manera fácil de verificar esto yo mismo? ¿Hay alguna manera no necesariamente fácil ?

¡Muchas gracias por adelantado!

Respuestas (2)

Bitcoind solo raspa la cadena de bloques para algunos tipos de transacciones: Pay-to-pubkey, pay-to-pubkey-hash y pay-to-script-hash. Si revisa https://en.bitcoin.it/wiki/Script , verá muchos más operadores de secuencias de comandos que se pueden usar, por lo que el protocolo no es solo esos tres tipos de secuencias de comandos.

Dado que los guiones tienen una forma muy definida, su cliente buscará los casos en los que los pagos se dirijan a USTED en lugar de a otros.

OP_DUP OP_HASH160 <hash de 20 bytes> OP_EQUALVERIFY OP_CHECKSIG

Si se enviaran bitcoins a este script pero con otras operaciones de script al final, su nodo no los informaría como gastables.

  1. Verificar esto usted mismo es fácil si ya tiene un intérprete de script completamente correcto y en funcionamiento. Puede buscar salidas no estándar, ya que en ocasiones se extraen.

Sin embargo, reproducir el intérprete de secuencias de comandos de bitcoind, con compatibilidad error por error, es complicado. Ciertos clientes se han bifurcado de la cadena de bloques al no seguir todas las peculiaridades de la implementación de referencia.

Pero si tiene esto, puede escribir su propio nodo si lo desea. Escuche nuevos bloques de la red, o simplemente de bitcoind. Utilice su intérprete de secuencias de comandos para asegurarse de que las transacciones en los bloques nuevos sean válidas, estén firmadas correctamente, etc. Una vez que esté seguro de que la cadena de bloques con la que termina es correcta, puede analizar los casos que bitcoind ignora y gastarlos si puede.

¡Hola! pido disculpas por la demora. Entonces, ¿qué quiere decir con que ni siquiera recibiré una notificación cuando llegue una de esas transacciones no estándar? o que no aparecerán entre mis UTXOs? Tener un intérprete de script que funcione (error por error) ni siquiera es necesariamente fácil: P
No, su nodo no podría identificarlo como si tuviera algo que ver con su billetera. Dependiendo de su caso de uso, tal vez podría usar txindex=1 y la devolución de llamada blocknotify. Activaría un script, pasando el bloque hash como argumento. Decodifique cada transacción sin procesar (¿por qué necesita txindex), busque salidas cuyos scripts coincidan con lo que desea y luego cree su transacción de canje?

No se preocupe demasiado por las salidas no prescindibles, son principalmente una forma de almacenar un poco de datos adicionales en la cadena de bloques o de destruir bitcoins. Si alguien le envió una transacción que tenía una salida de TX no gastable, eso no sería malo, siempre que las monedas reales que estaba enviando tuvieran lugar en las otras salidas de TX.

  1. ¿Bitcoind realiza algún tipo de verificación sobre la "gastibilidad" de los bitcoins que llegan?

Sí, es necesario para determinar el saldo de su billetera. Por ejemplo, si envío a 2 de 3 direcciones multisig para las que solo tengo una de las claves, el cliente bitcoind no registrará eso en su saldo, pero si tengo 2 de las 3 direcciones, incluirá transacciones para esa dirección en mi saldo.

  1. ¿Hay alguna manera fácil de verificar esto yo mismo? ¿Hay alguna manera no necesariamente fácil?

¡Hay una manera fácil! Si su saldo cambia, entonces recibió monedas. Si está tratando de hacer una dirección de solo observación, donde está tratando de buscar cambios en un 'saldo de dirección' (a falta de un término mejor) de una dirección para la que no tiene la clave privada, entonces podría intentar obtener el scriptPubKeyshexágono, que debería coincidir exactamente con lo scriptPubKeyque espera.

¡Gracias por responder! Pero me interesa saber qué pasaría si alguien me enviara, digamos, 1 BTC con un script tal que nunca gastaría esa moneda... ¿ bitcoindprocesa el script para actualizar el saldo? algun guion? incluso los no estándar? (los scripts multisig son scripts un poco estándar a este respecto)
Bueno, se asegura de poder gastarlos para poder agregarlos a su saldo, pero solo sabe cómo gastar las transacciones estándar. ¿En qué tipo de transacción está pensando que acreditaría su dirección pero no sería una transacción estándar?
Bueno, cualquiera de: en.bitcoin.it/wiki/… , en.bitcoin.it/wiki/Script#Anyone-Can-Spend_Outputs , o en.bitcoin.it/wiki/Script#Transaction_puzzle sería problemático :P Ahora, No digo que alguien tire alegremente sus monedas solo para intentar molestarme, pero es mejor prevenir que curar :)
De acuerdo, más vale prevenir que lamentar. Esas no son transacciones estándar, por lo que no se registrarán en su saldo. Creo que su solución es simplemente ver cuándo cambia su saldo.
Hmm, ¿qué pasa si tengo muchas transacciones al mismo tiempo? Verificar los cambios de saldo parece que podría marcar erróneamente una transacción como recibida cuando muchas están ocurriendo al mismo tiempo.
No estoy seguro de lo que quieres decir, pero puedes confiar en que el daemon hará su trabajo, ¡pruébalo! :) Si su script walletnotify verifica su último saldo y si es diferente del saldo actual, guarda el nuevo saldo y le envía una notificación. Espero que mi respuesta haya ayudado.
Lo que quise decir fue: mientras estoy procesando walletNotify para Tx "A" no estándar, también entran Tx "B" estándar, el saldo se actualiza, en el momento en que verifico el saldo mientras procesa "A", asumo que todo funcionó bien, y aceptar "A", cuando en realidad era "B" el que cambiaba la balanza. Confío en el demonio, el hecho es que es difícil confiar en algo de lo que no sabes mucho;)
@mpr, marque esto como la respuesta si le ayudó.
Aunque su respuesta brindó cierta claridad, sigue siendo una conjetura y no una respuesta completa en sí misma. Si desea proporcionar una respuesta completa con fuentes verificables (ya sea una nueva o una edición de esta misma respuesta), con gusto la marcaré como aceptada y le enviaré el representante :)