def _build_jobs(self, response, data, now, ignoreempty = False): roll_ntime = 1 expiry = 60 isp2pool = False headers = response.getheaders() for h in headers: if h[0].lower() == "x-is-p2pool" and h[1].lower() == "true": isp2pool = True elif h[0].lower() == "x-roll-ntime" and h[1] and h[1].lower() != "n": roll_ntime = 60 parts = h[1].split("=", 1) if parts[0].strip().lower() == "expire": try: roll_ntime = int(parts[1]) except: pass expiry = roll_ntime if isp2pool: expiry = 60 self.stats.supports_rollntime = roll_ntime > 1 response = data.decode("utf_8") if len(response) == 0 and ignoreempty: return response = json.loads(response) data = unhexlify(response["result"]["data"].encode("ascii")) target = unhexlify(response["result"]["target"].encode("ascii")) try: identifier = int(response["result"]["identifier"]) except: identifier = None midstate = Job.calculate_midstate(data) prefix = data[:68] timebase = struct.unpack(">I", data[68:72])[0] suffix = data[72:] return [Job(self.core, self, now + expiry - self.settings.expirymargin, prefix + struct.pack(">I", timebase + i) + suffix, target, midstate, identifier) for i in range(roll_ntime)]
def _build_jobs(self, response, data, epoch, now, source, ignoreempty = False, discardiffull = False): decoded = data.decode("utf_8") if len(decoded) == 0 and ignoreempty: self.core.log(self, "Got empty %s response\n" % source, 500) return decoded = json.loads(decoded) data = unhexlify(decoded["result"]["data"].encode("ascii")) target = unhexlify(decoded["result"]["target"].encode("ascii")) try: identifier = int(decoded["result"]["identifier"]) except: identifier = None if identifier != self.lastidentifier: self._cancel_jobs() self.lastidentifier = identifier self.blockchain.check_job(Job(self.core, self, 0, data, target, True, identifier)) roll_ntime = 1 expiry = 60 isp2pool = False headers = response.getheaders() for h in headers: if h[0].lower() == "x-is-p2pool" and h[1].lower() == "true": isp2pool = True elif h[0].lower() == "x-roll-ntime" and h[1] and h[1].lower() != "n": roll_ntime = 60 parts = h[1].split("=", 1) if parts[0].strip().lower() == "expire": try: roll_ntime = int(parts[1]) except: pass expiry = roll_ntime if isp2pool: expiry = 60 self.stats.supports_rollntime = roll_ntime > 1 if epoch != self.jobepoch: self.core.log(self, "Discarding %d jobs from %s response because request was issued before flush\n" % (roll_ntime, source), 500) with self.stats.lock: self.stats.jobsreceived += roll_ntime return if self.core.workqueue.count > self.core.workqueue.target * (1 if discardiffull else 5): self.core.log(self, "Discarding %d jobs from %s response because work buffer is full\n" % (roll_ntime, source), 500) with self.stats.lock: self.stats.jobsreceived += roll_ntime return expiry += now - self.settings.expirymargin midstate = Job.calculate_midstate(data) prefix = data[:68] timebase = struct.unpack(">I", data[68:72])[0] suffix = data[72:] return [Job(self.core, self, expiry, prefix + struct.pack(">I", timebase + i) + suffix, target, midstate, identifier) for i in range(roll_ntime)]