electrum

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

commit df960700c9868177ed2f0337c211bb3569665ebb
parent 322acd93d95cc16fe114857005e614bc1f849858
Author: ThomasV <thomasv@electrum.org>
Date:   Fri, 22 Jun 2018 12:17:11 +0200

reestablish channels in network callback

Diffstat:
Mlib/lnbase.py | 5++---
Mlib/lnwatcher.py | 15++++++---------
Mlib/lnworker.py | 11++++++++++-
3 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/lib/lnbase.py b/lib/lnbase.py @@ -790,8 +790,6 @@ class Peer(PrintError): msg = await self.read_message() self.process_message(msg) self.initialized.set_result(True) - # reestablish channels - [self.reestablish_channel(c) for c in self.channels.values() if self.lnworker.channel_state[c.channel_id] != "CLOSED"] # loop while True: self.ping_if_required() @@ -930,7 +928,8 @@ class Peer(PrintError): assert success, success return chan._replace(remote_state=chan.remote_state._replace(ctn=0),local_state=chan.local_state._replace(ctn=0, current_commitment_signature=remote_sig)) - def reestablish_channel(self, chan): + async def reestablish_channel(self, chan): + await self.initialized self.channel_state[chan.channel_id] = 'REESTABLISHING' self.network.trigger_callback('channel', chan) self.send_message(gen_msg("channel_reestablish", diff --git a/lib/lnwatcher.py b/lib/lnwatcher.py @@ -1,13 +1,12 @@ from .util import PrintError -from .lnbase import Outpoint, funding_output_script +from .lnbase import funding_output_script from .bitcoin import redeem_script_to_address class LNWatcher(PrintError): def __init__(self, network, channel_state): self.network = network - self.channel_state = channel_state - self.channels ={} + self.watched_channels = {} def parse_response(self, response): if response.get('error'): @@ -15,10 +14,10 @@ class LNWatcher(PrintError): return None, None return response['params'], response['result'] - def watch_channel(self, chan): + def watch_channel(self, chan, callback): script = funding_output_script(chan.local_config, chan.remote_config) funding_address = redeem_script_to_address('p2wsh', script) - self.channels[funding_address] = chan + self.watched_channels[funding_address] = chan, callback self.network.subscribe_to_addresses([funding_address], self.on_address_status) def on_address_status(self, response): @@ -33,7 +32,5 @@ class LNWatcher(PrintError): if not params: return addr = params[0] - chan = self.channels[addr] - outpoints = [Outpoint(x["tx_hash"], x["tx_pos"]) for x in result] - if chan.funding_outpoint not in outpoints: - self.channel_state[chan.channel_id] = "CLOSED" + chan, callback = self.watched_channels[addr] + callback(chan, result) diff --git a/lib/lnworker.py b/lib/lnworker.py @@ -102,7 +102,7 @@ class LNWorker(PrintError): self.channel_state = {chan.channel_id: "DISCONNECTED" for chan in self.channels.values()} self.lnwatcher = LNWatcher(network, self.channel_state) for chan_id, chan in self.channels.items(): - self.lnwatcher.watch_channel(chan) + self.lnwatcher.watch_channel(chan, self.on_channel_utxos) for host, port, pubkey in peer_list: self.add_peer(host, int(port), pubkey) # wait until we see confirmations @@ -153,6 +153,15 @@ class LNWorker(PrintError): return chan return None + def on_channel_utxos(self, chan, utxos): + outpoints = [Outpoint(x["tx_hash"], x["tx_pos"]) for x in utxos] + if chan.funding_outpoint not in outpoints: + self.channel_state[chan.channel_id] = "CLOSED" + elif self.channel_state[chan.channel_id] == 'DISCONNECTED': + peer = self.peers[chan.node_id] + coro = peer.reestablish_channel(chan) + asyncio.run_coroutine_threadsafe(coro, self.network.asyncio_loop) + def on_network_update(self, event, *args): for chan in self.channels.values(): peer = self.peers[chan.node_id]