X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=backends%2Fbitcoind%2Fblockchain_processor.py;h=756946d6ed6a958e363879f05640519b5ec909e4;hb=86b0c5b5b0e5a3e072104d3fbde3927bb584f699;hp=2af9534eaf627ac5f62d372b5e8aa7c549b5522e;hpb=01cb32dffec6737903d69e31c401b36788723597;p=electrum-server.git diff --git a/backends/bitcoind/blockchain_processor.py b/backends/bitcoind/blockchain_processor.py index 2af9534..756946d 100644 --- a/backends/bitcoind/blockchain_processor.py +++ b/backends/bitcoind/blockchain_processor.py @@ -88,7 +88,9 @@ class BlockchainProcessor(Processor): shared.stop() sys.exit(0) - print_log("blockchain is up to date.") + print_log("Blockchain is up to date.") + self.memorypool_update() + print_log("Memory pool initialized.") threading.Timer(10, self.main_iteration).start() @@ -816,6 +818,7 @@ class BlockchainProcessor(Processor): def memorypool_update(self): mempool_hashes = self.bitcoind('getrawmempool') + touched_addresses = [] for tx_hash in mempool_hashes: if tx_hash in self.mempool_hashes: continue @@ -839,6 +842,8 @@ class BlockchainProcessor(Processor): if addr not in l: l.append(addr) self.mempool_addresses[tx_hash] = l + #if addr not in touched_addresses: + touched_addresses.append(addr) for x in tx.get('outputs'): addr = x.get('address') @@ -846,6 +851,8 @@ class BlockchainProcessor(Processor): if addr not in l: l.append(addr) self.mempool_addresses[tx_hash] = l + #if addr not in touched_addresses: + touched_addresses.append(addr) self.mempool_hashes.append(tx_hash) @@ -856,6 +863,9 @@ class BlockchainProcessor(Processor): for tx_hash, addresses in self.mempool_addresses.items(): if tx_hash not in self.mempool_hashes: self.mempool_addresses.pop(tx_hash) + for addr in addresses: + #if addr not in touched_addresses: + touched_addresses.append(addr) # rebuild mempool histories new_mempool_hist = {} @@ -866,27 +876,14 @@ class BlockchainProcessor(Processor): h.append(tx_hash) new_mempool_hist[addr] = h - # invalidate cache for mempool addresses whose mempool history has changed - new_mempool_hist_keys = new_mempool_hist.keys() - self_mempool_hist_keys = self.mempool_hist.keys() - - for addr in new_mempool_hist_keys: - if addr in self_mempool_hist_keys: - if self.mempool_hist[addr] != new_mempool_hist[addr]: - self.invalidate_cache(addr) - else: - self.invalidate_cache(addr) - - # invalidate cache for addresses that are removed from mempool ? - # this should not be necessary if they go into a block, but they might not - for addr in self_mempool_hist_keys: - if addr not in new_mempool_hist_keys: - self.invalidate_cache(addr) - - with self.mempool_lock: self.mempool_hist = new_mempool_hist + # invalidate cache for touched addresses + for addr in touched_addresses: + self.invalidate_cache(addr) + + def invalidate_cache(self, address): with self.cache_lock: if address in self.history_cache: @@ -894,6 +891,7 @@ class BlockchainProcessor(Processor): self.history_cache.pop(address) if address in self.watched_addresses: + # TODO: update cache here. if new value equals cached value, do not send notification self.address_queue.put(address) def main_iteration(self): @@ -907,8 +905,6 @@ class BlockchainProcessor(Processor): t2 = time.time() self.memorypool_update() - t3 = time.time() - # print "mempool:", len(self.mempool_addresses), len(self.mempool_hist), "%.3fs"%(t3 - t2) if self.sent_height != self.height: self.sent_height = self.height