mercurymesh-privacy-preserv.../mercurymesh_privacy_preserv.../contracts.py

89 lines
1.8 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))
@dataclass
class AggregatedSignal:
"""Cross-venue aggregated signal with privacy budgeting."""
venue_set: List[str]
feature_vector: Dict[str, float]
privacy_budget_used: float
nonce: int = 0
merkle_proof: List[str] = field(default_factory=list)
def to_json(self) -> str:
return to_json(asdict(self))
@dataclass
class PlanDelta:
"""Incremental updates to analytics plans (e.g., reweighting, windows)."""
delta_id: str
venue: str
timestamp: int
delta: Dict[str, Any]
version: int = 1
def to_json(self) -> str:
return to_json(asdict(self))