3 # Electrum - lightweight Bitcoin client
4 # Copyright (C) 2011 thomasv@gitorious
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 import time, thread, sys, socket
21 # see http://code.google.com/p/jsonrpclib/
23 from wallet import Wallet
25 from lib.util import print_error
27 from electrum.util import print_error
30 Simple wallet daemon for webservers.
31 - generates new addresses on request
32 - private keys are not needed in order to generate new addresses. A neutralized wallet can be used (seed removed)
33 - no gap limit: use 'getnum' to know how many addresses have been created.
44 wallet_path = 'wallet_path'
52 from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCRequestHandler
53 import SimpleXMLRPCServer
55 class authHandler(SimpleJSONRPCRequestHandler):
56 def parse_request(self):
57 if SimpleXMLRPCServer.SimpleXMLRPCRequestHandler.parse_request(self):
58 if self.authenticate(self.headers):
61 self.send_error(401, 'Authentication failed')
64 def authenticate(self, headers):
65 from base64 import b64decode
66 basic, _, encoded = headers.get('Authorization').partition(' ')
67 assert basic == 'Basic', 'Only basic authentication supported'
68 x_username, _, x_password = b64decode(encoded).partition(':')
69 return username == x_username and password == x_password
76 def get_new_address():
77 a = wallet.create_new_address(False)
82 return len(wallet.addresses)
85 return wallet.master_public_key.encode('hex')
89 if __name__ == '__main__':
93 server = jsonrpclib.Server('http://%s:%s@%s:%d'%(username, password, host, port))
100 out = server.getkey()
101 elif cmd == 'getnewaddress':
102 out = server.getnewaddress()
106 print_error("Server not running")
113 wallet.set_path(wallet_path)
117 from SocketServer import ThreadingMixIn
118 from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCServer
119 server = SimpleJSONRPCServer(( host, port), requestHandler=authHandler)
120 server.register_function(get_new_address, 'getnewaddress')
121 server.register_function(get_num, 'getnum')
122 server.register_function(get_mpk, 'getkey')
123 server.register_function(do_stop, 'stop')
124 server.serve_forever()
126 thread.start_new_thread(server_thread, ())
127 while not stopping: time.sleep(0.1)