Consensus

為什麼創世區塊coinbase不能花掉?

  • November 6, 2020

根據比特幣維基

第一個 50BTC 塊獎勵轉到地址1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa,儘管由於在程式碼中表達創世塊的方式存在怪癖(這可能是故意的),因此無法使用此獎勵。

但這個怪癖在哪裡?你將如何改變它以允許它被使用?

當一個節點啟動時,它會在創世塊旁邊初始化它的塊數據庫副本,然後開始同步過程。出於某種原因,中本聰決定不將創世區塊中的 coinbase 交易添加到全球交易數據庫中。因此,網路中的所有節點都會拒絕該塊。

我不確定這是故意的還是只是疏忽。無論如何,它永遠與 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa 綁定。

你將如何改變它以允許它被使用?

為了使 coinbase 可以使用,必須對 validation.cpp (v0.16.2) 進行以下更改。注意:如前所述,這將被視為硬分叉。

第 1 步- 禁用跳過創世區塊(旨在將錯誤保留為共識的一部分),第 1818 行

// Special case for the genesis block, skipping connection of its transactions
   // (its coinbase is unspendable)
   if (block.GetHash() == chainparams.GetConsensus().hashGenesisBlock) {
       if (!fJustCheck)
           view.SetBestBlock(pindex->GetBlockHash());
       // return true; <- comment this line out
}

第 2 步- 為創世塊跳過前一個塊的斷言,第 1874 行

if (block.GetHash() != chainparams.GetConsensus().hashGenesisBlock) {
   assert(pindex->pprev);
}

第 3 步- 跳過為創世區塊寫入撤消數據,第 1989 行

if (block.GetHash() != chainparams.GetConsensus().hashGenesisBlock)
{
   if (!WriteUndoDataForBlock(blockundo, state, pindex, chainparams))
       return false;
} 

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