Cheques para verificar el dinero enviado a cualquier dirección en una transacción

Estoy usando un demonio de bitcoin sin billetera (simplemente sincroniza la cadena de bloques): el propósito es leer bloques y transacciones en ellos y hacer algunas cosas útiles. Esta pregunta en particular está enfocada a determinar los controles a realizar para verificar el monto recibido por cada domicilio en una determinada transacción.

Dado tx, llamo a decoderrawtransaction(getrawtransaction(tx)) y recibo los siguientes detalles (json):

{
"txid" : "691cb3d61192c7325f203fe14d3d5cf6e98e6bd81877b166f6c37fd629aaa4fb",
"version" : 1,
"locktime" : 0,
"vin" : [
    {
        "txid" : "0c0b442e866f007a0da8a2c1abbe8afad8e96217105b561b097aa835b73a6b70",
        "vout" : 0,
        "scriptSig" : {
            "asm" : "3045022100eb01c02b4655c96b08544908bd44d1fbc165971bdc25705ba1b4790c60716dfa022024adeb306f66a72a2a90455035940b89e7c96c8300b6f73f3ae83af605b9c35d01 03ca8ff2ad5114e703d07b3cee962d54609c1de95fd4511e53de91ba0ce35ef4ee",
            "hex" : "483045022100eb01c02b4655c96b08544908bd44d1fbc165971bdc25705ba1b4790c60716dfa022024adeb306f66a72a2a90455035940b89e7c96c8300b6f73f3ae83af605b9c35d012103ca8ff2ad5114e703d07b3cee962d54609c1de95fd4511e53de91ba0ce35ef4ee"
        },
        "sequence" : 4294967295
    }
],
"vout" : [
    {
        "value" : 0.01000000,
        "n" : 0,
        "scriptPubKey" : {
            "asm" : "OP_DUP OP_HASH160 8bab392bcc5cfce30affc16336cdd68e807147a2 OP_EQUALVERIFY OP_CHECKSIG",
            "hex" : "76a9148bab392bcc5cfce30affc16336cdd68e807147a288ac",
            "reqSigs" : 1,
            "type" : "pubkeyhash",
            "addresses" : [
                "mtFTLXKfDxHuJT36cHugYTZw5CVLejqccq"
            ]
        }
    },
    {
        "value" : 0.04000000,
        "n" : 1,
        "scriptPubKey" : {
            "asm" : "OP_DUP OP_HASH160 d86064ea608dd1ceeae690e548979b854ca55360 OP_EQUALVERIFY OP_CHECKSIG",
            "hex" : "76a914d86064ea608dd1ceeae690e548979b854ca5536088ac",
            "reqSigs" : 1,
            "type" : "pubkeyhash",
            "addresses" : [
                "n1F3j5MdfSLSgpUnaQXNVJb8KBMvnfBYPr"
            ]
        }
    }
]
}

Puedo ver que cada registro txout da la cantidad como un valor (escalar) y las direcciones como una matriz.

  1. Si la matriz de direcciones tiene varios valores, es un contrato (quizás una transacción m-to-n) y no debería considerar que ninguna de las direcciones recibió el dinero para gastarlo de inmediato.
  2. Suponiendo que las direcciones tienen un solo valor, ¿qué otras comprobaciones debo hacer para verificar que la dirección ha recibido la cantidad mencionada en el campo 'valor'?

Entonces, necesito conocer un conjunto de todos los controles para verificar que la transacción esté confirmada, sea válida y que una dirección particular en un txout particular haya recibido la cantidad especificada. la confirmación se puede determinar según el número de bloques que preceden al bloque de esta transacción (getblockcount - blockheight).

¡Gracias!

1. Lo más probable es que una dirección haya recibido un pago y la otra sea devuelta a otra dirección controlada por el pagador. Esto se debe a que la salida de una transacción debe gastarse por completo. Por ejemplo, si tiene 10 btc en una salida y quiere gastar 1 btc, debe enviar 1 al destinatario y 9 a una dirección de cambio propia.
No me preocupa la distinción entre cambio, tasas y pago. Necesito verificar si una dirección en cada txout ha recibido o no una cantidad en 'valor'.

Respuestas (1)

Entonces, está solicitando 3 cosas: confirmada, válida y que una dirección en particular en un txout en particular haya recibido la cantidad especificada.

Confirmado: Ya has resuelto esto. Si getblockcount - blockheight > 0 entonces el tx tiene al menos 1 confirmación, y así sucesivamente.

Válido: Los Tx se confirman de dos formas:

  1. mediante la validación de nodos (nodos completos de Bitcoin como bitcoin-qt). Cada vez que se transmite un tx entre pares completos, se valida.
  2. por la red Esta validación de red ocurre cuando la red acepta que el bloque que contiene el tx es válido, lo que ocurre por primera vez en 1 confirmación y aumenta la confianza con cada confirmación adicional. Estar incluido en un bloque minado también significa que (1) arriba ha ocurrido al menos una vez (probablemente muchas más).

Entonces, si solo está considerando transacciones de Bitcoin confirmadas, ya han sido completamente validadas por la red y sus nodos, por lo que no tiene que hacerlo usted mismo. Esto no se aplica necesariamente a las transacciones no confirmadas .

Una dirección particular ha recibido una cantidad específica: hay reglas generales aquí, pero para estar absolutamente seguro acerca de este último elemento, debe considerar el script tx. Afortunadamente, todo lo que esto implica para la mayoría de las transacciones es verificar OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG.

Esta es la parte relevante (para usted) del script contenido en scriptPubKey. Siempre que contenga este texto, puede estar seguro de que se trata de un pago simple en la cantidad especificada a la dirección especificada, independientemente de si se trata de un cambio o lo que sea.

Si scriptPubKeycontiene algo más, entonces deberá analizar el script para averiguar los detalles de tx. Cómo hacer esto está más allá del alcance de esta pregunta.

En resumen, para cumplir con todas sus condiciones, debe esperar 1 confirmación y verificar el scriptPubKeytexto exacto que se muestra arriba, o estar preparado para analizar completamente el script en el caso de un contrato complejo.