X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=scripts%2Fpeers;h=af4eb484ad7db3176718b0d738d9481da85ea89c;hb=3cbe11a42473af52e7c5e002c36aaaf32646f627;hp=2371f302ddbbd607ecbf869adc14f4017f648bd9;hpb=f4c26dfac0a8b518aeee4adb5215971b72209c39;p=electrum-nvc.git diff --git a/scripts/peers b/scripts/peers index 2371f30..af4eb48 100755 --- a/scripts/peers +++ b/scripts/peers @@ -1,9 +1,91 @@ #!/usr/bin/env python -from electrum import interface, Interface +import time, electrum_nvc, Queue +from electrum_nvc import Interface, SimpleConfig +from electrum_nvc.network import filter_protocol, parse_servers +from collections import defaultdict + +# 1. start interface and wait for connection +interface = electrum.Interface('127.0.0.1:50002:s') +interface.start(wait = True) +if not interface.is_connected: + print "not connected" + exit() + +# 2. get list of peers +q = Queue.Queue() +interface.send([('server.peers.subscribe',[])], lambda i,x: q.put(x)) +r = q.get(timeout=10000) +peers = parse_servers(r.get('result')) +peers = filter_protocol(peers,'s') + +print "Contacting %d servers"%len(peers) +# start interfaces +config = SimpleConfig() +interfaces = map ( lambda server: Interface(server, config), peers ) +results_queue = Queue.Queue() +reached_servers = [] +for i in interfaces: i.start(q) + +t0 = time.time() +while peers: + try: + i = q.get(timeout=1) + except: + if time.time() - t0 > 10: + print "timeout" + break + else: + continue + peers.remove(i.server) + if i.is_connected: + i.send([('blockchain.headers.subscribe',[])], lambda i,x: results_queue.put((i,x))) + reached_servers.append(i.server) + else: + print "Connection failed:", i.server + +print "%d servers could be reached"%len(reached_servers) + +def analyze(results): + out = {} + dd = {} + for k, v in results.items(): + height = v.get('block_height') + merkle = v.get('merkle_root') + utxo = v.get('utxo_root') + d = dd.get(merkle, defaultdict(int)) + d[utxo] += 1 + dd[merkle] = d + + refs = {} + for merkle, d in dd.items(): + v = d.values() + m = max(v) + ref = d.keys()[v.index(m)] + refs[merkle] = ref, m + + for k, v in results.items(): + height = v.get('block_height') + merkle = v.get('merkle_root') + utxo = v.get('utxo_root') + ref_utxo, num = refs.get(merkle) + + if ref_utxo != utxo and num > 1: + out[k] = height, merkle, utxo + + return out + + +results = {} +while reached_servers: + i, r = results_queue.get(timeout=10000) + results[i.server] = r.get('result') + reached_servers.remove(i.server) + +errors = analyze(results).keys() + +for n,v in sorted(results.items(), key=lambda x:x[1]['block_height']): + print "%40s"%n, v['block_height'], v['utxo_root'], "error" if n in errors else "ok" + + -i = Interface() -i.start() -servers = i.synchronous_get([('server.peers.subscribe',[])])[0] -servers = i.parse_servers( servers ) -print servers