Berechnen der Zeugengröße einer Transaktion

Ich möchte berechnen, wie viele % eines Blocks und damit Transaktionen Zeugendaten sind. Ich muss die Größe der Zeugendaten in Bytes bei jeder Transaktion berechnen. Und so wie ich es verstehe, kann ich dies nicht mit vorhandenen Größenvariablen wie vsize berechnen.

Wird eine Schleife durch das Hex-Array "txinwitness" und eine Berechnung der Bytelänge für jeden ausreichen? (Hier NodeJS verwenden)

Buffer.byteLength('03fbcc1c24903bc2fb1d73czef518b859232341c39e4515367653d80536d587b62d6', 'hex');

Antworten (3)

Ausarbeitung der Antwort von Andrew:

sizeSie können es aus und berechnen vsize.

Transaktionsgröße

Siehe BIP141

Das Transaktionsgewicht ist definiert als Basistransaktionsgröße * 3 + Gesamttransaktionsgröße (d. h. die gleiche Methode wie die Berechnung des Blockgewichts aus Basisgröße und Gesamtgröße).

Die virtuelle Transaktionsgröße ist definiert als Transaktionsgewicht / 4 (aufgerundet auf die nächste Ganzzahl).

Die Basistransaktionsgröße ist die Größe der Transaktion, die mit entfernten Zeugendaten serialisiert wird.

Die Gesamttransaktionsgröße ist die Transaktionsgröße in Byte, serialisiert wie in BIP144 beschrieben, einschließlich Basisdaten und Zeugendaten.

Zeuge Größe

Wenn Sie also beispielsweise eine Transaktion mit einer Gesamtgröße von 1200 Byte (einschließlich Zeugendaten) und einer Basisgröße von 1000 Byte haben, lauten das Gewicht und die virtuelle Größe wie folgt:

weight = 1000 bytes * 3 + 1200 bytes = 4200
vsize = 4200 / 4 = 1050 bytes

sizeWenn Sie also und gegeben vsizehaben, können Sie die Größe der Zeugendaten berechnen:

witness size = (4/3) * (total - vsize)
witness size = 200

Wird eine Schleife durch das Hex-Array "txinwitness" und eine Berechnung der Bytelänge für jeden ausreichen?

Das ist nicht genug, da es zusätzliche Daten in Zeugen gibt, die nicht in der enthalten sind txinwitness.

Sie können die Anzahl der Witness-Bytes und die Anzahl der Nicht-Witness-Bytes erhalten, indem Sie ein Gleichungssystem lösen. Der getrawtransactionRPC gibt Ihnen zwei Felder sizeund weight. sizeist die Gesamtgröße in Byte, wie sie über die Leitung empfangen wird. weightist das Gewicht der Transaktion, wie durch BIP 141 definiert.

Wenn Sie xdie Anzahl der Nicht-Zeugen-Bytes und ydie Anzahl der Zeugen-Bytes sein lassen, erhalten Sie mit den Definitionen von sizeund weight:

4x + 1y = weight
x + y = size

Durch Einstecken von weightund sizeaus dem RPC können Sie das Gleichungssystem lösen xund yerhalten die Anzahl der Nicht-Zeugen-Bytes bzw. die Anzahl der Zeugen-Bytes.

Also x = (Gewicht - Größe)/3, y = (4*Größe - Gewicht)/3

Wenn Sie bitcoinjs-libwie ich verwenden, extrahieren Sie nach dem Signieren der Eingaben für txTransaction und erhalten das Objekt:

import { Psbt } from 'bitcoinjs-lib';

const psbt = new Psbt(...)

const allInputs = psbt.finalizeAllInputs();
const extractedTx = allInputs.extractTransaction(increaseFeeRate, customFee);

extractTx hat folgendes Format:

interface SignedTransaction {
  ins: SignedTxInput[],
  locktime: number,
  outs: SignedTxOutput[],
  version: number
}

inshier ist folgendes Format:

interface SignedTxInput {
  hash: Buffer,
  index: number,
  script: Buffer,
  sequence: number,
  witness: Buffer[],
}

Summieren Sie Zeugenpuffer für jede Eingabe und Sie haben Ihr Zeugengewicht.