如何創建新的創世塊?
我正在嘗試使用萊特幣創建一個測試幣。為了創建創世塊,我將一些行更改為:
block.nTime = 1390948469; // current time uint256 hashGenesisBlock("0x"); //I dont now it's true or false uint256 hash = block.GetHash(); printf("%s\n", hash.ToString().c_str()); printf("%s\n", hashGenesisBlock.ToString().c_str()); printf("%s\n", block.hashMerkleRoot.ToString().c_str()); assert(block.hashMerkleRoot == uint256("0x")); //I dont now it's true or false. block.print(); assert(hash == hashGenesisBlock);
當我建構守護程序並啟動它時,我收到了這個錯誤:
litecoind: main.cpp:2788: bool InitBlockIndex(): Assertion `hash == hashGenesisBlock' failed. Aborted
當我檢查
./litecoin debug.log
文件時,我看到了萊特幣現在使用的以前的hashMerkleRoot 和 hashGenesisBlock。我無法創建新的雜湊和默克爾根。
創建創世區塊。有些人卡在那裡,這真的很容易:
在裡面找到 LoadBlockIndex() 函式,改變:
- 釋義 (pszTimestamp) 到任何最近的新聞階段。
- 獲取最新的 unix 時間(Google),並輸入 block.nTime。
- 設置任何 nNonce (並不重要),如果你想使用它,你也可以更改測試網的時間/隨機數。
完成後,保存它。現在創世塊不會匹配雜湊檢查和默克爾根檢查,沒關係。
第一次執行編譯後的程式碼(daemon 或 qt)時,它會說“assertion failed”。退出程序,進入config dir(AppData/Roaming下),打開debug.log,得到“block.GetHash() =”後的hash,複製粘貼到main.cpp的beginnig,hashGenesisBlock。還要在同一個日誌文件中獲取 merkle 根,將其粘貼到以下程式碼中的 … 位置,在 LoadBlockIndex()
assert(block.hashMerkleRoot == uint256("0x..."));
重新編譯程式碼,創世塊就創建好了!
順便說一句,不要忘記將“txNew.vout[0].nValue =”更改為您定義的每塊硬幣,保留為 50 沒有關係,只要與您的每塊硬幣一致(在調整之前執行此操作雜湊和 m-root,否則將再次更改)。
檢查<https://bitcointalk.org/index.php?topic=225690.0>了解完整資訊
如果你想生成我們自己獨特的創世塊,你應該生成並替換至少以下參數:
- nTime(unix 時間。如果距現在 5 週,您的錢包將顯示“5 週後沒有可用的塊源”)
- pszTimeStamp(“證明”沒有發生預挖的“時間戳”)
- hashMerkleRoot(基於區塊的coinbase交易的merkle根)
- hashGenesisBlock(創世雜湊本身!)
- nNonce(在搜尋滿足目標(=難度)的雜湊時遞增的正確 nounce)
輸出交易腳本中的公鑰也可以更改為唯一值。然而,由於創世塊無論如何都不能被使用,因此可以使用相同的公鑰,例如萊特幣。此外,如果您計劃創建 Litecoin 複製,則不應更改 nBits。
您可以使用此腳本為 scrypt genesisblock 創建值: https ://github.com/lhartikk/GenesisH0