Ejemplo n.º 1
0
	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)
Ejemplo n.º 2
0
	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)