Determinar direcciones de reembolso con bitcoind [duplicado]

Estoy tratando de determinar la dirección de origen de las transacciones para el reembolso automático, pero veo un resultado inesperado de Bitcoin-QT

La transacción en cuestión en blockexplorer: 8bc80f72d9cc6fecda77138e7364f95b48d652db404889deafd48158dc46387e

Y debajo está el resultado de bitcoind gettransactionpara el mismo txid. ¿No debería ver yo lo mismo? ¿O hay algún problema con el envío entre billeteras?

{
"amount" : 0.00000000,
"fee" : -0.00010000,
"confirmations" : 1,
"blockhash" : "0000000000941dab82b8f78596f93832104288c85e7951b5f505b8c1c30dd4ba",
"blockindex" : 1,
"blocktime" : 1377648593,
"txid" : "8bc80f72d9cc6fecda77138e7364f95b48d652db404889deafd48158dc46387e",
"time" : 1377648549,
"timereceived" : 1377648549,
"details" : [
    {
        "account" : "",
        "address" : "n1SrgGXRGjK2gKcvSDRVUDPA1aVKBaG6PQ",
        "category" : "send",
        "amount" : -0.10000000,
        "fee" : -0.00010000
    },
    {
        "account" : "",
        "address" : "mtjmGtkZet4Y7rzQrC8cweuJMYGZFpPw4d",
        "category" : "send",
        "amount" : -0.10000000,
        "fee" : -0.00010000
    },
    {
        "account" : "",
        "address" : "n4N4hQZK1sgHv8z3ikHsuN98vGNhshQZSo",
        "category" : "send",
        "amount" : -0.10000000,
        "fee" : -0.00010000
    },
    {
        "account" : "",
        "address" : "mvw4DVoSL7APFGdHb2RGYebzBKDBankTAM",
        "category" : "send",
        "amount" : -0.99950000,
        "fee" : -0.00010000
    },
    {
        "account" : "account1",
        "address" : "n1SrgGXRGjK2gKcvSDRVUDPA1aVKBaG6PQ",
        "category" : "receive",
        "amount" : 0.10000000
    },
    {
        "account" : "account2",
        "address" : "mtjmGtkZet4Y7rzQrC8cweuJMYGZFpPw4d",
        "category" : "receive",
        "amount" : 0.10000000
    },
    {
        "account" : "account3",
        "address" : "n4N4hQZK1sgHv8z3ikHsuN98vGNhshQZSo",
        "category" : "receive",
        "amount" : 0.10000000
    },
    {
        "account" : "account4",
        "address" : "mvw4DVoSL7APFGdHb2RGYebzBKDBankTAM",
        "category" : "receive",
        "amount" : 0.99950000
    }
]
}

Editar: Y aquí está el resultado de combinar getrawtransactiony decoderawtransaction:

{
"txid" : "8bc80f72d9cc6fecda77138e7364f95b48d652db404889deafd48158dc46387e",
"version" : 1,
"locktime" : 0,
"vin" : [
    {
        "txid" : "f96590f6db1e8748f349e93ae5e1e335c57d55df9a26a70f99e7c06b32538f16",
        "vout" : 0,
        "scriptSig" : {
            "asm" : "304502201d7a5a31936d9a4a0ff17f357dda13e87d7459a7663d127da783865858b552c5022100bac9edf373d42c578c92231cc096a620baa174d7bf141c519047b3ca5dc3577101 03f5fd9f5ad8f4a5ac11c9c8e6f6b094129dbc3d8a9f753dc8d415c5c42a5cccfa",
            "hex" : "48304502201d7a5a31936d9a4a0ff17f357dda13e87d7459a7663d127da783865858b552c5022100bac9edf373d42c578c92231cc096a620baa174d7bf141c519047b3ca5dc35771012103f5fd9f5ad8f4a5ac11c9c8e6f6b094129dbc3d8a9f753dc8d415c5c42a5cccfa"
        },
        "sequence" : 4294967295
    }
],
"vout" : [
    {
        "value" : 0.10000000,
        "n" : 0,
        "scriptPubKey" : {
            "asm" : "OP_DUP OP_HASH160 da9c29ba563c33688e8e1d85b84a634a271b5282 OP_EQUALVERIFY OP_CHECKSIG",
            "hex" : "76a914da9c29ba563c33688e8e1d85b84a634a271b528288ac",
            "reqSigs" : 1,
            "type" : "pubkeyhash",
            "addresses" : [
                "n1SrgGXRGjK2gKcvSDRVUDPA1aVKBaG6PQ"
            ]
        }
    },
    {
        "value" : 0.10000000,
        "n" : 1,
        "scriptPubKey" : {
            "asm" : "OP_DUP OP_HASH160 9105d7f92fd467f0035cd4b5b58bea1167647618 OP_EQUALVERIFY OP_CHECKSIG",
            "hex" : "76a9149105d7f92fd467f0035cd4b5b58bea116764761888ac",
            "reqSigs" : 1,
            "type" : "pubkeyhash",
            "addresses" : [
                "mtjmGtkZet4Y7rzQrC8cweuJMYGZFpPw4d"
            ]
        }
    },
    {
        "value" : 0.10000000,
        "n" : 2,
        "scriptPubKey" : {
            "asm" : "OP_DUP OP_HASH160 fa9c7e784bfae5e3d330cba28b73c804da71f213 OP_EQUALVERIFY OP_CHECKSIG",
            "hex" : "76a914fa9c7e784bfae5e3d330cba28b73c804da71f21388ac",
            "reqSigs" : 1,
            "type" : "pubkeyhash",
            "addresses" : [
                "n4N4hQZK1sgHv8z3ikHsuN98vGNhshQZSo"
            ]
        }
    },
    {
        "value" : 0.99950000,
        "n" : 3,
        "scriptPubKey" : {
            "asm" : "OP_DUP OP_HASH160 a918d01415a09ee82034f1dce3217741dcdf5849 OP_EQUALVERIFY OP_CHECKSIG",
            "hex" : "76a914a918d01415a09ee82034f1dce3217741dcdf584988ac",
            "reqSigs" : 1,
            "type" : "pubkeyhash",
            "addresses" : [
                "mvw4DVoSL7APFGdHb2RGYebzBKDBankTAM"
            ]
        }
    }
]
}

Aquí hay una referencia que indica que la única forma es identificar el índice de salida de la transacción anterior: https://bitcoin.stackexchange.com/a/12472/3413

Si esto es correcto, para determinar la dirección de "reembolso" de una transacción en particular, ¿debería ejecutar el siguiente pseudocódigo?:

txhex = getrawtransaction(targettxhash)
txjson = decoderawtransaction(txhex)
foreach txinput in txjson.vin:
  txhexprev = getrawtransaction(txinput.txid)
  txjsonprev = decoderawtransaction(txhexprev)
  foreach txprevoutput in txjsonprev.vout:
    txrefundarray[] += {'address':txprevoutput.scriptPubKey.addresses[0], 'amount':txprevout.value} // 0th address only doesn't support multi-sig

Respuestas (3)

Las transacciones de Bitcoin no tienen una dirección 'de', y ciertamente no hay una forma garantizada de determinar una dirección de reembolso. Las transacciones consumen y producen monedas, y aunque en teoría es posible usar las direcciones a las que se enviaron previamente las monedas de entrada, esta no es información en la que deba confiar (ni se garantiza que esté disponible, aunque algunos sitios usan esta técnica).

Para las transacciones recibidas, el cliente de referencia enumera la dirección por la que recibió las monedas, no el remitente. El mejor consejo para determinar una dirección de reembolso es pedírselo al cliente.

En caso de que necesite algo más automático, se está desarrollando un protocolo de pago que funciona sobre Bitcoin y permite negociar transacciones entre el remitente y el receptor antes de transmitirlas en la red. Incluye una función para enviar automáticamente una dirección de reembolso con cada transacción.

Estoy buscando determinar las entradas y las direcciones asociadas para una transacción determinada con bitcoind de forma automatizada. "Preguntarlo al cliente" está más allá del alcance de mi pregunta.
Solicitó una forma de determinar la dirección de origen de una transacción para realizar reembolsos. Bitcoin, a nivel de protocolo, no tiene direcciones de origen ni una forma confiable de determinar las direcciones de reembolso. Hasta que el protocolo de pago esté comúnmente disponible, la única forma de hacerlo es preguntándole a un cliente. Sí, las transacciones tienen entradas, y las salidas consumidas por ellas pueden haber sido asignadas a direcciones identificables, y esto se puede determinar como lo indique. Sin embargo, no es una respuesta a tu pregunta.
Agradezco su aporte, sin embargo, no estoy buscando una discusión teórica a nivel de protocolo. Muchos sitios usan un sistema similar a un reembolso basado en las "entradas" y esta fue la respuesta que estaba buscando.
Ok, entonces la única respuesta correcta es "no existe". Las direcciones de reembolso no existen actualmente, y el uso de las direcciones de salida previa para esto requiere suposiciones sobre el software del receptor, lo que perjudica la escalabilidad del ecosistema y su privacidad en su conjunto. No hay respuesta a su pregunta. Sé que muchos sitios no siguen esto, pero están dañando la capacidad del ecosistema para superar algunas suposiciones que generalmente se mantienen en la actualidad.
No estoy dispuesto a aceptar la respuesta de "no existe" como excusa para no construir algo. Los desarrolladores parecen desinteresados ​​​​en agregar funciones simples como "gastar desde" a bitcoind, por lo que las personas tienen que hacer suposiciones y construirlas externamente.
Se está trabajando en ello y se llama el protocolo de pago que estará presente en la versión 0.9. La cuestión es que no pertenece al protocolo P2P, sino a una capa superior, que permite negociar las transacciones entre el emisor y el receptor antes de que se emitan en la red. La cadena de bloques es una cosa global costosa de mantener y funciona solo marginalmente como un protocolo de comunicación. No hay ninguna razón para poner datos que son información privada entre el remitente y el receptor.
@PieterWuille No debería haber una diferencia semántica entre los dos conceptos de "dirección de reembolso" y "transacción enviada desde". se puede determinar la "transacción enviada desde" y, por lo tanto, se puede realizar un reembolso automático (normalmente). Si una billetera web no puede enrutar el pago, ese es SU problema. Una dirección de bitcoin representa un hash de una clave pública utilizada para demostrar la propiedad, si una billetera web viola el principio de propiedad, entonces no implementaron bitcoin correctamente.
@ user3338098 Ignorando que es una práctica terrible para la privacidad, ni siquiera siempre funciona. Por ejemplo, en una transacción CoinJoin, algunas de las entradas provendrán de un remitente y otras provendrán de otro. Por supuesto, puede llegar a un acuerdo con un remitente de que se puede realizar un reembolso, pero en general no debe asumir que un receptor aceptará una transacción como pago sin que se le proporcione una dirección para enviarla explícitamente.
@PieterWuille Entiendo que no funciona todo el tiempo (debido a los proveedores web) y que reduce la privacidad. ¿Podemos estar de acuerdo en que el libro blanco original de bitcoin establece coins made from digital signatures, which provides strong control of ownershipy que los proveedores web probablemente están violando este principio de propiedad al reutilizar claves privadas para diferentes usuarios?
@ user3338098 Incluso si asume eso, ¿cómo lidiará con el caso en que múltiples propietarios construyan conjuntamente una sola transacción (donde diferentes entradas pueden estar asociadas con diferentes usuarios)? Esta es una práctica muy recomendada.
@PieterWuille Si alguien pagó por un producto (que advirtió sobre reembolsos automáticos a las entradas de la transacción) con una transacción CoinJoin, ese cliente ** literalmente ** renunció a cualquier derecho de propiedad sobre su pago de reembolso, por su elección de usar CoinJoin transacción para realizar el pago. De cualquier manera, tales transacciones pueden detectarse (todas las entradas y salidas son bastante fáciles de detectar), y los reembolsos automáticos se detienen para el procesamiento manual (¡con una tarifa de procesamiento deducida de su reembolso, obviamente! Aunque preferiría llamarlo una tarifa de interacción idiota .)

Alguien ha escrito un fragmento de Python que intenta determinar las "direcciones de entrada" de una transacción en particular utilizando los resultados de la transacción anterior como una solución viable, pero no 100% confiable. Esto logró lo que necesito.

Debería estar viendo lo mismo, pero parece que los resultados de bitcoind no cuentan la historia completa. Todo en la sección de detalles es un resultado de la transacción. (Observe cómo cada elemento con una categoría de "enviar" tiene un elemento correspondiente de "recibir" con la misma cantidad negada, ¡duplicados!) En realidad, esto no le dice nada sobre las entradas. Esto podría ser un error en bitcoind, pero es más probable que haya otra forma, tal vez un parámetro de línea de comando adicional que también expondrá las entradas a la transacción.

getrawtransactionle mostrará la transacción de blockchain, en lugar del efecto en su billetera (sin embargo, requiere la configuración txindex = 1). Sin embargo, eso todavía no le dará una dirección de reembolso (vea mi respuesta).