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 CSizeComputer
está haciendo. ¿ GetSerializeSize
Incluye el encabezado del bloque en el valor que devuelve?
CSizeComputer
es 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.
Nick ODell
pieter wuille