From 5c5fbffa01b0ebae50ae546e6da0f306b1626013 Mon Sep 17 00:00:00 2001 From: cyc60 Date: Fri, 15 Nov 2024 18:59:48 +0300 Subject: [PATCH] Use multiprocessing for network validators signature check Signed-off-by: cyc60 --- src/validators/execution.py | 42 +++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/src/validators/execution.py b/src/validators/execution.py index 95a42772..6627f860 100644 --- a/src/validators/execution.py +++ b/src/validators/execution.py @@ -1,5 +1,6 @@ import logging import struct +from multiprocessing import Pool from typing import Sequence, Set from eth_typing import BlockNumber, HexStr @@ -51,20 +52,23 @@ def process_network_validator_events(events: list[EventData]) -> list[NetworkVal Processes `ValidatorsRegistry` registration events and returns the list of valid validators. """ - result: list[NetworkValidator] = [] - for event in events: - public_key = process_network_validator_event(event) - if not public_key: - continue - - result.append( - NetworkValidator(public_key=public_key, block_number=BlockNumber(event['blockNumber'])) - ) - - return result + with Pool(processes=settings.pool_size) as pool: + results = [ + pool.apply_async( + process_network_validator_event, + [event, settings.network_config.GENESIS_FORK_VERSION], + ) + for event in events + ] + for result in results: + result.wait() + validators = [result.get() for result in results] + return [val for val in validators if val] -def process_network_validator_event(event: EventData) -> HexStr | None: +def process_network_validator_event( + event: EventData, fork_version: bytes +) -> NetworkValidator | None: """ Processes validator deposit event and returns its public key if the deposit is valid. @@ -73,12 +77,12 @@ def process_network_validator_event(event: EventData) -> HexStr | None: withdrawal_creds = event['args']['withdrawal_credentials'] amount_gwei = struct.unpack(' Set[HexStr]: ) new_public_keys: Set[HexStr] = set() for event in new_events: - public_key = process_network_validator_event(event) - if public_key: - new_public_keys.add(public_key) + validator = process_network_validator_event( + event, settings.network_config.GENESIS_FORK_VERSION + ) + if validator: + new_public_keys.add(validator.public_key) return new_public_keys