Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow empty relayer response #389

Merged
merged 3 commits into from
Aug 13, 2024
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 24 additions & 9 deletions src/validators/relayer.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import aiohttp
from aiohttp import ClientTimeout
from eth_typing import BLSSignature
from eth_typing import BLSSignature, HexStr
from eth_utils import add_0x_prefix
from web3 import Web3

Expand All @@ -13,17 +13,31 @@
# pylint:disable-next=too-few-public-methods
class BaseRelayerClient(abc.ABC):
@abc.abstractmethod
async def get_validators(self, start_index: int, count: int) -> RelayerValidatorsResponse:
async def get_validators(
self, validators_start_index: int, validators_batch_size: int, validators_total: int
) -> RelayerValidatorsResponse:
"""
:param validators_start_index: - validator index for the first validator in a batch.
Relayer should increment this index for each validator except the first one
:param validators_batch_size: - number of validators in a batch. Relayer is expected
to return `validators_batch_size` validators at most
:param validators_total: - total number of validators supplied by vault assets.
Should be more than or equal to `validators_batch_size`.
Relayer may use `validators_total` to create larger portions of validators in background.
"""
raise NotImplementedError()


# pylint:disable-next=too-few-public-methods
class RelayerClient(BaseRelayerClient):
async def get_validators(self, start_index: int, count: int) -> RelayerValidatorsResponse:
async def get_validators(
self, validators_start_index: int, validators_batch_size: int, validators_total: int
) -> RelayerValidatorsResponse:
jsn = {
'vault': settings.vault,
'validator_index': start_index,
'validators_count': count,
'validators_start_index': validators_start_index,
'validators_batch_size': validators_batch_size,
'validators_total': validators_total,
}
async with aiohttp.ClientSession(
timeout=ClientTimeout(settings.relayer_timeout)
Expand All @@ -40,11 +54,12 @@ async def get_validators(self, start_index: int, count: int) -> RelayerValidator
Web3.to_bytes(hexstr=add_0x_prefix(v['exit_signature']))
),
)
for v in resp_json['validators']
for v in resp_json.get('validators') or []
]
validators_manager_signature = add_0x_prefix(
resp_json.get('validators_manager_signature') or HexStr('0x')
)
return RelayerValidatorsResponse(
validators=validators,
validators_manager_signature=add_0x_prefix(
resp_json['validators_manager_signature']
),
validators_manager_signature=validators_manager_signature,
)
27 changes: 16 additions & 11 deletions src/validators/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,15 +125,15 @@ async def process_validators(
# get latest config
protocol_config = await get_protocol_config()

validators_count = min(protocol_config.validators_approval_batch_limit, validators_count)
validators_batch_size = min(protocol_config.validators_approval_batch_limit, validators_count)
validators_manager_signature: HexStr | None = None
validators: Sequence[Validator]

if settings.validators_registration_mode == ValidatorsRegistrationMode.AUTO:
validators = await get_validators_from_deposit_data(
keystore=keystore,
deposit_data=cast(DepositData, deposit_data),
count=validators_count,
count=validators_batch_size,
)
if not validators:
if not settings.disable_deposit_data_warnings:
Expand All @@ -144,10 +144,15 @@ async def process_validators(
)
return None
else:
start_validator_index = await get_start_validator_index()
validators_start_index = await get_validators_start_index()
relayer = cast(RelayerClient, relayer)
validators_response = await relayer.get_validators(start_validator_index, validators_count)
validators_response = await relayer.get_validators(
validators_start_index, validators_batch_size, validators_count
)
validators = validators_response.validators
if not validators:
logger.info('Waiting for relayer validators')
return None
validators_manager_signature = validators_response.validators_manager_signature

if not await check_gas_price(high_priority=True):
Expand Down Expand Up @@ -254,8 +259,8 @@ async def create_approval_request(
"""Generate validator registration request data"""

# get next validator index for exit signature
start_validator_index = await get_start_validator_index()
logger.debug('Next validator index for exit signature: %d', start_validator_index)
validators_start_index = await get_validators_start_index()
logger.debug('Next validator index for exit signature: %d', validators_start_index)

proof, proof_flags = None, None

Expand All @@ -265,7 +270,7 @@ async def create_approval_request(

# get exit signature shards
request = ApprovalRequest(
validator_index=start_validator_index,
validator_index=validators_start_index,
vault_address=settings.vault,
validators_root=Web3.to_hex(registry_root),
public_keys=[],
Expand All @@ -279,7 +284,7 @@ async def create_approval_request(
validators_manager_signature=validators_manager_signature,
)

for validator_index, validator in enumerate(validators, start_validator_index):
for validator_index, validator in enumerate(validators, validators_start_index):
if isinstance(validator, RelayerValidator):
exit_signature = validator.exit_signature
else:
Expand Down Expand Up @@ -307,12 +312,12 @@ async def create_approval_request(
return request


async def get_start_validator_index():
async def get_validators_start_index():
latest_public_keys = await get_latest_network_validator_public_keys()
start_validator_index = NetworkValidatorCrud().get_next_validator_index(
validators_start_index = NetworkValidatorCrud().get_next_validator_index(
list(latest_public_keys)
)
return start_validator_index
return validators_start_index


async def load_genesis_validators() -> None:
Expand Down
Loading