X-Git-Url: https://git.novaco.in/?p=electrum-server.git;a=blobdiff_plain;f=backends%2Fbitcoind%2Fblockchain_processor.py;h=421f385cb7859bd82098bbf53046ff331d4e1d0b;hp=459e37f5d43d472b628fa8989eb2f7cf50177c6d;hb=6adb33a7221351f84357c89bc7ae0d17b1d73ffa;hpb=477dadc5c491755794725de3abcf3b6ae4542c80 diff --git a/backends/bitcoind/blockchain_processor.py b/backends/bitcoind/blockchain_processor.py index 459e37f..421f385 100644 --- a/backends/bitcoind/blockchain_processor.py +++ b/backends/bitcoind/blockchain_processor.py @@ -238,6 +238,7 @@ class BlockchainProcessor(Processor): print_log("ERROR: cannot parse", txid) return None + def get_history(self, addr, cache_only=False): with self.cache_lock: hist = self.history_cache.get(addr) @@ -248,8 +249,7 @@ class BlockchainProcessor(Processor): with self.dblock: try: - h = self.storage.get_history(str((addr))) - hist = self.storage.deserialize(h) + hist = self.storage.get_history(addr) is_known = True except: self.shared.stop() @@ -260,19 +260,10 @@ class BlockchainProcessor(Processor): hist = [] is_known = False - # sort history, because redeeming transactions are next to the corresponding txout - hist.sort(key=lambda tup: tup[2]) - # add memory pool with self.mempool_lock: for txid in self.mempool_hist.get(addr, []): - hist.append((txid, 0, 0)) - - # uniqueness - hist = set(map(lambda x: (x[0], x[2]), hist)) - - # convert to dict - hist = map(lambda x: {'tx_hash': x[0], 'height': x[1]}, hist) + hist.append({'tx_hash':txid, 'height':0}) # add something to distinguish between unused and empty addresses if hist == [] and is_known: @@ -282,6 +273,7 @@ class BlockchainProcessor(Processor): self.history_cache[addr] = hist return hist + def get_status(self, addr, cache_only=False): tx_points = self.get_history(addr, cache_only) if cache_only and tx_points == -1: @@ -476,7 +468,7 @@ class BlockchainProcessor(Processor): elif method == 'blockchain.address.subscribe': try: - address = params[0] + address = str(params[0]) result = self.get_status(address, cache_only) except BaseException, e: error = str(e) + ': ' + address @@ -484,18 +476,52 @@ class BlockchainProcessor(Processor): elif method == 'blockchain.address.get_history': try: - address = params[0] + address = str(params[0]) result = self.get_history(address, cache_only) except BaseException, e: error = str(e) + ': ' + address print_log("error:", error) + elif method == 'blockchain.address.get_balance': + try: + address = str(params[0]) + result = self.storage.get_balance(address) + except BaseException, e: + error = str(e) + ': ' + address + print_log("error:", error) + + elif method == 'blockchain.address.get_proof': + try: + address = str(params[0]) + result = self.storage.get_proof(address) + except BaseException, e: + error = str(e) + ': ' + address + print_log("error:", error) + + elif method == 'blockchain.address.listunspent': + try: + address = str(params[0]) + result = self.storage.listunspent(address) + except BaseException, e: + error = str(e) + ': ' + address + print_log("error:", error) + + elif method == 'blockchain.utxo.get_address': + try: + txid = str(params[0]) + pos = int(params[1]) + txi = (txid + int_to_hex(pos, 4)).decode('hex') + result = self.storage.get_address(txi) + except BaseException, e: + error = str(e) + print_log("error:", error, txid, pos) + elif method == 'blockchain.block.get_header': if cache_only: result = -1 else: try: - height = params[0] + height = int(params[0]) result = self.get_header(height) except BaseException, e: error = str(e) + ': %d' % height @@ -506,7 +532,7 @@ class BlockchainProcessor(Processor): result = -1 else: try: - index = params[0] + index = int(params[0]) result = self.get_chunk(index) except BaseException, e: error = str(e) + ': %d' % index @@ -586,7 +612,7 @@ class BlockchainProcessor(Processor): def catch_up(self, sync=True): - prh = None + prev_root_hash = None while not self.shared.stopped(): self.mtime('') @@ -610,6 +636,8 @@ class BlockchainProcessor(Processor): if (next_block.get('previousblockhash') == self.storage.last_hash) and not revert: + prev_root_hash = self.storage.get_root_hash() + self.import_block(next_block, next_block_hash, self.storage.height+1, sync) self.storage.height = self.storage.height + 1 self.write_header(self.block2header(next_block), sync) @@ -623,12 +651,7 @@ class BlockchainProcessor(Processor): self.mtimes['daemon'] = 0 self.mtimes['import'] = 0 - if prh: - assert prh == self.storage.get_root_hash().encode('hex') - prh = None - else: - prh = self.storage.get_root_hash().encode('hex') # revert current block block = self.getfullblock(self.storage.last_hash) @@ -643,8 +666,13 @@ class BlockchainProcessor(Processor): self.header = self.read_header(self.storage.height) self.storage.last_hash = self.hash_header(self.header) + if prev_root_hash: + assert prev_root_hash == self.storage.get_root_hash() + prev_root_hash = None + self.header = self.block2header(self.bitcoind('getblock', [self.storage.last_hash])) + self.header['utxo_root'] = self.storage.get_root_hash().encode('hex') if self.shared.stopped(): print_log( "closing database" )