diff --git a/beem/blockchain.py b/beem/blockchain.py index 4235ac32615bb12cf41fcfb711eaeafb6fe3aa97..ebb9ff95237c8d577509f900f3c6222b80a5674f 100644 --- a/beem/blockchain.py +++ b/beem/blockchain.py @@ -89,7 +89,8 @@ class Blockchain(object): .. note:: The block number returned depends on the ``mode`` used when instanciating from this class. """ - return int(self.steem.get_dynamic_global_properties(False).get(self.mode)) + props = self.steem.get_dynamic_global_properties(False) + return int(props.get(self.mode)) def get_current_block(self): """ This call returns the current block diff --git a/beem/steem.py b/beem/steem.py index 3db473bb95f6d20f229aa266155909ffd0e32e0d..222e8b98f41fbf128c44f63da8a6770932db96eb 100644 --- a/beem/steem.py +++ b/beem/steem.py @@ -220,13 +220,15 @@ class Steem(object): return self.data['dynamic_global_properties'] if self.rpc is None: return None - try: - if self.rpc.get_use_appbase(): - return self.rpc.get_dynamic_global_properties(api="database") - else: - return self.rpc.get_dynamic_global_properties() - except: - return None + count = 0 + ret = None + while ret is None and count < 2: + try: + ret = self.rpc.get_dynamic_global_properties(api="database") + except: + ret = None + count += 1 + return ret def get_reserve_ratio(self, use_stored_data=True): """ This call returns the *dynamic global properties* @@ -239,16 +241,21 @@ class Steem(object): if self.rpc is None: return None - try: - if self.rpc.get_use_appbase(): - return self.rpc.get_reserve_ratio(api="witness") - else: - props = self.get_dynamic_global_properties() - return {'id': 0, 'average_block_size': props['average_block_size'], - 'current_reserve_ratio': props['current_reserve_ratio'], - 'max_virtual_bandwidth': props['max_virtual_bandwidth']} - except: - return None + count = 0 + ret = None + while ret is None and count < 2: + try: + if self.rpc.get_use_appbase(): + return self.rpc.get_reserve_ratio(api="witness") + else: + props = self.get_dynamic_global_properties() + return {'id': 0, 'average_block_size': props['average_block_size'], + 'current_reserve_ratio': props['current_reserve_ratio'], + 'max_virtual_bandwidth': props['max_virtual_bandwidth']} + except: + ret = None + count += 1 + return ret def get_feed_history(self, use_stored_data=True): """ Returns the feed_history @@ -258,15 +265,17 @@ class Steem(object): if use_stored_data: self.refresh_data() return self.data['feed_history'] - try: - if self.rpc is None: - return None - if self.rpc.get_use_appbase(): - return self.rpc.get_feed_history(api="database") - else: - return self.rpc.get_feed_history() - except: + if self.rpc is None: return None + count = 0 + ret = None + while ret is None and count < 2: + try: + ret = self.rpc.get_feed_history(api="database") + except: + ret = None + count += 1 + return ret def get_reward_funds(self, use_stored_data=True): """ Get details for a reward fund. @@ -279,16 +288,21 @@ class Steem(object): if self.rpc is None: return None - try: - if self.rpc.get_use_appbase(): - funds = self.rpc.get_reward_funds(api="database")['funds'] - if len(funds) > 0: - funds = funds[0] - return funds - else: - return self.rpc.get_reward_fund("post") - except: - return None + count = 0 + ret = None + while ret is None and count < 2: + try: + if self.rpc.get_use_appbase(): + funds = self.rpc.get_reward_funds(api="database")['funds'] + if len(funds) > 0: + funds = funds[0] + ret = funds + else: + ret = self.rpc.get_reward_fund("post") + except: + ret = None + count += 1 + return ret def get_current_median_history(self, use_stored_data=True): """ Returns the current median price @@ -303,13 +317,18 @@ class Steem(object): return None if self.rpc is None: return None - try: - if self.rpc.get_use_appbase(): - return self.rpc.get_feed_history(api="database")['current_median_history'] - else: - return self.rpc.get_current_median_history_price(api="database") - except: - return None + count = 0 + ret = None + while ret is None and count < 2: + try: + if self.rpc.get_use_appbase(): + ret = self.rpc.get_feed_history(api="database")['current_median_history'] + else: + ret = self.rpc.get_current_median_history_price(api="database") + except: + ret = None + count += 1 + return ret def get_hardfork_properties(self, use_stored_data=True): """ Returns Hardfork and live_time of the hardfork @@ -321,13 +340,18 @@ class Steem(object): return self.data['hardfork_properties'] if self.rpc is None: return None - try: - if self.rpc.get_use_appbase(): - return self.rpc.get_hardfork_properties(api="database") - else: - return self.rpc.get_next_scheduled_hardfork(api="database") - except: - return None + count = 0 + ret = None + while ret is None and count < 2: + try: + if self.rpc.get_use_appbase(): + ret = self.rpc.get_hardfork_properties(api="database") + else: + ret = self.rpc.get_next_scheduled_hardfork(api="database") + except: + ret = None + count += 1 + return ret def get_network(self, use_stored_data=True): """ Identify the network @@ -484,13 +508,15 @@ class Steem(object): if self.rpc is None: return None - try: - if self.rpc.get_use_appbase(): - return self.rpc.get_witness_schedule(api="database") - else: - return self.rpc.get_witness_schedule() - except: - return None + count = 0 + ret = None + while ret is None and count < 2: + try: + ret = self.rpc.get_witness_schedule(api="database") + except: + ret = None + count += 1 + return ret def get_config(self, use_stored_data=True): """ Returns internal chain configuration. @@ -500,13 +526,15 @@ class Steem(object): return self.data['config'] if self.rpc is None: return None - try: - if self.rpc.get_use_appbase(): - return self.rpc.get_config(api="database") - else: - return self.rpc.get_config() - except: - return None + count = 0 + ret = None + while ret is None and count < 2: + try: + ret = self.rpc.get_config(api="database") + except: + ret = None + count += 1 + return ret @property def chain_params(self): diff --git a/beem/utils.py b/beem/utils.py index c4924196ece350834ebd9fb11f73014d62f97129..e9b1290d31cc63eb3fe7f54c468775fdd48bfa20 100644 --- a/beem/utils.py +++ b/beem/utils.py @@ -54,7 +54,7 @@ def formatTimedelta(td): hours = days * 24 + seconds // 3600 minutes = (seconds % 3600) // 60 seconds = (seconds % 60) - return "%d:%s.%s" % (hours, str(minutes).zfill(2), str(seconds).zfill(2)) + return "%d:%s:%s" % (hours, str(minutes).zfill(2), str(seconds).zfill(2)) def parse_time(block_time): diff --git a/examples/benchmark_nodes.py b/examples/benchmark_nodes.py index 4a31c6cfab05a2966de75c842aea8065f1ddc440..32f2df8a123cd555bd1a17c9edb42fd89c5d6011 100644 --- a/examples/benchmark_nodes.py +++ b/examples/benchmark_nodes.py @@ -9,6 +9,7 @@ import io import logging from prettytable import PrettyTable from beem.blockchain import Blockchain +from beem.account import Account from beem.block import Block from beem.steem import Steem from beem.utils import parse_time, formatTimedelta @@ -25,16 +26,19 @@ nodes = ["wss://steemd.pevo.science", "wss://gtg.steem.house:8090", "wss://rpc.s if __name__ == "__main__": how_many_minutes = 10 + how_many_virtual_op = 10000 max_batch_size = None threading = False thread_num = 16 - t = PrettyTable(["node", "10 blockchain minutes", "version"]) + t = PrettyTable(["node", "10 blockchain minutes", "10000 virtual account op", "version"]) t.align = "l" for node in nodes: print("Current node:", node) try: - stm = Steem(node=node, num_retries=2) + stm = Steem(node=node, num_retries=3) blockchain = Blockchain(steem_instance=stm) + account = Account("gtg", steem_instance=stm) + virtual_op_count = account.virtual_op_count() blockchain_version = stm.get_blockchain_version() last_block_id = 19273700 @@ -68,14 +72,24 @@ if __name__ == "__main__": total_duration = formatTimedelta(datetime.now() - startTime) last_block_id = block_no avtran = total_transaction / (last_block_id - 19273700) - print("* Processed %d blockchain minutes in %s" % (how_many_minutes, total_duration)) - print("* blockchain version: %s" % (blockchain_version)) - t.add_row([ - node, - total_duration, - blockchain_version - ]) break + start_time = time.time() + + stopOP = virtual_op_count - how_many_virtual_op + 1 + i = 0 + for acc_op in account.history_reverse(stop=stopOP): + i += 1 + total_duration_acc = formatTimedelta(datetime.now() - startTime) + + print("* Processed %d blockchain minutes in %s" % (how_many_minutes, total_duration)) + print("* Processed %d account ops in %s" % (i, total_duration_acc)) + print("* blockchain version: %s" % (blockchain_version)) + t.add_row([ + node, + total_duration, + total_duration_acc, + blockchain_version + ]) except NumRetriesReached: print("NumRetriesReached") continue