async def challenge_response( self, challenge_response: harvester_protocol.ChallengeResponse): """ This is a response from the harvester, for a NewChallenge. Here we check if the proof of space is sufficiently good, and if so, we ask for the whole proof. """ if challenge_response.quality_string in self.harvester_responses_challenge: log.warning( f"Have already seen quality string {challenge_response.quality_string}" ) return weight: uint128 = self.challenge_to_weight[ challenge_response.challenge_hash] height: uint32 = self.challenge_to_height[ challenge_response.challenge_hash] difficulty: uint64 = uint64(0) for posf in self.challenges[weight]: if posf.challenge_hash == challenge_response.challenge_hash: difficulty = posf.difficulty if difficulty == 0: raise RuntimeError("Did not find challenge") estimate_min = (self.proof_of_time_estimate_ips * self.constants["BLOCK_TIME_TARGET"] / self.constants["MIN_ITERS_PROPORTION"]) number_iters: uint64 = calculate_iterations_quality( challenge_response.quality_string, challenge_response.plot_size, difficulty, estimate_min, ) if height < 1000: # As the difficulty adjusts, don't fetch all qualities if challenge_response.challenge_hash not in self.challenge_to_best_iters: self.challenge_to_best_iters[ challenge_response.challenge_hash] = number_iters elif (number_iters < self.challenge_to_best_iters[ challenge_response.challenge_hash]): self.challenge_to_best_iters[ challenge_response.challenge_hash] = number_iters else: return estimate_secs: float = number_iters / self.proof_of_time_estimate_ips log.info( f"Estimate: {estimate_secs}, rate: {self.proof_of_time_estimate_ips}" ) if (estimate_secs < self.config["pool_share_threshold"] or estimate_secs < self.config["propagate_threshold"]): self.harvester_responses_challenge[ challenge_response. quality_string] = challenge_response.challenge_hash request = harvester_protocol.RequestProofOfSpace( challenge_response.quality_string) yield OutboundMessage( NodeType.HARVESTER, Message("request_proof_of_space", request), Delivery.RESPOND, )
async def challenge_response( self, challenge_response: harvester_protocol.ChallengeResponse ): """ This is a response from the harvester, for a NewChallenge. Here we check if the proof of space is sufficiently good, and if so, we ask for the whole proof. """ if challenge_response.quality_string in self.harvester_responses_challenge: log.warning( f"Have already seen quality string {challenge_response.quality_string}" ) return height: uint32 = self.challenge_to_height[challenge_response.challenge_hash] number_iters = await self._get_required_iters( challenge_response.challenge_hash, challenge_response.quality_string, challenge_response.plot_size, ) if height < 1000: # As the difficulty adjusts, don't fetch all qualities if challenge_response.challenge_hash not in self.challenge_to_best_iters: self.challenge_to_best_iters[ challenge_response.challenge_hash ] = number_iters elif ( number_iters < self.challenge_to_best_iters[challenge_response.challenge_hash] ): self.challenge_to_best_iters[ challenge_response.challenge_hash ] = number_iters else: return estimate_secs: float = number_iters / self.proof_of_time_estimate_ips if challenge_response.challenge_hash not in self.challenge_to_estimates: self.challenge_to_estimates[challenge_response.challenge_hash] = [] self.challenge_to_estimates[challenge_response.challenge_hash].append( estimate_secs ) log.info(f"Estimate: {estimate_secs}, rate: {self.proof_of_time_estimate_ips}") if ( estimate_secs < self.config["pool_share_threshold"] or estimate_secs < self.config["propagate_threshold"] ): self.harvester_responses_challenge[ challenge_response.quality_string ] = challenge_response.challenge_hash request = harvester_protocol.RequestProofOfSpace( challenge_response.quality_string ) yield OutboundMessage( NodeType.HARVESTER, Message("request_proof_of_space", request), Delivery.RESPOND, ) self._state_changed("challenge")