qml: let qenetwork monitor gossip events, start/stop gossip service on config change
add simple gossip feedback on NetworkStats page
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user