From 279b5a1b4813348354507cec3b93901489c13f45 Mon Sep 17 00:00:00 2001 From: Sander van Grieken Date: Fri, 22 Jul 2022 12:49:09 +0200 Subject: [PATCH] qml: let qenetwork monitor gossip events, start/stop gossip service on config change add simple gossip feedback on NetworkStats page --- electrum/gui/qml/components/NetworkStats.qml | 36 +++++++++++--- electrum/gui/qml/qeapp.py | 2 +- electrum/gui/qml/qenetwork.py | 52 +++++++++++++++++++- 3 files changed, 80 insertions(+), 10 deletions(-) diff --git a/electrum/gui/qml/components/NetworkStats.qml b/electrum/gui/qml/components/NetworkStats.qml index 50ad7fe07..a486bcaab 100644 --- a/electrum/gui/qml/components/NetworkStats.qml +++ b/electrum/gui/qml/components/NetworkStats.qml @@ -9,7 +9,7 @@ Pane { property string title: qsTr('Network') GridLayout { - columns: 3 + columns: 2 Label { text: qsTr("Network: "); @@ -18,7 +18,6 @@ Pane { } Label { text: Network.networkName - Layout.columnSpan: 2 } Label { @@ -28,7 +27,6 @@ Pane { } Label { text: Network.server - Layout.columnSpan: 2 } Label { @@ -39,7 +37,6 @@ Pane { } Label { text: Network.height - Layout.columnSpan: 2 } Label { @@ -48,10 +45,12 @@ Pane { font.bold: true } - NetworkStatusIndicator {} + RowLayout { + NetworkStatusIndicator {} - Label { - text: Network.status + Label { + text: Network.status + } } Label { @@ -61,7 +60,28 @@ Pane { } Label { id: feeHistogram - Layout.columnSpan: 2 + } + + Label { + text: qsTr("Gossip: "); + color: Material.primaryHighlightedTextColor; + font.bold: true + } + ColumnLayout { + visible: Config.useGossip + Label { + text: qsTr('%1 peers').arg(Network.gossipInfo.peers) + } + Label { + text: qsTr('%1 channels to fetch').arg(Network.gossipInfo.unknown_channels) + } + Label { + text: qsTr('%1 nodes, %2 channels').arg(Network.gossipInfo.db_nodes).arg(Network.gossipInfo.db_channels) + } + } + Label { + text: qsTr("disabled"); + visible: !Config.useGossip } } diff --git a/electrum/gui/qml/qeapp.py b/electrum/gui/qml/qeapp.py index fff96d058..99918de07 100644 --- a/electrum/gui/qml/qeapp.py +++ b/electrum/gui/qml/qeapp.py @@ -178,7 +178,7 @@ class ElectrumQmlApplication(QGuiApplication): self.context = self.engine.rootContext() self._qeconfig = QEConfig(config) - self._qenetwork = QENetwork(daemon.network) + self._qenetwork = QENetwork(daemon.network, self._qeconfig) self._qedaemon = QEDaemon(daemon) self._appController = QEAppController(self._qedaemon) self._maxAmount = QEAmount(is_max=True) diff --git a/electrum/gui/qml/qenetwork.py b/electrum/gui/qml/qenetwork.py index 87a9ba214..792bf35f0 100644 --- a/electrum/gui/qml/qenetwork.py +++ b/electrum/gui/qml/qenetwork.py @@ -7,12 +7,16 @@ from electrum.interface import ServerAddr from .util import QtEventListener, event_listener class QENetwork(QObject, QtEventListener): - def __init__(self, network, parent=None): + def __init__(self, network, qeconfig, parent=None): super().__init__(parent) self.network = network + self._qeconfig = qeconfig self._height = network.get_local_height() # init here, update event can take a while self.register_callbacks() + self._qeconfig.useGossipChanged.connect(self.on_gossip_setting_changed) + + _logger = get_logger(__name__) networkUpdated = pyqtSignal() @@ -25,6 +29,7 @@ class QENetwork(QObject, QtEventListener): feeHistogramUpdated = pyqtSignal() chaintipsChanged = pyqtSignal() isLaggingChanged = pyqtSignal() + gossipUpdated = pyqtSignal() # shared signal for static properties dataChanged = pyqtSignal() @@ -34,6 +39,11 @@ class QENetwork(QObject, QtEventListener): _chaintips = 1 _islagging = False _fee_histogram = [] + _gossipPeers = 0 + _gossipUnknownChannels = 0 + _gossipDbNodes = 0 + _gossipDbChannels = 0 + _gossipDbPolicies = 0 @event_listener def on_event_network_updated(self, *args): @@ -79,6 +89,37 @@ class QENetwork(QObject, QtEventListener): self._fee_histogram = histogram if histogram else [] self.feeHistogramUpdated.emit() + @event_listener + def on_event_channel_db(self, num_nodes, num_channels, num_policies): + self._logger.debug(f'channel_db: {num_nodes} nodes, {num_channels} channels, {num_policies} policies') + self._gossipDbNodes = num_nodes + self._gossipDbChannels = num_channels + self._gossipDbPolicies = num_policies + self.gossipUpdated.emit() + + @event_listener + def on_event_gossip_peers(self, num_peers): + self._logger.debug(f'gossip peers {num_peers}') + self._gossipPeers = num_peers + self.gossipUpdated.emit() + + @event_listener + def on_event_unknown_channels(self, unknown): + if unknown == 0 and self._gossipUnknownChannels == 0: # TODO: backend sends a lot of unknown=0 events + return + self._logger.debug(f'unknown channels {unknown}') + self._gossipUnknownChannels = unknown + self.gossipUpdated.emit() + #self.lightning_gossip_num_queries = unknown + + def on_gossip_setting_changed(self): + if not self.network: + return + if self._qeconfig.useGossip: + self.network.start_gossip() + else: + self.network.run_from_another_thread(self.network.stop_gossip()) + @pyqtProperty(int, notify=heightChanged) def height(self): return self._height @@ -136,3 +177,12 @@ class QENetwork(QObject, QtEventListener): def feeHistogram(self): return self._fee_histogram + @pyqtProperty('QVariantMap', notify=gossipUpdated) + def gossipInfo(self): + return { + 'peers': self._gossipPeers, + 'unknown_channels': self._gossipUnknownChannels, + 'db_nodes': self._gossipDbNodes, + 'db_channels': self._gossipDbChannels , + 'db_policies': self._gossipDbPolicies + }