URI: 
       tMerge branch 'master' of gitorious.org:electrum/electrum - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 9a85fd503deb7965471de3a3eed76867a2ffe2a6
   DIR parent 5596482b417fd6cc93998aab56a270ac5e1967f5
  HTML Author: ThomasV <thomasv@gitorious>
       Date:   Tue, 13 Dec 2011 07:33:32 +0100
       
       Merge branch 'master' of gitorious.org:electrum/electrum
       
       Diffstat:
         M client/MANIFEST.in                  |       5 ++++-
         M client/gui.py                       |       2 +-
         A server/patches/main.cpp.diff        |      28 ++++++++++++++++++++++++++++
         M server/server.py                    |      38 +++++++++++++++++++------------
       
       4 files changed, 56 insertions(+), 17 deletions(-)
       ---
   DIR diff --git a/client/MANIFEST.in b/client/MANIFEST.in
       t@@ -1,2 +1,5 @@
        include README LICENCE RELEASE-NOTES
       -recursive-include *.py
       +include *.py
       +exclude setup.py
       +recursive-include ecdsa *.py
       +recursive-include aes *.py
   DIR diff --git a/client/gui.py b/client/gui.py
       t@@ -32,7 +32,7 @@ def format_satoshis(x):
            s = str( Decimal(x) /100000000 )
            if not '.' in s: s += '.'
            p = s.find('.')
       -    s += " "*( 8 - ( len(s) - p ))
       +    s += " "*( 9 - ( len(s) - p ))
            return s
        
        def numbify(entry, is_int = False):
   DIR diff --git a/server/patches/main.cpp.diff b/server/patches/main.cpp.diff
       t@@ -0,0 +1,28 @@
       +diff --git a/src/main.cpp b/src/main.cpp
       +index 45de76a..8a9002f 100644
       +--- a/src/main.cpp
       ++++ b/src/main.cpp
       +@@ -2787,16 +2787,19 @@ CBlock* CreateNewBlock(CReserveKey& reservekey)
       + 
       +             // Size limits
       +             unsigned int nTxSize = ::GetSerializeSize(tx, SER_NETWORK);
       +-            if (nBlockSize + nTxSize >= MAX_BLOCK_SIZE_GEN)
       +-                continue;
       ++            //if (nBlockSize + nTxSize >= MAX_BLOCK_SIZE_GEN)
       ++            //    continue;
       +             int nTxSigOps = tx.GetSigOpCount();
       +-            if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS)
       +-                continue;
       ++            //if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS)
       ++            //    continue;
       + 
       +             // Transaction fee required depends on block size
       +             bool fAllowFree = (nBlockSize + nTxSize < 4000 || CTransaction::AllowFree(dPriority));
       +             int64 nMinFee = tx.GetMinFee(nBlockSize, fAllowFree, true);
       + 
       ++            // electrum server: do not check fees
       ++            nMinFee = 0;
       ++
       +             // Connecting shouldn't fail due to dependency on other memory pool transactions
       +             // because we're already processing them in order of dependency
       +             map<uint256, CTxIndex> mapTestPoolTmp(mapTestPool);
   DIR diff --git a/server/server.py b/server/server.py
       t@@ -20,6 +20,8 @@ Todo:
           * server should check and return bitcoind status..
           * improve txpoint sorting
           * command to check cache
       +
       + mempool transactions do not need to be added to the database; it slows it down
        """
        
        
       t@@ -73,14 +75,14 @@ class MyStore(Datastore_class):
                    _hash = store.binout(row[6])
                    address = hash_to_address(chr(0), _hash)
                    if self.tx_cache.has_key(address):
       -                print "cache: invalidating", address, self.ismempool
       +                print "cache: invalidating", address
                        self.tx_cache.pop(address)
                outrows = self.get_tx_outputs(txid, False)
                for row in outrows:
                    _hash = store.binout(row[6])
                    address = hash_to_address(chr(0), _hash)
                    if self.tx_cache.has_key(address):
       -                print "cache: invalidating", address, self.ismempool
       +                print "cache: invalidating", address
                        self.tx_cache.pop(address)
        
            def safe_sql(self,sql, params=(), lock=True):
       t@@ -250,7 +252,13 @@ class MyStore(Datastore_class):
                    if tx_hash in known_tx:
                        continue
        
       +            # this means that pending transactions were added to the db, even if they are not returned by getmemorypool
                    address_has_mempool = True
       +
       +            # this means pending transactions are returned by getmemorypool
       +            if tx_hash not in self.mempool_keys:
       +                continue
       +
                    #print "mempool", tx_hash
                    txpoint = {
                            "nTime":    0,
       t@@ -347,7 +355,7 @@ def client_thread(ipaddr,conn):
                try:
                    cmd, data = ast.literal_eval(msg[:-1])
                except:
       -            print "syntax error", repr(msg)
       +            print "syntax error", repr(msg), ipaddr
                    conn.close()
                    return
        
       t@@ -362,14 +370,15 @@ def client_thread(ipaddr,conn):
                            version = "old"
                        else:
                            version, addresses = ast.literal_eval(data)
       +                    version = "v"+version
                    except:
       -                print "error"
       +                print "error", data
                        conn.close()
                        return
        
       -            print time.asctime(), "new session", version, ipaddr, session_id, addresses[0] if addresses else addresses, len(addresses)
       +            print time.strftime("[%d/%m/%Y-%H:%M:%S]"), "new session", ipaddr, addresses[0] if addresses else addresses, len(addresses), version
        
       -            sessions[session_id] = { 'addresses':{}, 'version':version }
       +            sessions[session_id] = { 'addresses':{}, 'version':version, 'ip':ipaddr }
                    for a in addresses:
                        sessions[session_id]['addresses'][a] = ''
                    out = repr( (session_id, config.get('server','banner').replace('\\n','\n') ) )
       t@@ -383,7 +392,7 @@ def client_thread(ipaddr,conn):
                        conn.close()
                        return
        
       -            print time.asctime(), "update session", ipaddr, session_id, addresses[0] if addresses else addresses, len(addresses)
       +            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@@ -439,13 +448,13 @@ def client_thread(ipaddr,conn):
                    else:
                        out = 'wrong password'
        
       -        elif cmd =='tx':        
       +        elif cmd =='tx':
                    out = send_tx(data)
                    print "sent tx:", out
        
                elif cmd =='clear_cache':
                    if config.get('server','password') == data:
       -                self.tx_cache = {}
       +                store.tx_cache = {}
                        out = 'ok'
                    else:
                        out = 'wrong password'
       t@@ -495,6 +504,7 @@ ds = BCDataStream.BCDataStream()
        
        
        def memorypool_update(store):
       +    store.mempool_keys = []
            conn = bitcoinrpc.connect_to_local()
            try:
                v = conn.getmemorypool()
       t@@ -507,17 +517,17 @@ def memorypool_update(store):
                ds.write(hextx.decode('hex'))
                tx = deserialize.parse_Transaction(ds)
                tx['hash'] = util.double_sha256(tx['tx'])
       +        tx_hash = tx['hash'][::-1].encode('hex')
       +        store.mempool_keys.append(tx_hash)
                if store.tx_find_id_and_value(tx):
                    pass
                else:
       -            #print "new tx", tx['hash'][::-1].encode('hex')
                    store.import_tx(tx, False)
        
            store.commit()
        
        
        
       -
        def clean_session_thread():
            while not stopping:
                time.sleep(30)
       t@@ -525,7 +535,7 @@ def clean_session_thread():
                for k,s in sessions.items():
                    t0 = s['last_time']
                    if t - t0 > 5*60:
       -                print time.asctime(), "lost session",k
       +                print time.strftime("[%d/%m/%Y-%H:%M:%S]"), "end session", s['ip']
                        sessions.pop(k)
                    
        
       t@@ -620,7 +630,7 @@ if __name__ == '__main__':
                args.connect_args = { 'database' : config.get('database','database') }
            store = MyStore(args)
            store.tx_cache = {}
       -    store.ismempool = False
       +    store.mempool_keys = {}
        
            thread.start_new_thread(listen_thread, (store,))
            thread.start_new_thread(clean_session_thread, ())
       t@@ -631,9 +641,7 @@ if __name__ == '__main__':
                try:
                    dblock.acquire()
                    store.catch_up()
       -            store.ismempool = True
                    memorypool_update(store)
       -            store.ismempool = False
                    block_number = store.get_block_number(1)
                    dblock.release()
                except: