Wie erhalte ich eine Transaktionsgebühr von einer Rohtransaktion?

Ich weiß, dass wir die Summe der Eingaben abzüglich der Ausgaben berechnen müssen, um die Transaktionsgebühr zu erhalten, aber bei Verwendung des getrawtrasnactionRPC-Aufrufs werden die Eingabewerte nicht angehängt. Wie ist es möglich, eine Transaktionsgebühr zu erhalten?

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
)

Antworten (1)

Um die Eingabewerte zu erhalten, müssen Sie die Werte der Ausgaben nachschlagen, von denen sie ausgegeben werden. Rufen Sie also getrawtransactionjeweils eine Eingabe auf txidund suchen Sie dann die Ausgabe bei index vout. Der Wert dieser Ausgabe ist der Eingabewert. Tun Sie dies für alle Eingaben und summieren Sie sie. Das ist der gesamte Eingabewert. Summieren Sie die Werte der Ausgänge, um den Gesamtausgangswert zu erhalten. Subtrahieren Sie den gesamten Ausgabewert vom gesamten Eingabewert und Sie erhalten die Transaktionsgebühr gezahlt.

Unternimmt bitcoin-core diesen Aufwand für jede Transaktion, um eine Transaktionsgebühr zu erhalten?
@Adam als Teil der Validierungsregeln muss jeder vollständige Knoten prüfen, ob die Gebühr einer Transaktion nicht negativ ist. Also: ja, implizit.
Ja, aber nicht so, wie Sie es über RPC tun müssen. Anstatt jede vorherige Transaktion aufzurufen, verwaltet Bitcoin Core eine interne Datenbank mit nicht ausgegebenen Transaktionsausgaben. Es zieht also tatsächlich nur den UTXO aus dieser Datenbank, anstatt die Transaktion aus der Blockchain zu ziehen.
Ja, das über RPC zu tun, ist so teuer, wenn Sie für jede Eingabe einen Eingabewert hinzufügen könnten getrawtransaction, könnte es viel besser sein.
Es kann nicht hinzugefügt werden, getrawtransactionda das Nachschlagen dieser Informationen für beliebige Transaktionen teuer ist. Bitcoin Core kann nach neuen Transaktionen suchen, die UTXOs ausgeben. Aber sobald eine Ausgabe verbraucht ist, wird es viel teurer, diese Ausgabe nachzuschlagen, und das Führen einer separaten Datenbank dafür ist eine Verschwendung von Platz und Rechenaufwand.
Teuer oder unmöglich. Bitcoin Core kann im Pruning-Modus ausgeführt werden, in diesem Fall hat es diese Informationen buchstäblich nirgendwo. Es wäre sehr bedauerlich, wenn die Leute gezwungen wären, die gesamte Blockchain zu behalten, nur um Gebühren berechnen zu können. Die Verwendung von Watch-Only-Adressen, um die Wallet-Transaktionen, an denen Sie interessiert sind, zu verfolgen (einschließlich ihrer Gebühreninformationen), ist viel skalierbarer.