ブロックチェーンのすべてのコピーは同じですか?ファイル内にエラーがある場合、バックアップからこのファイルをコピーしてチェーン状態のインデックスを再作成できますか?

Nov 26 2020

最近、ブロックチェーンの最初の2000ファイルをSSDからHDDに移動しました。HDDがにマウントされ/mnt/extます。

次に、ファイルごとのシンボリックリンクblocksが、リモートファイルを指すように配置されます。したがって、私のブロックフォルダはまだSSDにありますが、ファイルはHDDにあります。

私はbitcoind -reindex-chainstateすべてがまだ機能することを確認しようとしましたが、今はエラーが発生しています:

2020-11-26T12:52:24Z ERROR: ReadBlockFromDisk(CBlock&, CBlockIndex*): GetHash() doesn't match index for CBlockIndex(pprev=0x44288c0, nHeight=255, merkle=4309bfeed77a70f309da08bcf8948906b9cc26120c0b0ef86e0ac67284bbd79e, hashBlock=00000000d0a75c861fabf9ff7b92022f60e4afeed9331fe5aa073d8e4706fe3c) at FlatFilePos(nFile=0, nPos=58808)
2020-11-26T12:52:24Z *** Failed to read block

今、私はいくつかの質問があります。私が思うにnFile=0、ブロックがであることを意味するblk00000.datrev00000.dat。私は正しいですか?

そこで、ブロックチェーンのバックアップからこのファイルを再度コピーしました。これは2番目のノードからのものです。しかし、ファイルは同じだと思いますよね?

しかし、同じ位置でまったく同じエラーが発生します-新しい-reindex-chainstate

ログを見ると、番号254がインデックスに登録されるまでのすべてのブロックが、ブロックで失敗するたびにheight 255

それらの古いファイルには常に同じブロックが含まれていると思います。254ブロックが正しいのに、次のブロックで失敗するのはどうしてですか?

これは単にマウントの問題でしょうか?


編集:私は現在-reindexingしています。この場合、blocksフォルダからすでにリンクしているファイルは次のように使用されます。

Reindexing block file blk00000.dat...
Loaded 119964 blocks from external file in 133291ms

どうやら、最初のファイルには119,964ブロックが含まれています。したがって、エラーが発生したheight=255場合は、間違いなく最初のファイルにあるはずです。

回答

3 AndrewChow Nov 27 2020 at 00:34

そこで、ブロックチェーンのバックアップからこのファイルを再度コピーしました。これは2番目のノードからのものです。しかし、ファイルは同じだと思いますよね?

いいえ。ブロックは順不同でダウンロードされますが、ダウンロードされた順序でディスクに書き込まれます。したがって、すべてのノードにはわずかに異なる順序でブロックが格納される可能性があるため、ブロックインデックス(各ブロックが配置されている場所を示す)はノードごとに異なります。

さらに、ノードが古いブロックを受信した場合、それらの古いブロックもディスクに保存され、ブロックインデックスにエントリがあります。すべてのノードが同じ古いブロックを持つわけではなく、同じ順序で保存されない場合があります。新しく同期されたノードには、同期される前の古いブロックがありません。また、伝播の遅延のために古いブロックが古くなることがよくあるため、ノードは保存する古いブロックを受信することさえできません。

個々のブロックファイルをあるノードから別のノードにコピーすることはできません。ブロックチェーン全体とブロックインデックスをコピーする必要があります。そうしないと、おそらく全体が破損し、ブロックチェーンを再ダウンロードする必要があります。