63 lines
1.2 KiB
Python
63 lines
1.2 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
from dataclasses import dataclass, asdict, field
|
|
from typing import Any, Dict, List, Optional
|
|
|
|
|
|
def to_json(obj: Any) -> str:
|
|
return json.dumps(obj, default=lambda o: o.__dict__, sort_keys=True)
|
|
|
|
|
|
@dataclass
|
|
class Signal:
|
|
venue: str
|
|
timestamp: int # unix epoch ms
|
|
metrics: Dict[str, Any] # privacy-budget bounded features
|
|
version: int = 1
|
|
|
|
def to_json(self) -> str:
|
|
return to_json(asdict(self))
|
|
|
|
|
|
@dataclass
|
|
class SignalDelta:
|
|
venue: str
|
|
timestamp: int
|
|
delta: Dict[str, Any]
|
|
version: int = 1
|
|
|
|
def to_json(self) -> str:
|
|
return to_json(asdict(self))
|
|
|
|
|
|
@dataclass
|
|
class ProvenanceProof:
|
|
venue: str
|
|
timestamp: int
|
|
merkle_root: str
|
|
proof_path: List[str] = field(default_factory=list)
|
|
|
|
def to_json(self) -> str:
|
|
return to_json(asdict(self))
|
|
|
|
|
|
@dataclass
|
|
class PrivacyBudget:
|
|
venue: str
|
|
limit: float # e.g., max entropy to reveal
|
|
used: float = 0.0
|
|
|
|
def to_json(self) -> str:
|
|
return to_json(asdict(self))
|
|
|
|
|
|
@dataclass
|
|
class AuditLog:
|
|
event: str
|
|
timestamp: int
|
|
details: Dict[str, Any] = field(default_factory=dict)
|
|
|
|
def to_json(self) -> str:
|
|
return to_json(asdict(self))
|