Initial novacoin support
[electrum-nvc.git] / scripts / peers
1 #!/usr/bin/env python
2
3 import time, electrum_nvc, Queue
4 from electrum_nvc import Interface, SimpleConfig
5 from electrum_nvc.network import filter_protocol, parse_servers
6 from collections import defaultdict
7
8 # 1. start interface and wait for connection
9 interface = electrum.Interface('127.0.0.1:50002:s')
10 interface.start(wait = True)
11 if not interface.is_connected:
12     print "not connected"
13     exit()
14
15 # 2. get list of peers
16 q = Queue.Queue()
17 interface.send([('server.peers.subscribe',[])], lambda i,x: q.put(x))
18 r = q.get(timeout=10000)
19 peers = parse_servers(r.get('result'))
20 peers = filter_protocol(peers,'s')
21
22 print "Contacting %d servers"%len(peers)
23 # start interfaces
24 config = SimpleConfig()
25 interfaces = map ( lambda server: Interface(server, config), peers )
26 results_queue = Queue.Queue()
27 reached_servers = []
28 for i in interfaces: i.start(q)
29
30 t0 = time.time()
31 while peers:
32     try:
33         i = q.get(timeout=1)
34     except:
35         if time.time() - t0 > 10:
36             print "timeout"
37             break
38         else:
39             continue
40     peers.remove(i.server)
41     if i.is_connected:
42         i.send([('blockchain.headers.subscribe',[])], lambda i,x: results_queue.put((i,x)))
43         reached_servers.append(i.server)
44     else:
45         print "Connection failed:", i.server
46
47 print "%d servers could be reached"%len(reached_servers)
48
49 def analyze(results):
50     out = {}
51     dd = {}
52     for k, v in results.items():
53         height = v.get('block_height')
54         merkle = v.get('merkle_root')
55         utxo = v.get('utxo_root')
56         d = dd.get(merkle, defaultdict(int))
57         d[utxo] += 1
58         dd[merkle] = d
59
60     refs = {}
61     for merkle, d in dd.items():
62         v = d.values()
63         m = max(v)
64         ref = d.keys()[v.index(m)]
65         refs[merkle] = ref, m
66
67     for k, v in results.items():
68         height = v.get('block_height')
69         merkle = v.get('merkle_root')
70         utxo = v.get('utxo_root')
71         ref_utxo, num = refs.get(merkle)
72
73         if ref_utxo != utxo and num > 1:
74             out[k] = height, merkle, utxo
75
76     return out
77
78
79 results = {}
80 while reached_servers:
81     i, r = results_queue.get(timeout=10000)
82     results[i.server] = r.get('result')
83     reached_servers.remove(i.server)
84
85 errors = analyze(results).keys()
86
87 for n,v in sorted(results.items(), key=lambda x:x[1]['block_height']):
88     print "%40s"%n, v['block_height'], v['utxo_root'], "error" if n in errors else "ok"
89
90
91