tlnpeer: longer timeouts - electrum - Electrum Bitcoin wallet (HTM) git clone https://git.parazyd.org/electrum (DIR) Log (DIR) Files (DIR) Refs (DIR) Submodules --- (DIR) commit 4f741cfcccef00dae94e571de57d914801601d5e (DIR) parent 58681e4d077fe9eb9670222252a19db49f671ddd (HTM) Author: SomberNight <somber.night@protonmail.com> Date: Thu, 5 Sep 2019 18:31:51 +0200 lnpeer: longer timeouts Diffstat: M electrum/lnpeer.py | 19 +++++++++++-------- M electrum/lnworker.py | 4 ++-- 2 files changed, 13 insertions(+), 10 deletions(-) --- (DIR) diff --git a/electrum/lnpeer.py b/electrum/lnpeer.py t@@ -53,6 +53,9 @@ if TYPE_CHECKING: from .lnrouter import RouteEdge +LN_P2P_NETWORK_TIMEOUT = 20 + + def channel_id_from_funding_tx(funding_txid: str, funding_index: int) -> Tuple[bytes, bytes]: funding_txid_bytes = bytes.fromhex(funding_txid)[::-1] i = int.from_bytes(funding_txid_bytes, 'big') ^ funding_index t@@ -308,12 +311,12 @@ class Peer(Logger): async def query_gossip(self): try: - await asyncio.wait_for(self.initialized.wait(), 10) + await asyncio.wait_for(self.initialized.wait(), LN_P2P_NETWORK_TIMEOUT) except asyncio.TimeoutError as e: raise GracefulDisconnect("initialize timed out") from e if self.lnworker == self.lnworker.network.lngossip: try: - ids, complete = await asyncio.wait_for(self.get_channel_range(), 10) + ids, complete = await asyncio.wait_for(self.get_channel_range(), LN_P2P_NETWORK_TIMEOUT) except asyncio.TimeoutError as e: raise GracefulDisconnect("query_channel_range timed out") from e self.logger.info('Received {} channel ids. (complete: {})'.format(len(ids), complete)) t@@ -426,7 +429,7 @@ class Peer(Logger): async def _message_loop(self): try: - await asyncio.wait_for(self.initialize(), 10) + await asyncio.wait_for(self.initialize(), LN_P2P_NETWORK_TIMEOUT) except (OSError, asyncio.TimeoutError, HandshakeFailed) as e: raise GracefulDisconnect(f'initialize failed: {repr(e)}') from e async for msg in self.transport.read_messages(): t@@ -480,7 +483,7 @@ class Peer(Logger): # dry run creating funding tx to see if we even have enough funds funding_tx_test = wallet.mktx([TxOutput(bitcoin.TYPE_ADDRESS, wallet.dummy_address(), funding_sat)], password, self.lnworker.config, nonlocal_only=True) - await asyncio.wait_for(self.initialized.wait(), 1) + await asyncio.wait_for(self.initialized.wait(), LN_P2P_NETWORK_TIMEOUT) feerate = self.lnworker.current_feerate_per_kw() local_config = self.make_local_config(funding_sat, push_msat, LOCAL) # for the first commitment transaction t@@ -508,7 +511,7 @@ class Peer(Logger): channel_reserve_satoshis=local_config.reserve_sat, htlc_minimum_msat=1, ) - payload = await asyncio.wait_for(self.channel_accepted[temp_channel_id].get(), 5) + payload = await asyncio.wait_for(self.channel_accepted[temp_channel_id].get(), LN_P2P_NETWORK_TIMEOUT) if payload.get('error'): raise Exception('Remote Lightning peer reported error: ' + repr(payload.get('error'))) remote_per_commitment_point = payload['first_per_commitment_point'] t@@ -583,13 +586,13 @@ class Peer(Logger): funding_txid=funding_txid_bytes, funding_output_index=funding_index, signature=sig_64) - payload = await asyncio.wait_for(self.funding_signed[channel_id].get(), 5) + payload = await asyncio.wait_for(self.funding_signed[channel_id].get(), LN_P2P_NETWORK_TIMEOUT) self.logger.info('received funding_signed') remote_sig = payload['signature'] chan.receive_new_commitment(remote_sig, []) # broadcast funding tx # TODO make more robust (timeout low? server returns error?) - await asyncio.wait_for(self.network.broadcast_transaction(funding_tx), 5) + await asyncio.wait_for(self.network.broadcast_transaction(funding_tx), LN_P2P_NETWORK_TIMEOUT) chan.open_with_first_pcp(remote_per_commitment_point, remote_sig) return chan t@@ -1520,7 +1523,7 @@ class Peer(Logger): while True: our_sig, closing_tx = chan.make_closing_tx(scriptpubkey, payload['scriptpubkey'], fee_sat=our_fee) self.send_message('closing_signed', channel_id=chan.channel_id, fee_satoshis=our_fee, signature=our_sig) - cs_payload = await asyncio.wait_for(self.closing_signed[chan.channel_id].get(), 10) + cs_payload = await asyncio.wait_for(self.closing_signed[chan.channel_id].get(), LN_P2P_NETWORK_TIMEOUT) their_fee = int.from_bytes(cs_payload['fee_satoshis'], 'big') their_sig = cs_payload['signature'] if our_fee == their_fee: (DIR) diff --git a/electrum/lnworker.py b/electrum/lnworker.py t@@ -33,7 +33,7 @@ from .util import ignore_exceptions from .util import timestamp_to_datetime from .logging import Logger from .lntransport import LNTransport, LNResponderTransport -from .lnpeer import Peer +from .lnpeer import Peer, LN_P2P_NETWORK_TIMEOUT from .lnaddr import lnencode, LnAddr, lndecode from .ecc import der_sig_from_sig_string from .lnchannel import Channel, ChannelJsonEncoder t@@ -731,7 +731,7 @@ class LNWallet(LNWorker): async def _open_channel_coroutine(self, connect_str, local_amount_sat, push_sat, password): peer = await self.add_peer(connect_str) # peer might just have been connected to - await asyncio.wait_for(peer.initialized.wait(), 5) + await asyncio.wait_for(peer.initialized.wait(), LN_P2P_NETWORK_TIMEOUT) chan = await peer.channel_establishment_flow( password, funding_sat=local_amount_sat + push_sat,