比特幣 v0.01 中的塊大小限制
在 main.h(第 17 行)中,我們有一個常量 MAX_SIZE
static const unsigned int MAX_SIZE = 0x02000000;
十進制格式等於 33554432 (32MB)
此常量用於驗證塊是否通過 main.cpp 中的大小限制(第 1154 行)
bool CBlock::CheckBlock() const { // These are checks that are independent of context // that can be verified before saving an orphan block. // Size limits if (vtx.empty() || vtx.size() > MAX_SIZE || ::GetSerializeSize(*this, SER_DISK) > MAX_SIZE) return error("CheckBlock() : size limits failed"); ... }
根據 git pull request history 第 18 行由 Gavin Andresen 添加到 main.h:
static const unsigned int MAX_BLOCK_SIZE = 1000000;
<https://github.com/bitcoin/bitcoin/blame/9d2174b6f5f3fac2463c7ebc2dbb9004b3740d23/main.h>
這個新常量似乎只用於 main.cpp 上的 BitcoinMiner() 函式
<https://github.com/bitcoin/bitcoin/blame/9d2174b6f5f3fac2463c7ebc2dbb9004b3740d23/main.cpp#L2613>
if (nBlockSize + nTxSize >= MAX_BLOCK_SIZE - 10000) continue;
顯然中本聰認為這會分裂鏈,但這僅建立在採礦節點上,而不是建立在剛剛收集新塊並將它們添加到其鏈中的節點上。
最後一行的意義是什麼?這對共識有何影響?最新版本的比特幣核心中限制塊大小的程式碼在哪裡?
最後一行的意義是什麼?
它確保內置礦工不會創建大於
MAX_BLOCK_SIZE
. 它檢查選擇的交易是否大於限制。之所以有a- 10000
是為了保證coinbase交易和區塊頭有足夠的空間。這對共識有何影響?
它實際上是一個軟分叉。礦工不會製造大於
MAX_BLOCK_SIZE
. 否則對共識沒有影響。最新版本的比特幣核心中限制塊大小的程式碼在哪裡?
它在 中
CheckBlock()
,與尺寸檢查的功能相同,因為尺寸檢查已經存在。當然這個函式的位置已經移動了。目前它在這裡:https ://github.com/bitcoin/bitcoin/blob/master/src/validation.cpp#L3093