tdon't use bitcoinrpc anymore - electrum - Electrum Bitcoin wallet
 (HTM) git clone https://git.parazyd.org/electrum
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
       ---
 (DIR) commit 9f4eb222ac6a645c730b477c897f993290679138
 (DIR) parent 928498d695745bb6a527f33d06dbbdbb362248f0
 (HTM) Author: ThomasV <thomasv@gitorious>
       Date:   Fri, 23 Dec 2011 13:14:37 +0300
       
       don't use bitcoinrpc anymore
       
       Diffstat:
         M server/README                       |      10 +++++-----
         D server/patches/bitcoinrpc_connecti… |      41 -------------------------------
         M server/server.py                    |      38 +++++++++++++++++++------------
       
       3 files changed, 28 insertions(+), 61 deletions(-)
       ---
 (DIR) diff --git a/server/README b/server/README
       t@@ -7,9 +7,10 @@ Language: Python
        Features: 
        
        * The server uses a patched version of the Bitcoin daemon that can
       -forward transactions, and bitcoin-abe * The server code is open
       -source. Anyone can run a server, removing single points of failure
       -concerns.
       +forward transactions, and bitcoin-abe 
       +
       +* The server code is open source. Anyone can run a server, removing
       +single points of failure concerns.
        
        * The server knows which set of Bitcoin addresses belong to the same
        wallet, which might raise concerns about anonymity. However, it should
       t@@ -22,8 +23,7 @@ INSTALL
        
        2. install bitcoin-abe : https://github.com/jtobey/bitcoin-abe
        
       -3. download bitcoin-python: https://github.com/laanwj/bitcoin-python
       -   patch it with bitcoinrpc_connection.py.diff
       +3. install jsonrpclib: code.google.com/p/jsonrpclib/
        
        4. launch the server:  nohup python -u server.py > /var/log/electrum.log &
        
 (DIR) diff --git a/server/patches/bitcoinrpc_connection.py.diff b/server/patches/bitcoinrpc_connection.py.diff
       t@@ -1,41 +0,0 @@
       -diff --git a/src/bitcoinrpc/connection.py b/src/bitcoinrpc/connection.py
       -index 960cf5d..79e04bf 100644
       ---- a/src/bitcoinrpc/connection.py
       -+++ b/src/bitcoinrpc/connection.py
       -@@ -67,7 +67,35 @@ class BitcoinConnection(object):
       -             return self.proxy.getblockcount()
       -         except JSONRPCException,e:
       -             raise _wrap_exception(e.error)    
       --        
       -+
       -+    def getmemorypool(self):
       -+        """sign"""
       -+        try:
       -+            return self.proxy.getmemorypool()
       -+        except JSONRPCException,e:
       -+            raise _wrap_exception(e.error)  
       -+
       -+    def importtransaction(self, tx):
       -+        """sign"""
       -+        try:
       -+            return self.proxy.importtransaction(tx)
       -+        except JSONRPCException,e:
       -+            raise _wrap_exception(e.error)  
       -+
       -+    def signmessage(self, address,message):
       -+        """sign"""
       -+        try:
       -+            return self.proxy.signmessage(address, message)
       -+        except JSONRPCException,e:
       -+            raise _wrap_exception(e.error)  
       -+
       -+    def verifymessage(self, address, sig, message):
       -+        """verif"""
       -+        try:
       -+            return self.proxy.verifymessage(address, sig, message )
       -+        except JSONRPCException,e:
       -+            raise _wrap_exception(e.error)  
       -+
       -     def getblocknumber(self):
       -         """
       -         Returns the block number of the latest block in the longest block chain.
 (DIR) diff --git a/server/server.py b/server/server.py
       t@@ -27,13 +27,14 @@ Todo:
        
        import time, socket, operator, thread, ast, sys,re
        import psycopg2, binascii
       -import bitcoinrpc
        
        from Abe.abe import hash_to_address, decode_check_address
        from Abe.DataStore import DataStore as Datastore_class
        from Abe import DataStore, readconf, BCDataStream,  deserialize, util, base58
        
        import ConfigParser
       +from json import dumps, loads
       +import urllib
        
        config = ConfigParser.ConfigParser()
        # set some defaults, which will be overwritten by the config file
       t@@ -57,6 +58,7 @@ except:
            print "Could not read electrum.conf. I will use the default values."
        
        password = config.get('server','password')
       +bitcoind_url = 'http://%s:%s@%s:%s/' % ( config.get('bitcoind','user'), config.get('bitcoind','password'), config.get('bitcoind','host'), config.get('bitcoind','port'))
        
        stopping = False
        block_number = -1
       t@@ -317,15 +319,18 @@ class MyStore(Datastore_class):
        
        
        
       +
        def send_tx(tx):
       -    import bitcoinrpc
       -    conn = bitcoinrpc.connect_to_local()
       +    postdata = dumps({"method": 'importtransaction', 'params': [tx], 'id':'jsonrpc'})
       +    respdata = urllib.urlopen(bitcoind_url, postdata).read()
            try:
       -        v = conn.importtransaction(tx)
       +        v = loads(respdata)['result']
            except:
                v = "error: transaction rejected by memorypool"
            return v
        
       +
       +
        def random_string(N):
            import random, string
            return ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(N))
       t@@ -364,7 +369,7 @@ def get_cache(pw,addr):
        def cmd_poll(session_id):
            session = sessions.get(session_id)
            if session is None:
       -        print time.asctime(), "session not found", session_id, ipaddr
       +        print time.asctime(), "session not found", session_id
                out = repr( (-1, {}))
            else:
                t1 = time.time()
       t@@ -412,7 +417,7 @@ def new_session(addresses, version, ipaddr):
            sessions[session_id]['last_time'] = time.time()
            return out
        
       -def update_session(session_id,addresses):
       +def update_session(session_id,addresses,ipaddr):
            print time.strftime("[%d/%m/%Y-%H:%M:%S]"), "update session", ipaddr, addresses[0] if addresses else addresses, len(addresses)
            sessions[session_id]['addresses'] = {}
            for a in addresses:
       t@@ -488,7 +493,7 @@ def do_command(cmd, data, ipaddr):
                except:
                    print "error"
                    return None
       -        out = update_session(session_id,addresses)
       +        out = update_session(session_id,addresses,ipaddr)
        
        
            elif cmd == 'bccapi_login':
       t@@ -570,12 +575,12 @@ def do_command(cmd, data, ipaddr):
        def memorypool_update(store):
            ds = BCDataStream.BCDataStream()
            store.mempool_keys = []
       -    conn = bitcoinrpc.connect_to_local()
       -    try:
       -        v = conn.getmemorypool()
       -    except:
       -        print "cannot contact bitcoin daemon"
       -        return
       +
       +    postdata = dumps({"method": 'getmemorypool', 'params': [], 'id':'jsonrpc'})
       +    respdata = urllib.urlopen(bitcoind_url, postdata).read()
       +    v = loads(respdata)['result']
       +
       +
            v = v['transactions']
            for hextx in v:
                ds.clear()
       t@@ -651,13 +656,14 @@ def jsonrpc_thread(store):
            # see http://code.google.com/p/jsonrpclib/
            from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCServer
            server = SimpleJSONRPCServer(('localhost', 8080))
       -    server.register_function(store.get_history, 'history')
            server.register_function(lambda : peer_list.values(), 'peers')
            server.register_function(cmd_stop, 'stop')
            server.register_function(cmd_load, 'load')
            server.register_function(lambda : block_number, 'blocks')
            server.register_function(clear_cache, 'clear_cache')
            server.register_function(get_cache, 'get_cache')
       +    server.register_function(send_tx, 'blockchain.transaction.broadcast')
       +    server.register_function(store.get_history, 'blockchain.address.get_history')
            server.serve_forever()
        
        
       t@@ -681,7 +687,9 @@ if __name__ == '__main__':
                elif cmd == 'get_cache':
                    out = server.get_cache(password,sys.argv[2])
                elif cmd == 'h':
       -            out = server.history(sys.argv[2])
       +            out = server.blockchain.address.get_history(sys.argv[2])
       +        elif cmd == 'tx':
       +            out = server.blockchain.transaction.broadcast(sys.argv[2])
                elif cmd == 'b':
                    out = server.blocks()
                print out