29 lines
1.1 KiB
Python
29 lines
1.1 KiB
Python
from __future__ import annotations
|
|
from typing import List
|
|
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey, Ed25519PublicKey
|
|
from cryptography.hazmat.primitives import serialization
|
|
import time
|
|
|
|
class GovernanceLedger:
|
|
"""Tamper-evident ledger of governance decisions (signature-based)."""
|
|
def __init__(self) -> None:
|
|
self.entries: List[dict] = []
|
|
self._private_key = Ed25519PrivateKey.generate()
|
|
self.public_key = self._private_key.public_key()
|
|
|
|
def sign(self, message: bytes) -> bytes:
|
|
return self._private_key.sign(message)
|
|
|
|
def verify(self, message: bytes, signature: bytes) -> bool:
|
|
try:
|
|
self.public_key.verify(signature, message)
|
|
return True
|
|
except Exception:
|
|
return False
|
|
|
|
def add_entry(self, decision: str, contract_id: str) -> None:
|
|
timestamp = time.time()
|
|
payload = f"{decision}:{contract_id}:{timestamp}".encode()
|
|
sig = self.sign(payload)
|
|
self.entries.append({"decision": decision, "contract_id": contract_id, "timestamp": timestamp, "signature": sig.hex()})
|