Consensus
為什麼創世區塊coinbase不能花掉?
根據比特幣維基:
第一個 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; }