def __init__(self, miner): self.lock = RLock() self.result_queue = Queue() self.miner = miner self.config = miner.options self.update = True self.last_work = 0 self.backup_server_index = 1 self.errors = 0 self.failback_getwork_count = 0 self.failback_attempt_count = 0 self.server = None self.user_agent = 'poclbm/' + miner.version self.difficulty = 0 self.true_target = None self.last_block = '' self.sent = {} self.pools = pools.PoolManager() self.best_pools = self.pools.get_best_pools() self.servers = pools.get_servers(self.best_pools) if not self.servers: self.failure('At least one server is required') else: say_line('Switching to {0} with utility {1:.3f}'.format(self.best_pools[0].name, self.best_pools[0].utility), show_server=False) say_line("Current utilities:", show_server=False) for pool in self.best_pools: say_line(' {0:15}: {1:.3f}'.format(pool.name, pool.utility), show_server=False) self.set_server(self.servers[0]) self.user_servers = list(self.servers)
def getwork(self, data=None): if not data: previous_best_pool = self.best_pools[0] self.best_pools = self.pools.get_best_pools() self.servers = pools.get_servers(self.best_pools) if previous_best_pool != self.best_pools[0]: say_line("Switching to {0} with utility {1:.3f}".format(self.best_pools[0].name, self.best_pools[0].utility), show_server=False) say_line("Current utilities:", show_server=False) for pool in self.best_pools: say_line(' {0:15}: {1:.3f}'.format(pool.name, pool.utility), show_server=False) self.set_server(self.servers[0]) self.connection = None save_server = None try: if self.server != self.servers[0] and self.config.failback > 0: if self.failback_getwork_count >= self.config.failback: save_server = self.server say_line("Attempting to fail back to primary server") self.set_server(self.servers[0]) self.failback_getwork_count += 1 if not self.connection: self.connection = self.connect(self.proto, self.host, self.timeout) self.postdata['params'] = if_else(data, [data], []) (self.connection, result) = self.request(self.connection, '/', self.headers, dumps(self.postdata)) self.errors = 0 if self.server == self.servers[0]: self.backup_server_index = 1 self.failback_getwork_count = 0 self.failback_attempt_count = 0 return result['result'] except NotAuthorized: self.failure('Wrong username or password') except RPCError as e: say('%s', e) except (IOError, httplib.HTTPException, ValueError): if save_server: self.failback_attempt_count += 1 self.set_server(save_server) say_line('Still unable to reconnect to primary server (attempt %s), failing over', self.failback_attempt_count) self.failback_getwork_count = 0 return say('Problems communicating with bitcoin RPC %s %s', (self.errors, self.config.tolerance)) self.errors += 1 if self.errors > self.config.tolerance + 1: self.errors = 0 if self.backup_server_index >= len(self.servers): say_line("No more backup pools left. Using primary and starting over.") pool = self.servers[0] self.backup_server_index = 1 else: pool = self.servers[self.backup_server_index] self.backup_server_index += 1 self.set_server(pool)