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'))