Welches Gewicht hat ein Block, der keine Pay-to-Witness-Skripte enthält?

Ich versuche, das Blockgewicht zu verstehen, eine Metrik, die von segwit ( BIP-141 ) eingeführt wurde:

block weight = 3 * base size + total size

"Basisgröße" ist die Länge eines Pre-Segwit-Blocks, der nur serialisierte Basistransaktionen enthält. „Gesamtgröße“ ist die Länge eines Post-Segwit-Blocks, der sowohl serialisierte Basistransaktionen als auch serialisierte Witness-Transaktionen enthält (wie in BIP-144 definiert ). Das Gewicht eines Blocks darf 4 MB nicht überschreiten.

Das Gewicht eines Blocks ohne Pay-to-Witness-Skripte kann durch Berechnung der Gesamtgröße ermittelt werden. Es ist verlockend, die Basisgröße gleich der Gesamtgröße zu setzen:

block weight = 3 * base size + base size = 4 * base size

Dies setzt jedoch voraus, dass die Länge der Serialisierung einer Nicht-Segwit-Basistransaktion gleich der Länge der Serialisierung einer Nicht-Segwit-Witness-Transaktion ist. Dies scheint nicht der Fall zu sein:

Serialisierung

Das Serialisierungsformat der Zeugentransaktion scheint der oben gezeigten Struktur zu folgen (die auch die Eingabe ist, um wtxid zu finden). Beachten Sie zwei zusätzliche Bytes vor der Liste der Eingänge (Marker bzw. Flag). Darüber hinaus erfordert der Zeuge mindestens ein Byte (den Zeugenfeldzähler), selbst wenn keine Felder vorhanden sind.

Mit anderen Worten, eine Zeugentransaktionsserialisierung ist immer mindestens drei Bytes länger als eine Basistransaktionsserialisierung, unabhängig davon, ob ein Zeuge vorhanden ist.

Wenn dies richtig ist, dann reduziert Segwit tatsächlich die Blockgrößenbegrenzung für Blöcke ohne Pay-to-Witness-Skripte um einen Faktor, der proportional zur Anzahl der Transaktionen im Block ist.

Was vermisse ich?

Antworten (2)

Das Zeugenserialisierungsformat gilt nur für Transaktionen mit Zeugen. Wenn eine Transaktion keine Zeugen hat, dann ist ihr Zeugen-Serialisierungsformat das Nicht-Zeugen-Serialisierungsformat.

Von BIP 144:

Wenn der Zeuge leer ist, sollte das alte Serialisierungsformat verwendet werden.

Danke - dummer Fehler meinerseits. Ich wusste sogar, dass BIP-144 das gesagt hat, und habe es irgendwie vergessen.

Aus BIP 144: Wenn der Zeuge leer ist, sollte das alte Serialisierungsformat verwendet werden.

Es ist illegal, eine Transaktion mit dem erweiterten Serialisierungsformat zu codieren, wenn der Zeuge leer ist. Eine andere Möglichkeit, es zu sehen, ist, dass jede Transaktion einen Zeugen hat, der leer sein kann, und die korrekte Art, diesen leeren Zeugen zu codieren, die Verwendung des alten Serialisierungsformats ist.

Dies gilt auch für die Serialisierung zum Zwecke der Gewichtsberechnung.

Eine Nicht-Zeugen-Transaktion wird dreimal als ihre Basisgröße (das ist die Größe der Serialisierung im alten Format) und dann einmal als ihre Zeugengröße (das ist wiederum die Größe der Serialisierung im alten Format) gezählt. Das Ergebnis ist, dass das Gewicht einer Nicht-Witness-Transaktion nur das Vierfache seiner alten Größe beträgt.