idea69-tradeseal-federated-.../tradeseal/governance.py

32 lines
1.0 KiB
Python

from __future__ import annotations
import json
import time
import hmac
import hashlib
class GovernanceLedger:
def __init__(self, key: bytes):
self.key = key
self.entries = [] # list of dicts
def attest(self, data: dict) -> dict:
# produce a simple HMAC signature over the serialized data
payload = json.dumps(data, sort_keys=True).encode("utf-8")
signature = hmac.new(self.key, payload, hashlib.sha256).hexdigest()
entry = {"timestamp": time.time(), "data": data, "signature": signature}
self.entries.append(entry)
return entry
def verify(self, entry: dict) -> bool:
payload = json.dumps(entry["data"], sort_keys=True).encode("utf-8")
expected = hmac.new(self.key, payload, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, entry.get("signature", ""))
def to_json(self) -> str:
return json.dumps(self.entries, default=str)
def create_attestation(ledger: GovernanceLedger, data: dict) -> dict:
return ledger.attest(data)