¿Cómo obtener la tarifa de transacción de la transacción sin procesar?

Sé que tenemos que calcular el total de entradas menos las salidas para obtener la tarifa de transacción, pero al usar getrawtrasnactionla llamada RPC, los valores de entrada no están adjuntos. ¿Cómo es posible obtener una tarifa de transacción?

Array
(
    [txid] => 318abc03cfa52c996b01d6ff10faf86447341d78acdf849026dd4c22ebd56cab
    [hash] => 318abc03cfa52c996b01d6ff10faf86447341d78acdf849026dd4c22ebd56cab
    [version] => 2
    [size] => 226
    [vsize] => 226
    [locktime] => 0
    [vin] => Array
        (
            [0] => Array
                (
                    [txid] => 71c6f340ef5f4688136e8b308393ff74a89b4bf780bf0e3c3611fa34dc858c07
                    [vout] => 0
                    [scriptSig] => Array
                        (
                            [asm] => 30450221009c305ffb2f04517ba1f422f22f0eded5afb855f0ee8cdd2634259774dfb0846b022019e05a9d25f21e808a0be320e3956a1e6fcb57cc4d725404db0bbab0ced78a88[ALL] 0221b96462902141e297804981ebc5465e475ebf0f4f4d7a4e558edc4856b33e75
                            [hex] => 4830450221009c305ffb2f04517ba1f422f22f0eded5afb855f0ee8cdd2634259774dfb0846b022019e05a9d25f21e808a0be320e3956a1e6fcb57cc4d725404db0bbab0ced78a8801210221b96462902141e297804981ebc5465e475ebf0f4f4d7a4e558edc4856b33e75
                        )

                    [sequence] => 4294967295
                )

        )

    [vout] => Array
        (
            [0] => Array
                (
                    [value] => 0.01
                    [n] => 0
                    [scriptPubKey] => Array
                        (
                            [asm] => OP_DUP OP_HASH160 e673381ba3ce7fa72520a09ee4e3ad68cd5d6528 OP_EQUALVERIFY OP_CHECKSIG
                            [hex] => 76a914e673381ba3ce7fa72520a09ee4e3ad68cd5d652888ac
                            [reqSigs] => 1
                            [type] => pubkeyhash
                            [addresses] => Array
                                (
                                    [0] => n2XTjk57QJgjevmYb75tJHy7AJGGeoJv2e
                                )

                        )

                )

            [1] => Array
                (
                    [value] => 0.089981
                    [n] => 1
                    [scriptPubKey] => Array
                        (
                            [asm] => OP_DUP OP_HASH160 108e2c445972c2561d8cff8ee487cfe6e054ab59 OP_EQUALVERIFY OP_CHECKSIG
                            [hex] => 76a914108e2c445972c2561d8cff8ee487cfe6e054ab5988ac
                            [reqSigs] => 1
                            [type] => pubkeyhash
                            [addresses] => Array
                                (
                                    [0] => mh2VRUG7BA8Rutz9tqTuhinqZxRo3QinGi
                                )

                        )

                )

        )

    [hex] => 0200000001078c85dc34fa11363c0ebf80f74b9ba874ff9383308b6e1388465fef40f3c671000000006b4830450221009c305ffb2f04517ba1f422f22f0eded5afb855f0ee8cdd2634259774dfb0846b022019e05a9d25f21e808a0be320e3956a1e6fcb57cc4d725404db0bbab0ced78a8801210221b96462902141e297804981ebc5465e475ebf0f4f4d7a4e558edc4856b33e75ffffffff0240420f00000000001976a914e673381ba3ce7fa72520a09ee4e3ad68cd5d652888acd44c8900000000001976a914108e2c445972c2561d8cff8ee487cfe6e054ab5988ac00000000
    [blockhash] => eb31cb0c8de0e8b3219537e9304ee7d09d5dc7092ef17caed470b9a1aed2485e
    [confirmations] => 2269
    [time] => 1522693379
    [blocktime] => 1522693379
)

Respuestas (1)

Para obtener los valores de entrada, debe buscar los valores de las salidas de las que gastan. Así que llame a getrawtransactioncada entrada txidy luego encuentre la salida en el índice vout. El valor de esa salida es el valor de entrada. Haz eso para todas las entradas y súmalas. Ese es el valor total de entrada. Sume los valores de las salidas para obtener el valor de salida total. Reste el valor total de salida del valor total de entrada y obtendrá el pago de la tarifa de transacción.

¿Bitcoin-core hace este esfuerzo para que cada transacción obtenga una tarifa de transacción?
@Adam como parte de las reglas de validación, cada nodo completo debe verificar que la tarifa de una transacción no sea negativa. Entonces: sí, implícitamente.
Sí, pero no en la forma en que tienes que hacerlo sobre RPC. En lugar de recuperar cada transacción anterior, Bitcoin Core mantiene una base de datos interna de salidas de transacciones no gastadas. Entonces, en realidad solo extrae el UTXO de esa base de datos en lugar de extraer la transacción de la cadena de bloques.
Sí, hacer eso sobre RPC es muy costoso, si pudiera agregar valor de entrada para cada entrada para getrawtransaction, podría ser mucho mejor.
No se puede agregar que getrawtransactionbuscar esa información para cualquier transacción arbitraria es costoso. Bitcoin Core puede buscar nuevas transacciones que gasten UTXO. Pero una vez que se gasta una salida, se vuelve mucho más costoso buscar esa salida, y mantener una base de datos separada para esto es una pérdida de espacio y esfuerzo computacional.
Caro o imposible. Bitcoin Core puede ejecutarse en modo de poda, en cuyo caso, literalmente, no tiene esa información en ninguna parte. Sería muy desafortunado que las personas se vieran obligadas a mantener toda la cadena de bloques solo para poder calcular las tarifas. El uso de direcciones de solo observación para hacer que la billetera realice un seguimiento de las transacciones que le interesan (incluida la información de sus tarifas) es mucho más escalable.