gridresilience-studio-offli.../gridresilience_studio/governance.py

58 lines
1.6 KiB
Python

from __future__ import annotations
import hashlib
import json
from dataclasses import dataclass
from datetime import datetime
from typing import List
@dataclass
class GovernanceEntry:
contract_id: str
action: str
signer: str
timestamp: str
version: int
payload_hash: str | None = None
class GovernanceLedger:
def __init__(self) -> None:
self._entries: List[GovernanceEntry] = []
self._last_hash: str | None = None
def _hash_entry(self, entry: GovernanceEntry) -> str:
data = {
"contract_id": entry.contract_id,
"action": entry.action,
"signer": entry.signer,
"timestamp": entry.timestamp,
"version": entry.version,
"payload_hash": entry.payload_hash,
"prev_hash": self._last_hash,
}
return hashlib.sha256(json.dumps(data, sort_keys=True).encode("utf-8")).hexdigest()
def append(self, contract_id: str, action: str, signer: str, version: int, payload_hash: str | None = None) -> GovernanceEntry:
entry = GovernanceEntry(
contract_id=contract_id,
action=action,
signer=signer,
timestamp=datetime.utcnow().isoformat() + "Z",
version=version,
payload_hash=payload_hash,
)
self._entries.append(entry)
self._last_hash = self._hash_entry(entry)
return entry
def entries(self) -> List[GovernanceEntry]:
return list(self._entries)
def latest_hash(self) -> str | None:
return self._last_hash
__all__ = ["GovernanceLedger", "GovernanceEntry"]