tpayment log: show whether channel have been blacklisted - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit fe550c6c73ae3772d70ef7c5d5bd9eaffa0202ea DIR parent 3897cf725d216db784511f99998f2c42b7eefad8 HTML Author: ThomasV <thomasv@electrum.org> Date: Sat, 12 Oct 2019 18:36:25 +0200 payment log: show whether channel have been blacklisted Diffstat: M electrum/gui/qt/invoice_list.py | 9 +++++---- M electrum/lnworker.py | 37 ++++++++++++++++--------------- 2 files changed, 24 insertions(+), 22 deletions(-) --- DIR diff --git a/electrum/gui/qt/invoice_list.py b/electrum/gui/qt/invoice_list.py t@@ -173,19 +173,20 @@ class InvoiceList(MyTreeView): d = WindowModalDialog(self, _("Payment log")) vbox = QVBoxLayout(d) log_w = QTreeWidget() - log_w.setHeaderLabels([_('Route'), _('Channel ID'), _('Message')]) - for i, (route, success, failure_data) in enumerate(log): + log_w.setHeaderLabels([_('Route'), _('Channel ID'), _('Message'), _('Blacklist')]) + for i, (route, success, failure_log) in enumerate(log): route_str = '%d'%len(route) if not success: - sender_idx, failure_msg = failure_data + sender_idx, failure_msg, blacklist = failure_log short_channel_id = route[sender_idx+1].short_channel_id data = failure_msg.data message = repr(failure_msg.code) else: short_channel_id = route[-1].short_channel_id message = _('Success') + blacklist = False chan_str = format_short_channel_id(short_channel_id) - x = QTreeWidgetItem([route_str, chan_str, message]) + x = QTreeWidgetItem([route_str, chan_str, message, repr(blacklist)]) log_w.addTopLevelItem(x) vbox.addWidget(log_w) vbox.addLayout(Buttons(CloseButton(d))) DIR diff --git a/electrum/lnworker.py b/electrum/lnworker.py t@@ -864,12 +864,12 @@ class LNWallet(LNWorker): success = False break self.network.trigger_callback('invoice_status', key, PR_INFLIGHT, log) - success, preimage, sender_idx, failure_msg = await self._pay_to_route(route, lnaddr) + success, preimage, failure_log = await self._pay_to_route(route, lnaddr) if success: log.append((route, True, preimage)) break else: - log.append((route, False, (sender_idx, failure_msg))) + log.append((route, False, failure_log)) self.network.trigger_callback('invoice_status', key, PR_PAID if success else PR_FAILED, log) return success t@@ -885,15 +885,25 @@ class LNWallet(LNWorker): self.network.trigger_callback('htlc_added', htlc, lnaddr, SENT) success, preimage, reason = await self.await_payment(lnaddr.paymenthash) if success: - failure_msg = None - sender_idx = None + failure_log = None else: failure_msg, sender_idx = chan.decode_onion_error(reason, route, htlc.htlc_id) - code, data = failure_msg.code, failure_msg.data - self.handle_error_code_from_failed_htlc(code, data, sender_idx, route, peer) - return success, preimage, sender_idx, failure_msg + blacklist = self.handle_error_code_from_failed_htlc(failure_msg, sender_idx, route, peer) + if blacklist: + # blacklist channel after reporter node + # TODO this should depend on the error (even more granularity) + # also, we need finer blacklisting (directed edges; nodes) + try: + short_chan_id = route[sender_idx + 1].short_channel_id + except IndexError: + self.logger.info("payment destination reported error") + else: + self.network.path_finder.add_to_blacklist(short_chan_id) + failure_log = (sender_idx, failure_msg, blacklist) + return success, preimage, failure_log - def handle_error_code_from_failed_htlc(self, code, data, sender_idx, route, peer): + def handle_error_code_from_failed_htlc(self, failure_msg, sender_idx, route, peer): + code, data = failure_msg.code, failure_msg.data self.logger.info(f"UPDATE_FAIL_HTLC {repr(code)} {data}") self.logger.info(f"error reported by {bh2u(route[sender_idx].node_id)}") # handle some specific error codes t@@ -935,16 +945,7 @@ class LNWallet(LNWorker): blacklist = True else: blacklist = True - if blacklist: - # blacklist channel after reporter node - # TODO this should depend on the error (even more granularity) - # also, we need finer blacklisting (directed edges; nodes) - try: - short_chan_id = route[sender_idx + 1].short_channel_id - except IndexError: - self.logger.info("payment destination reported error") - else: - self.network.path_finder.add_to_blacklist(short_chan_id) + return blacklist @staticmethod def _check_invoice(invoice, amount_sat=None):