Browse Source

export channel backup from kivy gui

hard-fail-on-bad-server-string
ThomasV 5 years ago
parent
commit
e50f6d29ed
  1. 12
      electrum/gui/kivy/uix/dialogs/lightning_channels.py
  2. 8
      electrum/lnchannel.py
  3. 18
      electrum/lnworker.py
  4. 3
      electrum/tests/test_lnpeer.py

12
electrum/gui/kivy/uix/dialogs/lightning_channels.py

@ -180,6 +180,11 @@ Builder.load_string(r'''
BoxLayout: BoxLayout:
size_hint: 1, None size_hint: 1, None
height: '48dp' height: '48dp'
Button:
size_hint: 0.5, None
height: '48dp'
text: _('Backup')
on_release: root.export_backup()
Button: Button:
size_hint: 0.5, None size_hint: 0.5, None
height: '48dp' height: '48dp'
@ -284,6 +289,9 @@ class ChannelBackupPopup(Popup):
super(ChannelBackupPopup,self).__init__(**kwargs) super(ChannelBackupPopup,self).__init__(**kwargs)
self.chan = chan self.chan = chan
self.app = app self.app = app
self.short_id = format_short_channel_id(chan.short_channel_id)
self.state = chan.get_state_for_GUI()
self.title = _('Channel Backup')
def request_force_close(self): def request_force_close(self):
msg = _('Request force close?') msg = _('Request force close?')
@ -363,6 +371,10 @@ class ChannelDetailsPopup(Popup):
self.app._trigger_update_history() self.app._trigger_update_history()
self.dismiss() self.dismiss()
def export_backup(self):
text = self.app.wallet.lnworker.export_channel_backup(self.chan.channel_id)
self.app.qr_dialog(_("Channel Backup " + self.chan.short_id_for_GUI()), 'channel_backup:'+text)
def force_close(self): def force_close(self):
Question(_('Force-close channel?'), self._force_close).open() Question(_('Force-close channel?'), self._force_close).open()

8
electrum/lnchannel.py

@ -146,6 +146,8 @@ class AbstractChannel(Logger):
self.logger.debug(f'Setting channel state: {old_state.name} -> {state.name}') self.logger.debug(f'Setting channel state: {old_state.name} -> {state.name}')
self._state = state self._state = state
self.storage['state'] = self._state.name self.storage['state'] = self._state.name
if self.lnworker:
self.lnworker.channel_state_changed(self)
def get_state(self) -> channel_states: def get_state(self) -> channel_states:
return self._state return self._state
@ -567,12 +569,6 @@ class Channel(AbstractChannel):
self.hm.channel_open_finished() self.hm.channel_open_finished()
self.peer_state = peer_states.GOOD self.peer_state = peer_states.GOOD
def set_state(self, state: channel_states) -> None:
super().set_state(state)
if self.lnworker:
self.lnworker.save_channel(self)
self.lnworker.network.trigger_callback('channel', self)
def get_state_for_GUI(self): def get_state_for_GUI(self):
# status displayed in the GUI # status displayed in the GUI
cs = self.get_state() cs = self.get_state()

18
electrum/lnworker.py

@ -657,6 +657,10 @@ class LNWallet(LNWorker):
with self.lock: with self.lock:
return {x: y for (x, y) in self.channels.items() if y.node_id == node_id} return {x: y for (x, y) in self.channels.items() if y.node_id == node_id}
def channel_state_changed(self, chan):
self.save_channel(chan)
self.network.trigger_callback('channel', chan)
def save_channel(self, chan): def save_channel(self, chan):
assert type(chan) is Channel assert type(chan) is Channel
if chan.config[REMOTE].next_per_commitment_point == chan.config[REMOTE].current_per_commitment_point: if chan.config[REMOTE].next_per_commitment_point == chan.config[REMOTE].current_per_commitment_point:
@ -1367,6 +1371,9 @@ class LNBackups(Logger):
for channel_id, cb in self.db.get_dict("channel_backups").items(): for channel_id, cb in self.db.get_dict("channel_backups").items():
self.channel_backups[bfh(channel_id)] = ChannelBackup(cb, sweep_address=self.sweep_address, lnworker=self) self.channel_backups[bfh(channel_id)] = ChannelBackup(cb, sweep_address=self.sweep_address, lnworker=self)
def channel_state_changed(self, chan):
self.network.trigger_callback('channel', chan)
def peer_closed(self, chan): def peer_closed(self, chan):
pass pass
@ -1390,16 +1397,17 @@ class LNBackups(Logger):
def import_channel_backup(self, encrypted): def import_channel_backup(self, encrypted):
xpub = self.wallet.get_fingerprint() xpub = self.wallet.get_fingerprint()
x = pw_decode_bytes(encrypted, xpub, version=PW_HASH_VERSION_LATEST) decrypted = pw_decode_bytes(encrypted, xpub, version=PW_HASH_VERSION_LATEST)
cb = ChannelBackupStorage.from_bytes(x) cb_storage = ChannelBackupStorage.from_bytes(decrypted)
channel_id = cb.channel_id().hex() channel_id = cb_storage.channel_id().hex()
d = self.db.get_dict("channel_backups") d = self.db.get_dict("channel_backups")
if channel_id in d: if channel_id in d:
raise Exception('Channel already in wallet') raise Exception('Channel already in wallet')
d[channel_id] = cb d[channel_id] = cb_storage
self.channel_backups[bfh(channel_id)] = ChannelBackup(cb, sweep_address=self.sweep_address, lnworker=self) self.channel_backups[bfh(channel_id)] = cb = ChannelBackup(cb_storage, sweep_address=self.sweep_address, lnworker=self)
self.wallet.save_db() self.wallet.save_db()
self.network.trigger_callback('channels_updated', self.wallet) self.network.trigger_callback('channels_updated', self.wallet)
self.lnwatcher.add_channel(cb.funding_outpoint.to_str(), cb.get_funding_address())
def remove_channel_backup(self, channel_id): def remove_channel_backup(self, channel_id):
d = self.db.get_dict("channel_backups") d = self.db.get_dict("channel_backups")

3
electrum/tests/test_lnpeer.py

@ -124,6 +124,9 @@ class MockLNWallet(Logger):
if chan.short_channel_id == short_channel_id: if chan.short_channel_id == short_channel_id:
return chan return chan
def channel_state_changed(self, chan):
pass
def save_channel(self, chan): def save_channel(self, chan):
print("Ignoring channel save") print("Ignoring channel save")

Loading…
Cancel
Save