diff --git a/chia/full_node/full_node.py b/chia/full_node/full_node.py index 31cb8dc75e2f..cc924656a7e4 100644 --- a/chia/full_node/full_node.py +++ b/chia/full_node/full_node.py @@ -104,7 +104,7 @@ def __init__( self.signage_point_times = [time.time() for _ in range(self.constants.NUM_SPS_SUB_SLOT)] self.full_node_store = FullNodeStore(self.constants) self.uncompact_task = None - + self.compact_vdf_requests: Set[bytes32] = set() self.log = logging.getLogger(name if name else __name__) self._ui_tasks = set() diff --git a/chia/full_node/full_node_api.py b/chia/full_node/full_node_api.py index bee0c6b90577..66717e97e84c 100644 --- a/chia/full_node/full_node_api.py +++ b/chia/full_node/full_node_api.py @@ -1273,13 +1273,30 @@ async def respond_compact_proof_of_time(self, request: timelord_protocol.Respond @execute_task @peer_required @api_request - async def new_compact_vdf(self, request: full_node_protocol.NewCompactVDF, peer: ws.WSChiaConnection): + @bytes_required + async def new_compact_vdf( + self, request: full_node_protocol.NewCompactVDF, peer: ws.WSChiaConnection, request_bytes: bytes = b"" + ): if self.full_node.sync_store.get_sync_mode(): return None + + if len(self.full_node.compact_vdf_sem._waiters) > 20: + self.log.debug(f"Ignoring NewCompactVDF: {request}, _waiters") + return + + name = std_hash(request_bytes) + if name in self.full_node.compact_vdf_requests: + self.log.debug(f"Ignoring NewCompactVDF: {request}, already requested") + return + self.full_node.compact_vdf_requests.add(name) + # this semaphore will only allow a limited number of tasks call # new_compact_vdf() at a time, since it can be expensive async with self.full_node.compact_vdf_sem: - await self.full_node.new_compact_vdf(request, peer) + try: + await self.full_node.new_compact_vdf(request, peer) + finally: + self.full_node.compact_vdf_requests.remove(name) @peer_required @api_request