URI: 
       ttx radar - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 3ba71627f4b27048c2c5e33eda017edeec604855
   DIR parent 35c270e075ef2762c94fc589b9b9c45bb4b1f7e2
  HTML Author: ThomasV <thomasv@gitorious>
       Date:   Wed, 21 May 2014 21:15:42 +0200
       
       ttx radar
       
       Diffstat:
         A scripts/txradar                     |      75 +++++++++++++++++++++++++++++++
       
       1 file changed, 75 insertions(+), 0 deletions(-)
       ---
   DIR diff --git a/scripts/txradar b/scripts/txradar
       t@@ -0,0 +1,75 @@
       +#!/usr/bin/env python
       +
       +import time, sys, electrum, Queue
       +from electrum import Interface, SimpleConfig
       +from electrum.network import filter_protocol, parse_servers
       +from collections import defaultdict
       +
       +try:
       +    tx = sys.argv[1]
       +except:
       +    print "usage: txradar txid"
       +    sys.exit(1)
       +
       +# 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.transaction.get',[tx])], 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)
       +
       +
       +r1 = []
       +r2 = []
       +
       +while reached_servers:
       +    i, r = results_queue.get(timeout=10000)
       +    reached_servers.remove(i.server)
       +
       +    if r.get('result'):
       +        r1.append(i.server)
       +    else:
       +        r2.append(i.server)
       +
       +
       +if r2:
       +    print "----------------"
       +    print "servers that have not seen this transaction:\n", '\n'.join(r2)
       +    print "----------------"
       +    print "propagation rate: %.1f percent" % (len(r1) *100./(len(r1)+ len(r2)))
       +else:
       +    print "transaction propagated everywhere"