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

feat: checkpoints refactoring + tests #463

Merged
merged 1 commit into from
Jun 11, 2024
Merged
Show file tree
Hide file tree
Changes from all 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
260 changes: 147 additions & 113 deletions src/modules/csm/checkpoint.py

Large diffs are not rendered by default.

33 changes: 21 additions & 12 deletions src/modules/csm/csm.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@

from src.metrics.prometheus.business import CONTRACT_ON_PAUSE
from src.metrics.prometheus.duration_meter import duration_meter
from src.modules.csm.checkpoint import CheckpointsFactory
from src.modules.csm.state import InvalidState, State
from src.modules.csm.checkpoint import CheckpointsIterator, CheckpointProcessor
from src.modules.csm.state import State, InvalidState
from src.modules.csm.tree import Tree
from src.modules.csm.types import ReportData
from src.modules.submodules.consensus import ConsensusModule
from src.modules.submodules.oracle_module import BaseModule, ModuleExecuteDelay
from src.modules.submodules.types import ZERO_HASH
from src.providers.execution.contracts import CSFeeOracle
from src.providers.execution.contracts.cs_fee_oracle import CSFeeOracle
from src.types import BlockStamp, EpochNumber, ReferenceBlockStamp, SlotNumber, ValidatorIndex
from src.utils.cache import global_lru_cache as lru_cache
from src.utils.slot import get_first_non_missed_slot
Expand Down Expand Up @@ -222,24 +222,33 @@ def collect_data(self, blockstamp: BlockStamp) -> bool:
self.state.validate_for_collect(l_epoch, r_epoch)
self.state.status()

factory = CheckpointsFactory(self.w3.cc, converter, self.state)
checkpoints = factory.prepare_checkpoints(l_epoch, r_epoch, finalized_epoch)
if done := self.state.is_fulfilled:
logger.info({"msg": "All epochs are already processed. Nothing to collect"})
return done

checkpoints = CheckpointsIterator(
converter, min(self.state.unprocessed_epochs) or l_epoch, r_epoch, finalized_epoch
)
processor = CheckpointProcessor(self.w3.cc, self.state, converter, blockstamp)

new_processed_epochs = 0
start = time.time()
for checkpoint in checkpoints:

if self.current_frame_range(self._receive_last_finalized_slot()) != (l_ref_slot, r_ref_slot):
logger.info({"msg": "Checkpoints were prepared for an outdated frame, stop proccessing"})
logger.info({"msg": "Checkpoints were prepared for an outdated frame, stop processing"})
raise ValueError("Outdated checkpoint")

if converter.get_epoch_by_slot(checkpoint.slot) > finalized_epoch:
if checkpoint.slot > blockstamp.slot_number:
logger.info({"msg": f"Checkpoint for slot {checkpoint.slot} is not finalized yet"})
break

logger.info({"msg": f"Processing checkpoint for slot {checkpoint.slot}"})
logger.info({"msg": f"Processing {len(checkpoint.duty_epochs)} epochs"})
checkpoint.process(blockstamp)
if checkpoints:
logger.info({"msg": f"All epochs were processed in {time.time() - start:.2f} seconds"})
new_processed_epochs += processor.exec(checkpoint)

if new_processed_epochs:
logger.info(
{"msg": f"Collecting data for {new_processed_epochs} epochs was done in {time.time() - start:.2f} sec"}
)

return self.state.is_fulfilled

Expand Down
3 changes: 0 additions & 3 deletions src/providers/execution/contracts/__init__.py

This file was deleted.

4 changes: 3 additions & 1 deletion src/web3py/extensions/csm.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@

from src import variables
from src.metrics.prometheus.business import FRAME_PREV_REPORT_REF_SLOT
from src.providers.execution.contracts import CSFeeDistributor, CSFeeOracle, CSModule
from src.providers.execution.contracts.cs_fee_distributor import CSFeeDistributor
from src.providers.execution.contracts.cs_fee_oracle import CSFeeOracle
from src.providers.execution.contracts.cs_module import CSModule
from src.providers.ipfs import CIDv0, CIDv1, is_cid_v0
from src.types import BlockStamp, SlotNumber
from src.web3py.extensions.lido_validators import NodeOperatorId
Expand Down
29 changes: 28 additions & 1 deletion tests/factory/configs.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
from typing import overload
from src.modules.accounting.types import OracleReportLimits
from src.modules.submodules.types import ChainConfig, FrameConfig
from src.providers.consensus.types import BeaconSpecResponse
from src.providers.consensus.types import (
BeaconSpecResponse,
SlotAttestationCommittee,
BlockAttestation,
AttestationData,
Checkpoint,
)
from src.services.bunker_cases.types import BunkerConfig
from tests.factory.web3_factory import Web3Factory

Expand Down Expand Up @@ -45,3 +51,24 @@ class BeaconSpecResponseFactory(Web3Factory):
SECONDS_PER_SLOT = 12
SLOTS_PER_EPOCH = 32
SLOTS_PER_HISTORICAL_ROOT = 8192


class SlotAttestationCommitteeFactory(Web3Factory):
__model__ = SlotAttestationCommittee

slot = 0
index = 0
validators = []


class BlockAttestationFactory(Web3Factory):
__model__ = BlockAttestation

aggregation_bits = "0x"
data = AttestationData(
slot="0",
index="0",
beacon_block_root="0x",
source=Checkpoint("0", "0x"),
target=Checkpoint("0", "0x"),
)
Loading
Loading