electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 18bd93446189757143953af09c5982f3123c7872
parent 19e60f00bbb1571ee266e51eb1a246c17c451a16
Author: Janus <ysangkok@gmail.com>
Date:   Wed, 30 Jan 2019 17:50:10 +0100

ln: show full chan id in list, use Event for initialized, more timeouts, return peer from add_peer, set max_htlc_value_in_flight_msat to capacity

Diffstat:
Melectrum/lnbase.py | 21++++++++++++---------
Melectrum/lnworker.py | 9+++++----
2 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/electrum/lnbase.py b/electrum/lnbase.py @@ -199,7 +199,7 @@ class Peer(PrintError): def __init__(self, lnworker: 'LNWorker', peer_addr: LNPeerAddr, request_initial_sync=False, transport: LNTransportBase=None): - self.initialized = asyncio.Future() + self.initialized = asyncio.Event() self.transport = transport self.peer_addr = peer_addr self.lnworker = lnworker @@ -302,6 +302,9 @@ class Peer(PrintError): self.network.trigger_callback('ln_status') def on_init(self, payload): + if self.initialized.is_set(): + self.print_error("ALREADY INITIALIZED BUT RECEIVED INIT") + return # if they required some even flag we don't have, they will close themselves # but if we require an even flag they don't have, we close our_flags = set(list_enabled_bits(self.localfeatures)) @@ -315,7 +318,7 @@ class Peer(PrintError): self.localfeatures ^= 1 << flag # disable flag first_timestamp = self.lnworker.get_first_timestamp() self.send_message('gossip_timestamp_filter', chain_hash=constants.net.rev_genesis_bytes(), first_timestamp=first_timestamp, timestamp_range=b"\xff"*4) - self.initialized.set_result(True) + self.initialized.set() def on_channel_update(self, payload): try: @@ -402,7 +405,7 @@ class Peer(PrintError): revocation_basepoint=keypair_generator(LnKeyFamily.REVOCATION_BASE), to_self_delay=9, dust_limit_sat=546, - max_htlc_value_in_flight_msat=0xffffffffffffffff, + max_htlc_value_in_flight_msat=funding_sat * 1000, max_accepted_htlcs=5, initial_msat=initial_msat, ctn=-1, @@ -424,7 +427,7 @@ class Peer(PrintError): # 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 self.initialized + await asyncio.wait_for(self.initialized.wait(), 1) feerate = self.lnworker.current_feerate_per_kw() local_config = self.make_local_config(funding_sat, push_msat, LOCAL) # for the first commitment transaction @@ -452,7 +455,7 @@ class Peer(PrintError): channel_reserve_satoshis=local_config.reserve_sat, htlc_minimum_msat=1, ) - payload = await self.channel_accepted[temp_channel_id].get() + payload = await asyncio.wait_for(self.channel_accepted[temp_channel_id].get(), 1) if payload.get('error'): raise Exception('Remote Lightning peer reported error: ' + repr(payload.get('error'))) remote_per_commitment_point = payload['first_per_commitment_point'] @@ -528,12 +531,12 @@ class Peer(PrintError): funding_txid=funding_txid_bytes, funding_output_index=funding_index, signature=sig_64) - payload = await self.funding_signed[channel_id].get() + payload = await asyncio.wait_for(self.funding_signed[channel_id].get(), 1) self.print_error('received funding_signed') remote_sig = payload['signature'] chan.receive_new_commitment(remote_sig, []) # broadcast funding tx - await self.network.broadcast_transaction(funding_tx) + await asyncio.wait_for(self.network.broadcast_transaction(funding_tx), 1) chan.remote_commitment_to_be_revoked = chan.pending_commitment(REMOTE) chan.config[REMOTE] = chan.config[REMOTE]._replace(ctn=0, current_per_commitment_point=remote_per_commitment_point, next_per_commitment_point=None) chan.config[LOCAL] = chan.config[LOCAL]._replace(ctn=0, current_commitment_signature=remote_sig, got_sig_for_next=False) @@ -551,7 +554,7 @@ class Peer(PrintError): feerate = int.from_bytes(payload['feerate_per_kw'], 'big') temp_chan_id = payload['temporary_channel_id'] - local_config = self.make_local_config(funding_sat * 1000, push_msat, REMOTE) + local_config = self.make_local_config(funding_sat, push_msat, REMOTE) # for the first commitment transaction per_commitment_secret_first = get_per_commitment_secret_from_seed(local_config.per_commitment_secret_seed, RevocationStore.START_INDEX) @@ -654,7 +657,7 @@ class Peer(PrintError): @log_exceptions async def reestablish_channel(self, chan: Channel): - await self.initialized + await self.initialized.wait() chan_id = chan.channel_id if chan.get_state() != 'DISCONNECTED': self.print_error('reestablish_channel was called but channel {} already in state {}' diff --git a/electrum/lnworker.py b/electrum/lnworker.py @@ -178,7 +178,7 @@ class LNWorker(PrintError): def suggest_peer(self): for node_id, peer in self.peers.items(): - if not(peer.initialized.done()): + if not peer.initialized.is_set(): continue if not all([chan.get_state() in ['CLOSED'] for chan in peer.channels.values()]): continue @@ -193,7 +193,7 @@ class LNWorker(PrintError): port = int(port) peer_addr = LNPeerAddr(host, port, node_id) if node_id in self.peers: - return + return self.peers[node_id] self._last_tried_peer[peer_addr] = time.time() self.print_error("adding peer", peer_addr) peer = Peer(self, peer_addr, request_initial_sync=self.config.get("request_initial_sync", True)) @@ -340,7 +340,7 @@ class LNWorker(PrintError): async def _open_channel_coroutine(self, peer, local_amount_sat, push_sat, password): # peer might just have been connected to - await asyncio.wait_for(peer.initialized, 5) + await asyncio.wait_for(peer.initialized.wait(), 5) chan = await peer.channel_establishment_flow( password, funding_sat=local_amount_sat + push_sat, @@ -579,7 +579,8 @@ class LNWorker(PrintError): yield { 'local_htlcs': json.loads(encoder.encode(chan.hm.log[LOCAL ])), 'remote_htlcs': json.loads(encoder.encode(chan.hm.log[REMOTE])), - 'channel_id': bh2u(chan.short_channel_id), + 'channel_id': bh2u(chan.short_channel_id) if chan.short_channel_id else None, + 'full_channel_id': bh2u(chan.channel_id), 'channel_point': chan.funding_outpoint.to_str(), 'state': chan.get_state(), 'remote_pubkey': bh2u(chan.node_id),