URI: 
       tcheck consistency of results received by get_history - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit a48a971ae63b32ce94c1236c05d34d1b25219a84
   DIR parent e39a5c9609c1f900a64c014265ea61ff32fdbd29
  HTML Author: ThomasV <thomasv@gitorious>
       Date:   Wed,  7 Nov 2012 09:37:14 +0100
       
       check consistency of results received by get_history
       
       Diffstat:
         M lib/interface.py                    |       1 +
         M lib/wallet.py                       |      31 +++++++++++++++++++++++++------
       
       2 files changed, 26 insertions(+), 6 deletions(-)
       ---
   DIR diff --git a/lib/interface.py b/lib/interface.py
       t@@ -31,6 +31,7 @@ DEFAULT_SERVERS = [
            #'uncle-enzo.info:50001:t',
            #'electrum.bitcoin.cz:50001:t',
            #'electrum.bitfoo.org:50001:t',
       +    'webbtc.net:50001:t',
            'electrum.bysh.me:50001:t',
            'electrum.pdmc.net:50001:t',
            'ecdsa.org:50001:t'
   DIR diff --git a/lib/wallet.py b/lib/wallet.py
       t@@ -525,9 +525,11 @@ class Wallet:
                    return s
        
        
       -    def get_status(self, address):
       +    def get_history(self, address):
                with self.lock:
       -            h = self.history.get(address)
       +            return self.history.get(address)
       +
       +    def get_status(self, h):
                if not h: return None
                status = ''
                for tx_hash, height in h:
       t@@ -981,17 +983,34 @@ class WalletSynchronizer(threading.Thread):
        
                    if method == 'blockchain.address.subscribe':
                        addr = params[0]
       -                if self.wallet.get_status(addr) != result:
       +                if self.wallet.get_status(self.wallet.get_history(addr)) != result:
                            self.interface.send([('blockchain.address.get_history', [addr])], 'synchronizer')
                            requested_histories[addr] = result
        
                    elif method == 'blockchain.address.get_history':
                        addr = params[0]
                        hist = []
       -                # in the new protocol, we will receive a list of (tx_hash, height)
       -                for item in result: hist.append( (item['tx_hash'], item['height']) )
       -                # store it
       +
       +                # check that txids are unique
       +                txids = []
       +                for item in result:
       +                    tx_hash = item['tx_hash']
       +                    if tx_hash not in txids:
       +                        txids.append(tx_hash)
       +                        hist.append( (tx_hash, item['height']) )
       +
       +                if len(hist) != len(result):
       +                    print "error: non-unique txid"
       +                    continue
       +
       +                # check that the status corresponds to what was announced
       +                if self.wallet.get_status(hist) != requested_histories.pop(addr):
       +                    print "error: status mismatch:", addr
       +                    continue
       +                
       +                # store received history
                        self.wallet.receive_history_callback(addr, hist)
       +
                        # request transactions that we don't have 
                        for tx_hash, tx_height in hist:
                            if self.wallet.transactions.get(tx_hash) is None: