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.
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!
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:
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 scriptPubKey
contiene 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 scriptPubKey
texto exacto que se muestra arriba, o estar preparado para analizar completamente el script en el caso de un contrato complejo.
diego basch
varun k