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)]
示例#2
0
 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)]