Bitcoin-Core-Development
1 MB 塊大小限制是否包括標頭?
我能夠按照程式碼到validation.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");
template <typename T> size_t GetSerializeSize(const T& t, int nType, int nVersion = 0) { return (CSizeComputer(nType, nVersion) << t).size(); }
但是對於我的生活,我無法弄清楚在
CSizeComputer
做什麼。是否GetSerializeSize
在它返回的值中包含塊頭?
CSizeComputer
是一個序列化流,它丟棄所有寫入的數據,只計算產生了多少字節。它是內聯的,在大多數情況下編譯器實際上避免計算字節。因此,
GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS)
只需計算在為網路忽略見證的情況下序列化一個塊時會產生多少字節。由於網路上的塊確實以其標頭(和交易計數)為前綴,因此這些確實有助於最大塊大小。