Browse Source

session: rework transaction.get_merkle: avoid calling bitcoind (#789)

use ElectrumX's db instead
patch-2
ghost43 6 years ago
committed by Neil
parent
commit
593fb548bf
  1. 21
      electrumx/server/db.py
  2. 10
      electrumx/server/session.py

21
electrumx/server/db.py

@ -402,7 +402,7 @@ class DB(object):
return await run_in_thread(read_headers)
def fs_tx_hash(self, tx_num):
'''Return a par (tx_hash, tx_height) for the given tx number.
'''Return a pair (tx_hash, tx_height) for the given tx number.
If the tx_height is not on disk, returns (None, tx_height).'''
tx_height = bisect_right(self.tx_counts, tx_num)
@ -412,6 +412,25 @@ class DB(object):
tx_hash = self.hashes_file.read(tx_num * 32, 32)
return tx_hash, tx_height
def fs_tx_hashes_at_blockheight(self, block_height):
'''Return a list of tx_hashes at given block height,
in the same order as in the block.
'''
if block_height > self.db_height:
raise self.DBError(f'block {block_height:,d} not on disk (>{self.db_height:,d})')
assert block_height >= 0
if block_height > 0:
first_tx_num = self.tx_counts[block_height - 1]
else:
first_tx_num = 0
num_txs_in_block = self.tx_counts[block_height] - first_tx_num
tx_hashes = self.hashes_file.read(first_tx_num * 32, num_txs_in_block * 32)
assert num_txs_in_block == len(tx_hashes) // 32
return [tx_hashes[idx * 32: (idx+1) * 32] for idx in range(num_txs_in_block)]
async def tx_hashes_at_blockheight(self, block_height):
return await run_in_thread(self.fs_tx_hashes_at_blockheight, block_height)
async def fs_block_hashes(self, height, count):
headers_concat, headers_count = await self.read_headers(height, count)
if headers_count != count:

10
electrumx/server/session.py

@ -1194,10 +1194,12 @@ class ElectrumX(SessionBase):
ordered list of hexadecimal strings.
'''
height = non_negative_integer(height)
hex_hashes = await self.daemon_request('block_hex_hashes', height, 1)
block_hash = hex_hashes[0]
block = await self.daemon_request('deserialised_block', block_hash)
tx_hashes = block['tx']
try:
block_hash = hash_to_hex_str((await self.db.fs_block_hashes(height, 1))[0])
tx_hashes = await self.db.tx_hashes_at_blockheight(height)
except self.db.DBError as e:
raise RPCError(BAD_REQUEST, f'db error: {e!r}')
tx_hashes = [hash_to_hex_str(hash) for hash in tx_hashes]
self.bump_cost(1.0 + len(tx_hashes) / 1000)
return block_hash, tx_hashes

Loading…
Cancel
Save