def deserialize(self, s):
     h = []
     while s:
         txid = s[0:32].encode('hex')
         txpos = int( rev_hex( s[32:36].encode('hex') ), 16 )
         height = int( rev_hex( s[36:40].encode('hex') ), 16 )
         h.append( ( txid, txpos, height ) )
         s = s[40:]
     return h
    def remove_from_history(self, addr, tx_hash, tx_pos):
                    
        txi = (tx_hash + int_to_hex(tx_pos, 4)).decode('hex')

        if addr is None:
            try:
                addr = self.batch_txio[txi]
            except:
                raise BaseException(tx_hash, tx_pos)
        
        serialized_hist = self.batch_list[addr]

        l = len(serialized_hist)/40
        for i in range(l):
            item = serialized_hist[40*i:40*(i+1)]
            if item[0:36] == txi:
                height = int( rev_hex( item[36:40].encode('hex') ), 16 )
                serialized_hist = serialized_hist[0:40*i] + serialized_hist[40*(i+1):]
                break
        else:
            hist = self.deserialize(serialized_hist)
            raise BaseException("prevout not found", addr, hist, tx_hash, tx_pos)

        self.batch_list[addr] = serialized_hist
        return height, addr
    def add_to_history(self, addr, tx_hash, tx_pos, tx_height):

        # keep it sorted
        s = (tx_hash + int_to_hex(tx_pos, 4) + int_to_hex(tx_height, 4)).decode('hex')

        serialized_hist = self.batch_list[addr] 

        l = len(serialized_hist)/40
        for i in range(l-1, -1, -1):
            item = serialized_hist[40*i:40*(i+1)]
            item_height = int( rev_hex( item[36:40].encode('hex') ), 16 )
            if item_height < tx_height:
                serialized_hist = serialized_hist[0:40*(i+1)] + s + serialized_hist[40*(i+1):]
                break
        else:
            serialized_hist = s + serialized_hist

        self.batch_list[addr] = serialized_hist

        # backlink
        txo = (tx_hash + int_to_hex(tx_pos, 4)).decode('hex')
        self.batch_txio[txo] = addr
 def hash_header(self, header):
     return rev_hex(Hash(header_to_string(header).decode('hex')).encode('hex'))