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');
Ausarbeitung der Antwort von Andrew:
size
Sie können es aus und berechnen vsize
.
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.
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
size
Wenn Sie also und gegeben vsize
haben, 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 getrawtransaction
RPC gibt Ihnen zwei Felder size
und weight
. size
ist die Gesamtgröße in Byte, wie sie über die Leitung empfangen wird. weight
ist das Gewicht der Transaktion, wie durch BIP 141 definiert.
Wenn Sie x
die Anzahl der Nicht-Zeugen-Bytes und y
die Anzahl der Zeugen-Bytes sein lassen, erhalten Sie mit den Definitionen von size
und weight
:
4x + 1y = weight
x + y = size
Durch Einstecken von weight
und size
aus dem RPC können Sie das Gleichungssystem lösen x
und y
erhalten die Anzahl der Nicht-Zeugen-Bytes bzw. die Anzahl der Zeugen-Bytes.
Wenn Sie bitcoinjs-lib
wie 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
}
ins
hier 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.
Pieter Wuille