separate blockchain and network
[electrum-nvc.git] / lib / network.py
1 import interface
2 from blockchain import Blockchain
3 import threading, time, Queue, os, sys, shutil
4 from util import user_dir, appdata_dir, print_error
5 from bitcoin import *
6
7
8 class Network(threading.Thread):
9
10     def __init__(self, config):
11         threading.Thread.__init__(self)
12         self.daemon = True
13         self.config = config
14         self.lock = threading.Lock()
15         self.blockchain = Blockchain(config)
16         self.interfaces = {}
17         self.queue = Queue.Queue()
18         self.default_server = self.config.get('server')
19         self.servers_list = interface.filter_protocol(interface.DEFAULT_SERVERS,'s')
20
21
22
23     def start_interfaces(self):
24
25         for server in self.servers_list:
26             self.interfaces[server] = interface.Interface({'server':server})
27
28         for i in self.interfaces.values():
29             i.start(self.queue)
30
31         if self.default_server:
32             self.interface = interface.Interface({'server':self.default_server})
33             self.interface.start(self.queue)
34         else:
35             self.interface = self.interfaces[0]
36
37
38
39
40
41
42     def run(self):
43         self.blockchain.start()
44         self.start_interfaces()
45
46         with self.lock:
47             self.running = True
48
49         while self.is_running():
50             i = self.queue.get()
51
52             if i.is_connected:
53                 i.register_channel('verifier', self.blockchain.queue)
54                 i.register_channel('get_header')
55                 i.send([ ('blockchain.headers.subscribe',[])], 'verifier')
56                 if i == self.interface:
57                     i.send([('server.banner',[])])
58                     i.send([('server.peers.subscribe',[])])
59             else:
60                 self.interfaces.pop(i.server)
61                 if i == self.interface:
62                     if self.default_server is None:
63                         print_msg("Using random server...")
64                         server = random.choice( self.servers_list )
65                         self.interface = interface.Interface({'server':self.default_server})
66                     else:
67                         #i.trigger_callback('disconnected')
68                         pass
69
70     def on_peers(self, resut):
71         pass
72
73     def on_banner(self, result):
74         pass
75
76     def stop(self):
77         with self.lock: self.running = False
78
79     def is_running(self):
80         with self.lock: return self.running
81
82
83     def resend_subscriptions(self):
84         for channel, messages in self.subscriptions.items():
85             if messages:
86                 self.send(messages, channel)
87
88
89     def auto_cycle(self):
90         if not self.is_connected and self.config.get('auto_cycle'):
91             print_msg("Using random server...")
92             servers = filter_protocol(DEFAULT_SERVERS, 's')
93             while servers:
94                 server = random.choice( servers )
95                 servers.remove(server)
96                 print server
97                 self.config.set_key('server', server, False)
98                 self.init_with_server(self.config)
99                 if self.is_connected: break
100
101             if not self.is_connected:
102                 print 'no server available'
103                 self.connect_event.set() # to finish start
104                 self.server = 'ecdsa.org:50001:t'
105                 self.proxy = None
106                 return
107
108
109
110
111 if __name__ == "__main__":
112     import simple_config
113     config = simple_config.SimpleConfig({'verbose':True})
114     network = Network(config)
115     network.start()
116
117     while 1:
118         time.sleep(1)
119
120
121