Skip to content

Commit

Permalink
feat: advanced validation
Browse files Browse the repository at this point in the history
  • Loading branch information
vgorkavenko committed May 7, 2024
1 parent 0f3a3ab commit aef5375
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 12 deletions.
2 changes: 2 additions & 0 deletions src/modules/csm/checkpoint.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,8 @@ def _process_epoch(
)
if duty_epoch not in self.state.epochs_to_process:
raise ValueError(f"Processed {duty_epoch} epoch is not a part of epochs to process")
if duty_epoch in self.state.processed_epochs:
raise ValueError(f"Epoch {duty_epoch} is already processed")
self.state.processed_epochs.add(duty_epoch)
self.state.commit()
self.state.status()
Expand Down
11 changes: 4 additions & 7 deletions src/modules/csm/csm.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,15 +75,12 @@ def build_report(self, blockstamp: ReferenceBlockStamp) -> tuple:
r_epoch = converter.get_epoch_by_slot(r_ref_slot)

try:
self.state.validate(l_epoch, r_epoch)
except InvalidState as ex:
raise ValueError("Unable to build report") from ex
self.state.validate_for_report(l_epoch, r_epoch)
except InvalidState as e:
raise ValueError("State is not valid for the report") from e

self.state.status()

if not self.state.is_fulfilled:
raise ValueError("Not all epochs were processed")

threshold = self.state.avg_perf * self.w3.csm.oracle.perf_threshold(blockstamp.block_hash)

# NOTE: r_block is guaranteed to be <= ref_slot, and the check
Expand Down Expand Up @@ -218,7 +215,7 @@ def collect_data(self, blockstamp: BlockStamp) -> bool:
r_epoch = converter.get_epoch_by_slot(r_ref_slot)

self.state = self.state or State.load()
self.state.validate_and_adjust(l_epoch, r_epoch)
self.state.validate_for_collect(l_epoch, r_epoch)
self.state.status()

factory = CheckpointsFactory(self.w3.cc, converter, self.state)
Expand Down
27 changes: 22 additions & 5 deletions src/modules/csm/state.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ def status(self) -> None:
}
)

def validate(self, l_epoch: EpochNumber, r_epoch: EpochNumber) -> None:
def validate_for_report(self, l_epoch: EpochNumber, r_epoch: EpochNumber) -> None:
for epoch in self.epochs_to_process:
if l_epoch <= epoch <= r_epoch:
raise InvalidState()
Expand All @@ -98,11 +98,28 @@ def validate(self, l_epoch: EpochNumber, r_epoch: EpochNumber) -> None:
if l_epoch <= epoch <= r_epoch:
raise InvalidState()

def validate_and_adjust(self, l_epoch: EpochNumber, r_epoch: EpochNumber):
if not self.is_fulfilled:
raise InvalidState()

try:
self.validate(l_epoch, r_epoch)
except InvalidState:
for epoch in sequence(l_epoch, r_epoch):
if epoch not in self.epochs_to_process:
raise InvalidState()

def validate_for_collect(self, l_epoch: EpochNumber, r_epoch: EpochNumber):

invalidated = False

for epoch in self.epochs_to_process:
if l_epoch <= epoch <= r_epoch:
invalidated = True
break

for epoch in self.processed_epochs:
if l_epoch <= epoch <= r_epoch:
invalidated = True
break

if invalidated:
logger.warning({"msg": "Discarding invalidated state cache"})
self.clear()
self.commit()
Expand Down

0 comments on commit aef5375

Please sign in to comment.