Browse Source

aiorpcx: reintroduce periodic fee updates

master
Janus 7 years ago committed by SomberNight
parent
commit
f12074397f
No known key found for this signature in database
GPG Key ID: B33B5F232C6271E9
  1. 47
      electrum/network.py
  2. 26
      electrum/synchronizer.py

47
electrum/network.py

@ -240,6 +240,9 @@ class Network(PrintError):
deserialize_proxy(self.config.get('proxy'))) deserialize_proxy(self.config.get('proxy')))
self.asyncio_loop = asyncio.get_event_loop() self.asyncio_loop = asyncio.get_event_loop()
self.futures = [] self.futures = []
self.server_info_job = asyncio.Future()
# just to not trigger a warning from switch_to_interface the first time we change default_server
self.server_info_job.set_result(1)
def with_interface_lock(func): def with_interface_lock(func):
def func_wrapper(self, *args, **kwargs): def func_wrapper(self, *args, **kwargs):
@ -312,11 +315,40 @@ class Network(PrintError):
self.notify('status') self.notify('status')
def is_connected(self): def is_connected(self):
return self.interface is not None return self.interface is not None and self.interface.ready.done()
def is_connecting(self): def is_connecting(self):
return self.connection_status == 'connecting' return self.connection_status == 'connecting'
@util.aiosafe
async def request_server_info(self, interface):
await interface.ready
session = interface.session
self.banner = await session.send_request('server.banner')
self.notify('banner')
self.donation_address = await session.send_request('server.donation_address')
self.irc_servers = parse_servers(await session.send_request('server.peers.subscribe'))
self.notify('servers')
await self.request_fee_estimates(interface)
relayfee = await session.send_request('blockchain.relayfee')
self.relay_fee = int(relayfee * COIN) if relayfee is not None else None
async def request_fee_estimates(self, interface):
session = interface.session
from .simple_config import FEE_ETA_TARGETS
self.config.requested_fee_estimates()
histogram = await session.send_request('mempool.get_fee_histogram')
fees = []
for i in FEE_ETA_TARGETS:
fees.append((i, await session.send_request('blockchain.estimatefee', [i])))
self.config.mempool_fees = histogram
self.notify('fee_histogram')
for i, result in fees:
fee = int(result * COIN)
self.config.update_fee_estimates(i, fee)
self.print_error("fee_estimates[%d]" % i, fee)
self.notify('fee')
def get_status_value(self, key): def get_status_value(self, key):
if key == 'status': if key == 'status':
value = self.connection_status value = self.connection_status
@ -512,6 +544,7 @@ class Network(PrintError):
being opened, start a thread to connect. The actual switch will being opened, start a thread to connect. The actual switch will
happen on receipt of the connection notification. Do nothing happen on receipt of the connection notification. Do nothing
if server already is our interface.''' if server already is our interface.'''
old_default_server = self.default_server
self.default_server = server self.default_server = server
if server not in self.interfaces: if server not in self.interfaces:
self.interface = None self.interface = None
@ -525,6 +558,10 @@ class Network(PrintError):
# fixme: we don't want to close headers sub # fixme: we don't want to close headers sub
#self.close_interface(self.interface) #self.close_interface(self.interface)
self.interface = i self.interface = i
if not self.server_info_job.done():
self.print_error('cancelled previous request_server_info job, was it too slow? server was:', old_default_server)
self.server_info_job.cancel()
self.server_info_job = asyncio.get_event_loop().create_task(self.request_server_info(i))
self.trigger_callback('default_server_changed') self.trigger_callback('default_server_changed')
self.set_status('connected') self.set_status('connected')
self.notify('updated') self.notify('updated')
@ -785,10 +822,14 @@ class Network(PrintError):
else: else:
self.switch_to_interface(self.default_server) self.switch_to_interface(self.default_server)
changed = True changed = True
else:
# TODO: request fee_estimates if needed (now in synchronizer) if self.config.is_fee_estimates_update_required():
asyncio.get_event_loop().create_task(self.attempt_fee_estimate_update())
if changed: if changed:
self.notify('updated') self.notify('updated')
await asyncio.sleep(1) await asyncio.sleep(1)
@util.aiosafe
async def attempt_fee_estimate_update(self):
await asyncio.wait_for(self.request_fee_estimates(self.interface), 5)

26
electrum/synchronizer.py

@ -35,8 +35,6 @@ from .transaction import Transaction
from .util import ThreadJob, bh2u, PrintError, aiosafe, bfh, NotificationSession from .util import ThreadJob, bh2u, PrintError, aiosafe, bfh, NotificationSession
from .bitcoin import address_to_scripthash from .bitcoin import address_to_scripthash
from .version import ELECTRUM_VERSION, PROTOCOL_VERSION from .version import ELECTRUM_VERSION, PROTOCOL_VERSION
from .network import parse_servers
from .bitcoin import COIN
def history_status(h): def history_status(h):
if not h: if not h:
@ -161,32 +159,8 @@ class Synchronizer(PrintError):
await self.status_queue.put((h, status)) await self.status_queue.put((h, status))
self.requested_addrs.remove(addr) self.requested_addrs.remove(addr)
async def request_fee_estimates(self):
from .simple_config import FEE_ETA_TARGETS
self.wallet.network.config.requested_fee_estimates()
histogram = await self.session.send_request('mempool.get_fee_histogram')
fees = []
for i in FEE_ETA_TARGETS:
fees.append((i, await self.session.send_request('blockchain.estimatefee', [i])))
return histogram, fees
@aiosafe @aiosafe
async def send_subscriptions(self): async def send_subscriptions(self):
self.wallet.network.banner = await self.session.send_request('server.banner')
self.wallet.network.notify('banner')
self.wallet.network.donation_address = await self.session.send_request('server.donation_address')
self.wallet.network.irc_servers = parse_servers(await self.session.send_request('server.peers.subscribe'))
self.wallet.network.notify('servers')
histogram, fees = await self.request_fee_estimates()
self.wallet.network.config.mempool_fees = histogram
self.wallet.network.notify('fee_histogram')
for i, result in fees:
fee = int(result * COIN)
self.wallet.network.config.update_fee_estimates(i, fee)
self.print_error("fee_estimates[%d]" % i, fee)
self.wallet.network.notify('fee')
relayfee = await self.session.send_request('blockchain.relayfee')
self.wallet.network.relay_fee = int(relayfee * COIN) if relayfee is not None else None
async with TaskGroup() as group: async with TaskGroup() as group:
while True: while True:
addr = await self.add_queue.get() addr = await self.add_queue.get()

Loading…
Cancel
Save