Blockchain

比特幣 v0.01 中的塊大小限制

  • April 21, 2019

在 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 &gt;= 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

引用自:https://bitcoin.stackexchange.com/questions/86182