Beinhaltet die Blockgrößenbeschränkung von 1 MB den Header?

Ich konnte dem Code zu validation.cpp folgen :

// Size limits
if (block.vtx.empty() || block.vtx.size() > MAX_BLOCK_BASE_SIZE || ::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS) > MAX_BLOCK_BASE_SIZE)
    return state.DoS(100, false, REJECT_INVALID, "bad-blk-length", false, "size limits failed");

und serialize.h :

template <typename T>
size_t GetSerializeSize(const T& t, int nType, int nVersion = 0)
{
    return (CSizeComputer(nType, nVersion) << t).size();
}

Aber für mein ganzes Leben kann ich nicht herausfinden, was CSizeComputerdas tut. Schließt GetSerializeSizeder Block-Header in den zurückgegebenen Wert ein?

Ich behandle es nicht als Duplikat, da eine Frage zum Serialisierungscode von Bitcoin Core enthalten ist.

Antworten (1)

CSizeComputerist ein Serialisierungsstrom, der alle geschriebenen Daten verwirft und nur zählt, wie viele Bytes erzeugt wurden. Es ist inline, und der Compiler vermeidet in den meisten Fällen tatsächlich die Berechnung der Bytes.

Berechnet also GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS)einfach, wie viele Bytes erzeugt würden, wenn ein Block für das Netzwerk serialisiert würde, wobei Zeugen ignoriert werden.

Da Blöcken im Netzwerk tatsächlich ihr Header (und die Transaktionsanzahl) vorangestellt wird, tragen diese zur maximalen Blockgröße bei.