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:
vds = deserialize.BCDataStream()
vds.write(raw_tx.decode('hex'))
try:
- return deserialize.parse_Transaction(vds, is_coinbase=False, is_coinstake=False)
+ return deserialize.parse_Transaction(vds, is_coinbase=False)
except:
print_log("ERROR: cannot parse", txid)
return None
def deserialize_block(self, block):
- is_stake_block = False
txlist = block.get('tx')
- if "proof-of-stake" in block.get('flags'): # scan block flags list for
- is_stake_block = True # "proof-of-stake" substring
tx_hashes = [] # ordered txids
txdict = {} # deserialized tx
- for i in xrange(len(txlist)):
- if is_stake_block and i == 0: # skip coinbase for
- continue # stake block
- tx_hash = hash_encode(Hash(txlist[i].decode('hex')))
+ for i, raw_tx in enumerate(txlist):
+ tx_hash = hash_encode(Hash(raw_tx.decode('hex')))
vds = deserialize.BCDataStream()
- vds.write(txlist[i].decode('hex'))
+ vds.write(raw_tx.decode('hex'))
try:
- tx = deserialize.parse_Transaction(vds, i == 0, is_stake_block and i == 1) # first transaction is always coinbase
- except: # second transaction is coinstake if we have a stake block
+ tx = deserialize.parse_Transaction(vds, i == 0) # first transaction is always coinbase
+ except:
print_log("ERROR: cannot parse", tx_hash)
continue
tx_hashes.append(tx_hash)
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: