diff --git a/server/db.py b/server/db.py index 223a887..7f0efde 100644 --- a/server/db.py +++ b/server/db.py @@ -433,27 +433,41 @@ class DB(object): return tx_hash, height - def get_balance(self, hash160): - '''Returns the confirmed balance of an address.''' - utxos = self.get_utxos(hash_160) - return sum(utxo.value for utxo in utxos) - - def get_history(self, hash160): - '''Returns an unpruned, sorted list of (tx_hash, height) tuples of - transactions that touched the address, earliest in the - blockchain first. Includes both spending and receiving - transactions. + @staticmethod + def resolve_limit(limit): + if limit is None: + return -1 + assert isinstance(limit, int) and limit >= 0 + return limit + + def get_history(self, hash160, limit=1000): + '''Generator that returns an unpruned, sorted list of (tx_hash, + height) tuples of transactions that touched the address, + earliest in the blockchain first. Includes both spending and + receiving transactions. By default yields at most 1000 entries. + Set limit to None to get them all. ''' + limit = self.resolve_limit(limit) prefix = b'H' + hash160 - a = array.array('I') for key, hist in self.db.iterator(prefix=prefix): + a = array.array('I') a.frombytes(hist) - return [self.get_tx_hash(tx_num) for tx_num in a] + for tx_num in a: + if limit == 0: + return + yield self.get_tx_hash(tx_num) + limit -= 1 + + def get_balance(self, hash160): + '''Returns the confirmed balance of an address.''' + return sum(utxo.value for utxo in self.get_utxos(hash_160, limit=None)) - def get_utxos(self, hash160): - '''Returns all UTXOs for an address sorted such that the earliest - in the blockchain comes first. + def get_utxos(self, hash160, limit=1000): + '''Generator that yields all UTXOs for an address sorted in no + particular order. By default yields at most 1000 entries. + Set limit to None to get them all. ''' + limit = self.resolve_limit(limit) unpack = struct.unpack prefix = b'u' + hash160 utxos = [] @@ -461,10 +475,15 @@ class DB(object): (tx_pos, ) = unpack('