This commit is contained in:
Jack Robison 2020-11-09 13:56:46 -05:00
parent bdc7f4b3f5
commit 83bcab9cd2
No known key found for this signature in database
GPG key ID: DF25C68FE0239BB2

View file

@ -404,44 +404,36 @@ class BlockProcessor:
self.tip = self.coin.header_hash(headers[-1]) self.tip = self.coin.header_hash(headers[-1])
def advance_txs(self, height, txs, header): def advance_txs(self, height, txs, header):
self.block_txs.append((b''.join(tx_hash for tx, tx_hash in txs), [tx for tx, _ in txs])) self.block_txs.append((b''.join(tx_hash for tx, tx_hash in txs), [tx.raw for tx, _ in txs]))
# Use local vars for speed in the loops # Use local vars for speed in the loops
undo_info = [] undo_info = []
tx_num = self.tx_count tx_num = self.tx_count
script_hashX = self.coin.hashX_from_script
s_pack = pack
put_utxo = self.utxo_cache.__setitem__
spend_utxo = self.spend_utxo
undo_info_append = undo_info.append
update_touched = self.touched.update
hashXs_by_tx = [] hashXs_by_tx = []
append_hashXs = hashXs_by_tx.append
for tx, tx_hash in txs: for tx, tx_hash in txs:
hashXs = [] hashXs = []
append_hashX = hashXs.append append_hashX = hashXs.append
tx_numb = s_pack('<I', tx_num) tx_numb = pack('<I', tx_num)
# Spend the inputs # Spend the inputs
for txin in tx.inputs: for txin in tx.inputs:
if txin.is_generation(): if txin.is_generation():
continue continue
cache_value = spend_utxo(txin.prev_hash, txin.prev_idx) cache_value = self.spend_utxo(txin.prev_hash, txin.prev_idx)
undo_info_append(cache_value) undo_info.append(cache_value)
append_hashX(cache_value[:-12]) append_hashX(cache_value[:-12])
# Add the new UTXOs # Add the new UTXOs
for idx, txout in enumerate(tx.outputs): for idx, txout in enumerate(tx.outputs):
# Get the hashX. Ignore unspendable outputs # Get the hashX. Ignore unspendable outputs
hashX = script_hashX(txout.pk_script) hashX = self.coin.hashX_from_script(txout.pk_script)
if hashX: if hashX:
append_hashX(hashX) append_hashX(hashX)
put_utxo(tx_hash + s_pack('<H', idx), self.utxo_cache[tx_hash + pack('<H', idx)] = hashX + tx_numb + pack('<Q', txout.value)
hashX + tx_numb + s_pack('<Q', txout.value))
append_hashXs(hashXs) hashXs_by_tx.append(hashXs)
update_touched(hashXs) self.touched.update(hashXs)
tx_num += 1 tx_num += 1
self.db.history.add_unflushed(hashXs_by_tx, self.tx_count) self.db.history.add_unflushed(hashXs_by_tx, self.tx_count)
@ -487,20 +479,16 @@ class BlockProcessor:
# Use local vars for speed in the loops # Use local vars for speed in the loops
s_pack = pack s_pack = pack
put_utxo = self.utxo_cache.__setitem__
spend_utxo = self.spend_utxo
script_hashX = self.coin.hashX_from_script
touched = self.touched
undo_entry_len = 12 + HASHX_LEN undo_entry_len = 12 + HASHX_LEN
for tx, tx_hash in reversed(txs): for tx, tx_hash in reversed(txs):
for idx, txout in enumerate(tx.outputs): for idx, txout in enumerate(tx.outputs):
# Spend the TX outputs. Be careful with unspendable # Spend the TX outputs. Be careful with unspendable
# outputs - we didn't save those in the first place. # outputs - we didn't save those in the first place.
hashX = script_hashX(txout.pk_script) hashX = self.coin.hashX_from_script(txout.pk_script)
if hashX: if hashX:
cache_value = spend_utxo(tx_hash, idx) cache_value = self.spend_utxo(tx_hash, idx)
touched.add(cache_value[:-12]) self.touched.add(cache_value[:-12])
# Restore the inputs # Restore the inputs
for txin in reversed(tx.inputs): for txin in reversed(tx.inputs):
@ -508,9 +496,8 @@ class BlockProcessor:
continue continue
n -= undo_entry_len n -= undo_entry_len
undo_item = undo_info[n:n + undo_entry_len] undo_item = undo_info[n:n + undo_entry_len]
put_utxo(txin.prev_hash + s_pack('<H', txin.prev_idx), self.utxo_cache[txin.prev_hash + s_pack('<H', txin.prev_idx)] = undo_item
undo_item) self.touched.add(undo_item[:-12])
touched.add(undo_item[:-12])
assert n == 0 assert n == 0
self.tx_count -= len(txs) self.tx_count -= len(txs)