optimize header check

This commit is contained in:
Victor Shyba 2019-07-15 20:37:55 -03:00 committed by Lex Berezhny
parent 0f1bde2274
commit f96443515a

View file

@ -170,23 +170,26 @@ class BaseHeaders:
async def repair(self): async def repair(self):
previous_header_hash = fail = None previous_header_hash = fail = None
for height in range(self.height): self.io.seek(0)
raw = self.get_raw_header(height) batch_size = 10000
header = self.deserialize(height, raw) for start_height in range(0, self.height, batch_size):
if height: headers = self.io.read(self.header_size*batch_size)
if header['prev_block_hash'] != previous_header_hash: for header_hash, header in self._iterate_headers(start_height, headers):
fail = True height = header['block_height']
else: if height:
if self.hash_header(raw) != self.genesis_hash: if header['prev_block_hash'] != previous_header_hash:
fail = True fail = True
if fail: else:
log.warning("Header file corrupted at height %s, truncating it.", height - 1) if header_hash != self.genesis_hash:
self.io.seek((height - 1) * self.header_size, os.SEEK_SET) fail = True
self.io.truncate() if fail:
self.io.flush() log.warning("Header file corrupted at height %s, truncating it.", height - 1)
self._size = None self.io.seek((height - 1) * self.header_size, os.SEEK_SET)
return self.io.truncate()
previous_header_hash = self.hash_header(raw) self.io.flush()
self._size = None
return
previous_header_hash = header_hash
@staticmethod @staticmethod
def get_proof_of_work(header_hash: bytes) -> ArithUint256: def get_proof_of_work(header_hash: bytes) -> ArithUint256: