I’m trying to understand block weight, a metric introduced by segwit (BIP-141):
block weight = 3 * base size + total size
“base size” is the length of a pre-segwit block, which contains only serialized base transactions. “total size” is the length of a post-segwit block, which contains both serialized base transactions and serialized witness transactions (as defined in BIP-144). The weight of any block must not exceed 4 MB.
The weight of a block without pay-to-witness scripts can found by computing total size. It’s tempting to set base size equal to total size:
block weight = 3 * base size + base size = 4 * base size
But this assumes the length of the serialization of a non-segwit base transaction equals the length of the serialization of a non-segwit witness transaction. This doesn’t appear to be the case:
The witness transaction serialization format appears to follow the structure shown above (which is also the input to find wtxid). Notice two additional bytes before the list of inputs (marker and flag, respectively). Moreover, the witness requires at least one byte (the witness field count) even if no fields are present.
In other words, a witness transaction serialization will always be at least three bytes longer than a base transaction serialization, regardless of whether a witness is present.
If this is correct, then segwit is in fact reducing the block size limit for blocks devoid of pay-to-witness scripts by a factor proportional to the number of transactions in the block.
What am I missing?