創世區塊內的交易是否可以使用?
添加到創世塊的交易是可花費的,就像來自其他塊的任何其他交易一樣,還是不可花費的 coinbase 交易。
換一種說法..
如果找到比特幣接收者的相應私鑰,創世區塊內的交易是否可以使用?
如果我分叉比特幣程式碼,並生成我自己的創世塊。我可以使用我用作與創世塊硬編碼的交易的比特幣接收者的私鑰/公鑰嗎?
添加到創世塊的交易是可花費的,就像來自其他塊的任何其他交易一樣,還是不可花費的 coinbase 交易。
交易不可消費;交易輸出是。
如果找到比特幣接收者的相應私鑰,創世區塊內的交易是否可以使用?
比特幣創世區塊中的單個交易輸出不可使用。目前尚不清楚這是系統創建者的故意選擇,還是意外。無論如何,目前的原因並不重要,因為沒有比特幣全節點軟體會接受這樣的支出。
如果我分叉比特幣程式碼,並生成我自己的創世塊。我可以使用我用作與創世塊硬編碼的交易的比特幣接收者的私鑰/公鑰嗎?
在您自己的軟體中,您可以執行您喜歡的任何規則。
添加到創世塊的交易是可花費的,就像來自其他塊的任何其他交易一樣,還是不可花費的 coinbase 交易。
創世區塊的 coinbase 交易不可花費。
如果我分叉比特幣程式碼,並生成我自己的創世塊。我可以使用我用作與創世塊硬編碼的交易的比特幣接收者的私鑰/公鑰嗎?
是的,但是您必須對原始碼進行一些修改,因為它的“不可使用性”已被硬編碼以避免硬分叉。
如何讓它變得可消費
chainparams.cpp
- 通過在 中提供所有必要資訊來探勘您自己的創世塊
chainparams.cpp
,主要是CreateGenesisBlock和第 123 行(對於主網,對於同一文件中的測試網和 regtest 類似)。
validation.cpp
您需要這樣做,以便將事務添加到索引中,並繞過一些使其無法使用的檢查。在
v0.16
:
validation.cpp
您可以在#1812 行中找到未將其添加到索引的位置。註釋掉第 1817 行return true
以避免跳過它。您可能還需要在以下位置跳過驗證測試(例如,如果您的創世塊難度較低,如果您有預挖):
- 通過在其周圍添加檢查來跳過
nLockTimeFlags |= LOCKTIME_VERIFY_SEQUENCE;
第#1891 行:
if (block.GetHash() != chainparams.GetConsensus().hashGenesisBlock) { if (VersionBitsState(pindex->pprev, chainparams.GetConsensus(), Consensus::DEPLOYMENT_CSV, versionbitscache) == THRESHOLD_ACTIVE) { nLockTimeFlags |= LOCKTIME_VERIFY_SEQUENCE; } }
3. 第 1988 行if (!WriteUndoDataForBlock(blockundo, state, pindex, chainparams)) return false;
也有類似的異常(檢查 != 創世塊) 4. Line #1805和Lines #1873-1876的類似例外基本上,您需要執行它並嘗試查看它在日誌中失敗的位置,因為您違反了一堆規則。