-
Notifications
You must be signed in to change notification settings - Fork 33
/
Copy pathlog.py
48 lines (37 loc) · 1.37 KB
/
log.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import json
from collections import defaultdict
from dataclasses import asdict, dataclass, field
from src.modules.csm.state import AttestationsAccumulator
from src.modules.csm.types import Shares
from src.types import EpochNumber, NodeOperatorId, ReferenceBlockStamp, ValidatorIndex
class LogJSONEncoder(json.JSONEncoder): ...
@dataclass
class ValidatorFrameSummary:
attestation_duty: AttestationsAccumulator = field(default_factory=AttestationsAccumulator)
slashed: bool = False
@dataclass
class OperatorFrameSummary:
distributed: int = 0
validators: dict[ValidatorIndex, ValidatorFrameSummary] = field(default_factory=lambda: defaultdict(ValidatorFrameSummary))
stuck: bool = False
@dataclass
class FramePerfLog:
"""A log of performance assessed per operator in the given frame"""
blockstamp: ReferenceBlockStamp
frame: tuple[EpochNumber, EpochNumber]
threshold: float = 0.0
distributable: Shares = 0
operators: dict[NodeOperatorId, OperatorFrameSummary] = field(
default_factory=lambda: defaultdict(OperatorFrameSummary)
)
@staticmethod
def encode(logs: list['FramePerfLog']) -> bytes:
return (
LogJSONEncoder(
indent=None,
separators=(',', ':'),
sort_keys=True,
)
.encode([asdict(log) for log in logs])
.encode()
)