diff --git a/electrumx/server/controller.py b/electrumx/server/controller.py index 16b080a..867a813 100644 --- a/electrumx/server/controller.py +++ b/electrumx/server/controller.py @@ -123,10 +123,3 @@ class Controller(ServerBase): self.create_task(self.peer_mgr.main_loop()) self.create_task(self.session_mgr.start_serving()) self.create_task(self.session_mgr.housekeeping()) - - def raw_header(self, height): - '''Return the binary header at the given height.''' - header, n = self.bp.read_headers(height, 1) - if n != 1: - raise RPCError(BAD_REQUEST, f'height {height:,d} out of range') - return header diff --git a/electrumx/server/peers.py b/electrumx/server/peers.py index fba92ca..a131b06 100644 --- a/electrumx/server/peers.py +++ b/electrumx/server/peers.py @@ -156,7 +156,7 @@ class PeerSession(ClientSession): return # Check prior header too in case of hard fork. check_height = min(our_height, their_height) - raw_header = controller.raw_header(check_height) + raw_header = controller.session_mgr.raw_header(check_height) if self.ptuple >= (1, 4): self.send_request('blockchain.block.header', [check_height], partial(self.on_header, raw_header.hex()), diff --git a/electrumx/server/session.py b/electrumx/server/session.py index b3f124a..5d37bf0 100644 --- a/electrumx/server/session.py +++ b/electrumx/server/session.py @@ -420,12 +420,18 @@ class SessionManager(object): if session_touched is not None: create_task(session.notify_async(session_touched)) + def raw_header(self, height): + '''Return the binary header at the given height.''' + header, n = self.controller.bp.read_headers(height, 1) + if n != 1: + raise RPCError(BAD_REQUEST, f'height {height:,d} out of range') + return header + async def get_history(self, hashX): '''Get history asynchronously to reduce latency.''' if hashX in self.history_cache: return self.history_cache[hashX] - controller = self.controller def job(): # History DoS limit. Each element of history is about 99 # bytes when encoded as JSON. This limits resource usage @@ -434,6 +440,7 @@ class SessionManager(object): limit = self.env.max_send // 97 return list(controller.bp.get_history(hashX, limit=limit)) + controller = self.controller history = await controller.run_in_executor(job) self.history_cache[hashX] = history return history @@ -701,13 +708,13 @@ class ElectrumX(SessionBase): def electrum_header(self, height): '''Return the deserialized header at the given height.''' - raw_header = self.controller.raw_header(height) + raw_header = self.session_mgr.raw_header(height) return self.coin.electrum_header(raw_header, height) def subscribe_headers_result(self, height): '''The result of a header subscription for the given height.''' if self.subscribe_headers_raw: - raw_header = self.controller.raw_header(height) + raw_header = self.session_mgr.raw_header(height) return {'hex': raw_header.hex(), 'height': height} return self.electrum_header(height) @@ -896,7 +903,7 @@ class ElectrumX(SessionBase): dictionary with a merkle proof.''' height = non_negative_integer(height) cp_height = non_negative_integer(cp_height) - raw_header_hex = self.controller.raw_header(height).hex() + raw_header_hex = self.session_mgr.raw_header(height).hex() if cp_height == 0: return raw_header_hex result = {'header': raw_header_hex}