diff --git a/src/cutecoin/core/net/network.py b/src/cutecoin/core/net/network.py index b418c42258767e617ac24432f00519f6bef9d2b2..b92ad0c4e362f8e6d27966aaf2c34745dae5ec60 100644 --- a/src/cutecoin/core/net/network.py +++ b/src/cutecoin/core/net/network.py @@ -5,14 +5,12 @@ Created on 24 févr. 2015 """ from .node import Node from ...tools.exceptions import InvalidNodeCurrency - import logging import statistics import time import asyncio from ucoinpy.documents.peer import Peer from ucoinpy.documents.block import Block, BlockId - from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject, QTimer from collections import Counter @@ -256,7 +254,7 @@ class Network(QObject): :return: the medium fork window of knew network """ fork_windows = [n.fork_window for n in self.online_nodes if n.software != "" - and n.pubkey in members_pubkeys] + and n.pubkey in members_pubkeys] if len(fork_windows) > 0: return int(statistics.median(fork_windows)) else: @@ -268,6 +266,7 @@ class Network(QObject): """ self._nodes.append(node) node.changed.connect(self.handle_change) + node.error.connect(self.handle_error) node.identity_changed.connect(self.handle_identity_change) node.neighbour_found.connect(self.handle_new_node) logging.debug("{:} connected".format(node.pubkey[:5])) @@ -337,16 +336,21 @@ class Network(QObject): self.root_nodes_changed.emit() self.nodes_changed.emit() + @pyqtSlot() + def handle_error(self): + node = self.sender() + if node.state in (Node.OFFLINE, Node.CORRUPTED) and \ + node.last_change + 3600 < time.time(): + node.disconnect() + self.nodes.remove(node) + self.nodes_changed.emit() + @pyqtSlot() def handle_change(self): node = self.sender() if node.state in (Node.ONLINE, Node.DESYNCED): self._check_nodes_sync() - else: - if node.last_change + 3600 < time.time(): - node.disconnect() - self.nodes.remove(node) self._check_nodes_unique() self.nodes_changed.emit() @@ -358,9 +362,9 @@ class Network(QObject): # or if the previously found block is different locally # than in the main chain, we declare a rollback if self._block_found.number and \ - self.current_blockid.number <= self._block_found.number \ - or node.main_chain_previous_block and \ - node.main_chain_previous_block['hash'] != self._block_found.sha_hash: + self.current_blockid.number <= self._block_found.number \ + or node.main_chain_previous_block and \ + node.main_chain_previous_block['hash'] != self._block_found.sha_hash: self._block_found = self.current_blockid self.blockchain_rollback.emit(self.current_blockid.number) diff --git a/src/cutecoin/core/net/node.py b/src/cutecoin/core/net/node.py index ad9eab52f666ff6f602fec7dfa21ee6964e7e5de..52f2f54cc1dc874072f8eca4a07abca65f1910e6 100644 --- a/src/cutecoin/core/net/node.py +++ b/src/cutecoin/core/net/node.py @@ -36,6 +36,7 @@ class Node(QObject): CORRUPTED = 4 changed = pyqtSignal() + error = pyqtSignal() identity_changed = pyqtSignal() neighbour_found = pyqtSignal(Peer, str) @@ -259,6 +260,8 @@ class Node(QObject): self.last_change = time.time() self._state = new_state self.changed.emit() + if new_state in (Node.OFFLINE, Node.ONLINE): + self.error.emit() @property def fork_window(self):