Skip to content
Snippets Groups Projects
Commit 1a642b03 authored by inso's avatar inso
Browse files

Handle validation in wot tab ( #193 #185 )

parent 5c368858
No related branches found
No related tags found
No related merge requests found
......@@ -170,6 +170,7 @@ class Graph(object):
arc_status = ARC_STATUS_WEAK
else:
arc_status = ARC_STATUS_STRONG
arc = {
'id': identity.pubkey,
'status': arc_status,
......@@ -180,6 +181,11 @@ class Graph(object):
),
'cert_time': certifier['cert_time']
}
if certifier['identity'].blockchain_state == BlockchainState.VALIDATED:
arc['current_validation'] = self.community.network.latest_block_number - certifier['block_number']
arc['max_validation'] = self.community.network.fork_window(self.community.members_pubkeys())
# add arc to certifier
self._graph[certifier['identity'].pubkey]['arcs'].append(arc)
# if certifier node not in identity nodes
......@@ -230,6 +236,10 @@ class Graph(object):
'cert_time': certified['cert_time']
}
if certified['identity'].blockchain_state == BlockchainState.VALIDATED:
arc['current_validation'] = self.community.network.latest_block_number - certified['block_number']
arc['max_validation'] = self.community.network.fork_window(self.community.members_pubkeys())
# replace old arc if this one is more recent
new_arc = True
index = 0
......
......@@ -6,6 +6,7 @@ Created on 24 févr. 2015
from cutecoin.core.net.node import Node
import logging
import statistics
import time
import asyncio
from ucoinpy.documents.peer import Peer
......@@ -177,6 +178,14 @@ class Network(QObject):
else:
return Block.Empty_Hash
def fork_window(self, members_pubkeys):
"""
Get the medium of the fork window of the nodes members of a community
:return: the medium fork window of knew network
"""
return statistics.median([n.fork_window for n in self.nodes if n.software != ""
and n.pubkey in members_pubkeys])
def add_node(self, node):
"""
Add a node to the network.
......
......@@ -39,7 +39,7 @@ class Node(QObject):
neighbour_found = pyqtSignal(Peer, str)
def __init__(self, network_manager, currency, endpoints, uid, pubkey, block_number, block_hash,
state, last_change, last_merkle, software, version):
state, last_change, last_merkle, software, version, fork_window):
"""
Constructor
"""
......@@ -57,6 +57,7 @@ class Node(QObject):
self._last_merkle = last_merkle
self._software = software
self._version = version
self._fork_window = fork_window
@classmethod
@asyncio.coroutine
......@@ -95,7 +96,7 @@ class Node(QObject):
node = cls(network_manager, peer.currency,
[Endpoint.from_inline(e.inline()) for e in peer.endpoints],
"", peer.pubkey, 0, Block.Empty_Hash, Node.ONLINE, time.time(),
{'root': "", 'leaves': []}, "", "")
{'root': "", 'leaves': []}, "", "", 0)
logging.debug("Node from address : {:}".format(str(node)))
return node
else:
......@@ -119,7 +120,7 @@ class Node(QObject):
"", pubkey, 0, Block.Empty_Hash,
Node.ONLINE, time.time(),
{'root': "", 'leaves': []},
"", "")
"", "", 0)
logging.debug("Node from peer : {:}".format(str(node)))
return node
......@@ -130,6 +131,7 @@ class Node(QObject):
pubkey = ""
software = ""
version = ""
fork_window = 0
block_number = 0
block_hash = Block.Empty_Hash
last_change = time.time()
......@@ -164,14 +166,15 @@ class Node(QObject):
if 'version' in data:
version = data['version']
else:
logging.debug("Error : no state in node")
if 'fork_window' in data:
fork_window = data['fork_window']
node = cls(network_manager, currency, endpoints,
uid, pubkey, block_number, block_hash,
state, last_change,
{'root': "", 'leaves': []},
software, version)
software, version, fork_window)
logging.debug("Node from json : {:}".format(str(node)))
return node
......@@ -197,6 +200,7 @@ class Node(QObject):
'block_hash': self.block_hash,
'software': self._software,
'version': self._version,
'fork_window': self._fork_window
}
endpoints = []
for e in self._endpoints:
......@@ -278,6 +282,16 @@ class Node(QObject):
self.last_change = time.time()
self._state = new_state
@property
def fork_window(self):
return self._fork_window
@fork_window.setter
def fork_window(self, new_fork_window):
if self._fork_window != new_fork_window:
self._fork_window = new_fork_window
self.changed.emit()
def check_sync(self, block_hash):
logging.debug("Check sync")
if self.block_hash != block_hash:
......@@ -388,6 +402,10 @@ class Node(QObject):
summary_data = json.loads(strdata)
self.software = summary_data["ucoin"]["software"]
self.version = summary_data["ucoin"]["version"]
if "forkWindowSize" in summary_data["ucoin"]:
self.fork_window = summary_data["ucoin"]["forkWindowSize"]
else:
self.fork_window = 0
else:
self.changed.emit()
......
......@@ -242,6 +242,8 @@ class Identity(QObject):
block = community.bma_access.get(self, qtbma.blockchain.Block,
{'number': certifier_data['meta']['block_number']})
certifier['cert_time'] = block['medianTime']
certifier['block_number'] = None
certifiers.append(certifier)
else:
for certifier_data in data['certifications']:
......@@ -250,6 +252,7 @@ class Identity(QObject):
certifier_data['pubkey'],
BlockchainState.VALIDATED)
certifier['cert_time'] = certifier_data['cert_time']['medianTime']
certifier['block_number'] = certifier_data['cert_time']['block']
certifiers.append(certifier)
return certifiers
......@@ -295,6 +298,7 @@ class Identity(QObject):
certified_data['pubkey'],
BlockchainState.BUFFERED)
certified['cert_time'] = certified_data['meta']['timestamp']
certified['block_number'] = None
certified_list.append(certified)
else:
for certified_data in data['certifications']:
......@@ -303,6 +307,7 @@ class Identity(QObject):
certified_data['pubkey'],
BlockchainState.VALIDATED)
certified['cert_time'] = certified_data['cert_time']['medianTime']
certified['block_number'] = certified_data['cert_time']['block']
certified_list.append(certified)
return certified_list
......
......@@ -164,7 +164,7 @@ class TxHistory():
current_block = yield from community.bma_access.future_request(qtbma.blockchain.Block,
req_args={'number': community.network.latest_block_number})
parsed_block = min(self.latest_block, current_block['number'] - self.app.preferences['data_validation'])
parsed_block = min(self.latest_block, current_block['number'] - community.network.fork_window(community.members_pubkeys()))
logging.debug("Refresh from : {0} to {1}".format(self.latest_block, current_block['number']))
dividends_data = qtbma.ud.History.null_value
while dividends_data == qtbma.ud.History.null_value:
......
......@@ -181,6 +181,9 @@ class CurrencyTabWidget(QWidget, Ui_CurrencyTabWidget):
if status_infotext != "":
label_text += " - {0}".format(status_infotext)
if self.app.preferences['expert_mode']:
label_text += " - Median fork window : {0}".format(self.community.network.fork_window(self.community.members_pubkeys()))
self.status_label.setText(label_text)
def showEvent(self, event):
......
......@@ -471,3 +471,9 @@ class Arc(QGraphicsLineItem):
painter.setBrush(color)
painter.drawPolygon(QPolygonF([head_point, destination_arrow_p1, destination_arrow_p2]))
if 'current_validation' in self.metadata:
if self.metadata['current_validation'] < self.metadata['max_validation']:
validation = self.metadata['current_validation'] / self.metadata['max_validation'] * 100
painter.drawText(head_point, "{0} %".format(validation))
else:
painter.drawText(head_point, "0%")
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment