X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=scripts%2Fpeers;h=ef71fffa986470b5276a903b680c743af71d3c89;hb=a471859a3a48f32444f4d64cd7f9365421212fa6;hp=f3ea5f731fcdcbf8990dcad778b1698b577d5c0e;hpb=66f224eab4e2ff4bf630db9cc1355c5b446ae934;p=electrum-nvc.git diff --git a/scripts/peers b/scripts/peers index f3ea5f7..ef71fff 100755 --- a/scripts/peers +++ b/scripts/peers @@ -1,12 +1,91 @@ #!/usr/bin/env python -import time, electrum +import time, electrum, Queue +from electrum import Interface, SimpleConfig +from electrum.network import filter_protocol, parse_servers +from collections import defaultdict -electrum.set_verbosity(False) # default is True +# 1. start interface and wait for connection +interface = electrum.Interface('ecdsa.net: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" -network = electrum.Network({'verbose':False}) -network.start(wait=True) -time.sleep(1) -electrum.print_json( network.heights )