О чем говорит эта строчка?
https://github.com/bitcoin/bitcoin/blob/master/src/validation.cpp#L3108
if (block.vtx.empty() || block.vtx.size() * WITNESS_SCALE_FACTOR > MAX_BLOCK_WEIGHT || ::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS) * WITNESS_SCALE_FACTOR > MAX_BLOCK_WEIGHT)
return state.DoS(100, false, REJECT_INVALID, "bad-blk-length", false, "size limits failed");
По моему тут на чистом английском написано: блок не должен быть нулевым И размер всех транзакций в блоке * 4 должен быть меньше или равен 4 мегабайтам И размер блока на диске * 4 должен быть меньше или равен 4 мегабайтам.
Я что-то неправильно понимаю?
Имеем такие константы:
MAX_BLOCK_WEIGHT = 4000000
WITNESS_SCALE_FACTOR = 4
Вот это мне понятно:
::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS) * WITNESS_SCALE_FACTOR > MAX_BLOCK_WEIGHT
В переводе на русский: Если из сериализованного блока выкинуть witness-данные, то его размер не должен превышать 4000000/4 = 1000000 байт.
Вот это мне непонятно:
block.vtx.size() * WITNESS_SCALE_FACTOR > MAX_BLOCK_WEIGHT
vtx - вроде как имеет тип std::vector, значит метод size() возвращает количество элементов в векторе, а не общий занимаемый размер. Ну, короче, не понимаю смысл этой проверки.
Но это ещё не все проверки размера блока. Дальше видим:
if (GetBlockWeight(block) > MAX_BLOCK_WEIGHT) {
return state.DoS(100, false, REJECT_INVALID, "bad-blk-weight", false, strprintf("%s : weight limit failed", __func__));
return ::GetSerializeSize(block, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS) * (WITNESS_SCALE_FACTOR - 1) + ::GetSerializeSize(block, PROTOCOL_VERSION);
Тут уже всё понятно прописано, как в методичке:
Blocks are currently limited to 1,000,000 bytes (1MB) total size. We change this restriction as follows:
Block weight is defined as Base size * 3 + Total size. (rationale[3])
Base size is the block size in bytes with the original transaction serialization without any witness-related data, as seen by a non-upgraded node.
Total size is the block size in bytes with transactions serialized as described in BIP144, including base data and witness data.
The new rule is block weight ≤ 4,000,000.
То есть, правило такое: размер_блока_без_witness * 3 + полный_размер_блока < 4000000