¿El límite de tamaño de bloque de 1 MB incluye el encabezado?

Pude seguir el código hasta la validación.cpp :

// 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");

y serialize.h :

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

Pero por mi vida no puedo entender lo que CSizeComputerestá haciendo. ¿ GetSerializeSizeIncluye el encabezado del bloque en el valor que devuelve?

No lo estoy tratando como un duplicado ya que se incluye una pregunta sobre el código de serialización de Bitcoin Core.

Respuestas (1)

CSizeComputeres un flujo de serialización que descarta todos los datos escritos y solo cuenta cuántos bytes se produjeron. Está en línea y, en la mayoría de los casos, el compilador evita calcular los bytes.

Entonces, GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS)solo calcula cuántos bytes se producirían al serializar un bloque para la red ignorando los testigos.

Como los bloques en la red tienen el prefijo de su encabezado (y el recuento de transacciones), estos contribuyen al tamaño máximo del bloque.