commit 26d73cba0ee6ad8e07ba2262dc716a8658863899
parent 99845942e5cef1b8e77efb32ca17a107940217c1
Author: SomberNight <somber.night@protonmail.com>
Date: Tue, 23 Feb 2021 02:13:16 +0100
interface.get_history: enforce sorted order of heights
related: #7058
Diffstat:
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/electrum/interface.py b/electrum/interface.py
@@ -938,14 +938,21 @@ class Interface(Logger):
res = await self.session.send_request('blockchain.scripthash.get_history', [sh])
# check response
assert_list_or_tuple(res)
+ prev_height = 1
for tx_item in res:
- assert_dict_contains_field(tx_item, field_name='height')
+ height = assert_dict_contains_field(tx_item, field_name='height')
assert_dict_contains_field(tx_item, field_name='tx_hash')
- assert_integer(tx_item['height'])
+ assert_integer(height)
assert_hash256_str(tx_item['tx_hash'])
- if tx_item['height'] in (-1, 0):
+ if height in (-1, 0):
assert_dict_contains_field(tx_item, field_name='fee')
assert_non_negative_integer(tx_item['fee'])
+ prev_height = - float("inf") # this ensures confirmed txs can't follow mempool txs
+ else:
+ # check monotonicity of heights
+ if height < prev_height:
+ raise RequestCorrupted(f'heights of confirmed txs must be in increasing order')
+ prev_height = height
return res
async def listunspent_for_scripthash(self, sh: str) -> List[dict]: