diff --git a/lib/coins.py b/lib/coins.py index ae44b7f..9746b75 100644 --- a/lib/coins.py +++ b/lib/coins.py @@ -43,16 +43,22 @@ class Coin(object): # Peer discovery PEER_DEFAULT_PORTS = {'t': '50001', 's': '50002'} PEERS = [] - TX_COUNT_HEIGHT = 0 @classmethod def lookup_coin_class(cls, name, net): '''Return a coin class given name and network. Raise an exception if unrecognised.''' + req_attrs = ('TX_COUNT', 'TX_COUNT_HEIGHT', 'TX_PER_BLOCK', + 'IRC_CHANNEL', 'IRC_PREFIX') for coin in util.subclasses(Coin): if (coin.NAME.lower() == name.lower() and coin.NET.lower() == net.lower()): + missing = [attr for attr in req_attrs + if not hasattr(coin, attr)] + if missing: + raise CoinError('coin {} missing {} attributes' + .format(name, missing)) return coin raise CoinError('unknown coin {} and network {} combination' .format(name, net)) diff --git a/server/block_processor.py b/server/block_processor.py index 9d7d6a6..c8bdd22 100644 --- a/server/block_processor.py +++ b/server/block_processor.py @@ -388,27 +388,22 @@ class BlockProcessor(server.db.DB): self.logger.info('tx/sec since genesis: {:,d}, ' 'since last flush: {:,d}' .format(tx_per_sec, this_tx_per_sec)) - if self.coin.TX_COUNT_HEIGHT > 0: - daemon_height = self.daemon.cached_height() - if self.height > self.coin.TX_COUNT_HEIGHT: - tx_est = (daemon_height - self.height) * self.coin.TX_PER_BLOCK - else: - tx_est = ((daemon_height - self.coin.TX_COUNT_HEIGHT) - * self.coin.TX_PER_BLOCK - + (self.coin.TX_COUNT - self.tx_count)) - # Damp the enthusiasm - realism = 2.0 - 0.9 * self.height / self.coin.TX_COUNT_HEIGHT - tx_est *= max(realism, 1.0) - - - self.logger.info('sync time: {} ETA: {}' - .format(formatted_time(self.wall_time), - formatted_time(tx_est / this_tx_per_sec))) + daemon_height = self.daemon.cached_height() + if self.height > self.coin.TX_COUNT_HEIGHT: + tx_est = (daemon_height - self.height) * self.coin.TX_PER_BLOCK else: - self.logger.info('sync time: {}' - .format(formatted_time(self.wall_time))) + tx_est = ((daemon_height - self.coin.TX_COUNT_HEIGHT) + * self.coin.TX_PER_BLOCK + + (self.coin.TX_COUNT - self.tx_count)) + # Damp the enthusiasm + realism = 2.0 - 0.9 * self.height / self.coin.TX_COUNT_HEIGHT + tx_est *= max(realism, 1.0) + + self.logger.info('sync time: {} ETA: {}' + .format(formatted_time(self.wall_time), + formatted_time(tx_est / this_tx_per_sec))) def fs_flush(self): '''Flush the things stored on the filesystem.'''