블록 체인의 모든 사본이 동일합니까? 파일 내에 오류가있는 경우 백업에서이 파일을 복사하고 체인 상태를 다시 색인화 할 수 있어야합니까?
최근에 블록 체인의 처음 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.dat
및에 있음을 의미한다고 생각 합니다 rev00000.dat
. 내가 맞아?
그래서 저는이 파일을 블록 체인 백업에서 다시 복사했습니다. 두 번째 노드에서 가져온 것입니다. 하지만 파일이 똑같다고 생각 하겠죠?
하지만 동일한 위치에서 똑같은 오류가 발생합니다 -reindex-chainstate
.
로그에서 번호 254
가 인덱싱 될 때까지 모든 블록 이 인덱싱되지만 height 255
.
그 오래된 파일에는 항상 같은 블록이 포함되어 있다고 생각합니다. 254 블록이 정확하지만 다음 블록에서는 실패하는 방법은 무엇입니까?
이것이 단순히 마운트의 문제일까요?
편집 : 나는 현재 -reindex
노래하고 있습니다. 이 경우 내 blocks
폴더 에서 이미 링크 한 파일은 다음과 같이 사용됩니다.
Reindexing block file blk00000.dat...
Loaded 119964 blocks from external file in 133291ms
분명히 첫 번째 파일에는 119,964 개의 블록이 포함되어 있습니다. 따라서 오류가 발생 height=255
하면 첫 번째 파일에 확실히 있어야합니다.
답변
그래서 저는이 파일을 블록 체인 백업에서 다시 복사했습니다. 두 번째 노드에서 가져온 것입니다. 하지만 파일이 똑같다고 생각 하겠죠?
아니요. 블록은 순서없이 다운로드되지만 다운로드 된 순서대로 디스크에 기록됩니다. 따라서 모든 노드가 약간 다른 순서로 저장된 블록을 가질 가능성이 높기 때문에 블록 인덱스 (각 블록의 위치를 나타냄)는 모든 노드마다 다릅니다.
또한 노드가 부실 블록을 수신 한 경우 해당 부실 블록도 디스크에 저장되고 블록 인덱스에 항목이 있습니다. 모든 노드가 동일한 부실 블록을 갖는 것은 아니며 동일한 순서로 저장되지 않을 수 있습니다. 새로 동기화 된 노드는 동기화되기 전의 부실 블록을 가지지 않으며 전파 지연으로 인해 부실 블록이 부실화되는 경우가 많으므로 노드가 저장할 부실 블록을받지 못할 수도 있습니다.
한 노드에서 다른 노드로 개별 블록 파일을 복사 할 수는 없습니다. 전체 블록 체인과 블록 인덱스를 복사해야합니다. 그렇지 않으면 전체가 손상되어 블록 체인을 다시 다운로드해야합니다.