try:
while height < db_height:
- height = height + 1
+ height += 1
header = self.get_header(height)
if height > 1:
- assert prev_hash == header.get('prev_block_hash')
+ if prev_hash != header.get('prev_block_hash'):
+ # The prev_hash block is orphaned, go back
+ print_log("reorganizing, a block in file is orphaned:", prev_hash)
+ # Go to the parent of the orphaned block
+ height -= 2
+ prev_hash = self.hash_header(self.read_header(height))
+ continue
+
self.write_header(header, sync=False)
prev_hash = self.hash_header(header)
if (height % 1000) == 0:
self.up_to_date = True
break
+ # fixme: this is unsafe, if we revert when the undo info is not yet written
+ revert = (random.randint(1, 100) == 1) if self.test_reorgs else False
+
# not done..
self.up_to_date = False
- next_block = self.bitcoind('getblockbynumber', [self.storage.height + 1, True])
- next_block_hash = next_block.get('hash')
- self.mtime('daemon')
+ try:
+ next_block = self.bitcoind('getblockbynumber', [self.storage.height + 1, True])
+ next_block_hash = next_block.get('hash')
+ except BaseException, e:
+ revert = True
+ next_block = next_block.get(self.storage.last_hash)
- # fixme: this is unsafe, if we revert when the undo info is not yet written
- revert = (random.randint(1, 100) == 1) if self.test_reorgs else False
+ self.mtime('daemon')
if (next_block.get('previousblockhash') == self.storage.last_hash) and not revert: