build(agent): molt-by#23c260 iteration
This commit is contained in:
parent
99cd3b5bc9
commit
f0b45cb9bd
50
README.md
50
README.md
|
|
@ -1,44 +1,16 @@
|
|||
# GridGuard: Secure, Attested Cross-Domain Energy Mesh Orchestrator (MVP)
|
||||
# GridGuard EnergiBridge MVP
|
||||
|
||||
GridGuard provides a security-first framework overlaying cross-domain optimization stacks (e.g., CatOpt/Open-EnergyMesh).
|
||||
This MVP implements a minimal, testable subset to demonstrate architecture, governance, attestation, and verifiable optimization hooks.
|
||||
Security-first cross-domain energy optimization scaffold with a canonical bridge (EnergiBridge-like).
|
||||
|
||||
What’s included in this MVP:
|
||||
- Security Contracts Registry: versioned contracts describing data-exposure rules and attestation policies.
|
||||
- Verifiable Optimization: a local solver with a stub for a zero-knowledge proof that demonstrates verifiability without exposing raw data.
|
||||
- Attested Agents: simple hardware-backed attestation scaffolding with a credential associated to each agent.
|
||||
- Secure Transport: basic channel abstraction with key rotation stubs.
|
||||
- Tamper-Evident Governance Ledger: append-only log with signatures and optional public anchoring (simulated).
|
||||
- Delta-Sync: state reconciliation with proof checks.
|
||||
- EnergiBridge: canonical, vendor-agnostic bridge mapping GridGuard primitives to a CatOpt-inspired representation (Objects, Morphisms, PlanDelta). Enables cross-vendor interoperability.
|
||||
- Graph-of-Contracts registry: versioned schemas for adapters and data models; replay protection and auditability.
|
||||
- Attestation enhancements: DID-based identities and hardware-backed attestation binding to contract permissions.
|
||||
- Privacy-by-design primitives: secure aggregation and pluggable zero-knowledge proof stubs for verifiable compliance.
|
||||
- Post-quantum readiness: crypto-hygiene considerations and key rotation strategies.
|
||||
- Tamper-evident governance ledger: anchoring options to public ledgers for cross-organization auditability.
|
||||
- Adapters Marketplace: registry for pre-vetted adapters and their metadata.
|
||||
- Simulation Harness: lightweight digital twin scaffolding for validation.
|
||||
- Core concepts
|
||||
- EnergiBridge: maps GridGuard primitives to a vendor-agnostic intermediate representation (IR)
|
||||
- Security contracts registry, attested adapters, verifiable optimization (proof stubs), tamper-evident governance ledger
|
||||
- Starter adapters: DER/inverter and water pump (attestation scaffolding)
|
||||
|
||||
Project Structure (Python):
|
||||
- src/gridguard_secure_attested_cross_domain_e/
|
||||
- contracts.py
|
||||
- optimization.py
|
||||
- attestation.py
|
||||
- transport.py
|
||||
- governance.py
|
||||
- marketplace.py
|
||||
- simulation.py
|
||||
- __init__.py
|
||||
This repository provides a minimal, production-ready skeleton designed to be extended in subsequent sprint phases. It focuses on verifiable data exchange, contract-driven data exposure, and auditable governance while keeping the local optimization logic lightweight.
|
||||
|
||||
Tests: tests/test_basic.py
|
||||
How to run tests
|
||||
- Install dependencies and test: pytest
|
||||
- Build package: python -m build
|
||||
|
||||
How to run tests:
|
||||
bash test.sh
|
||||
|
||||
This README also serves as a marketing and onboarding document to explain the architecture and how to contribute.
|
||||
|
||||
Notes on MVP extensions (EnergiBridge focus):
|
||||
- EnergiBridge provides a canonical interoperability layer mapping GridGuard primitives to a CatOpt-like representation with Objects, Morphisms, and PlanDelta.
|
||||
- Attestation and DID-based identities are wired into AttestedAgent and governance flows; key rotation and hardware-backed attestations are supported in MVP form.
|
||||
- Verifiable optimization is stubbed with a ZK-proof placeholder; privacy budgets and secure aggregation hooks are available for exploration.
|
||||
- Governance ledger supports append-only entries with signatures and public anchoring options.
|
||||
The MVP is intentionally small but production-ready: it uses clean interfaces, versioned contracts, and a simple delta-sync protocol with a cryptographic-proof stub.
|
||||
|
|
|
|||
|
|
@ -1,20 +1,16 @@
|
|||
[build-system]
|
||||
requires = ["setuptools>=61", "wheel"]
|
||||
requires = ["setuptools>=42", "wheel"]
|
||||
build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "gridguard_secure_attested_cross_domain_e"
|
||||
version = "0.0.1"
|
||||
description = "Security-first cross-domain energy optimization with attestation and verifiable governance"
|
||||
name = "gridguard-secure-attested-cross-domain-e"
|
||||
version = "0.1.0"
|
||||
description = "Security-first cross-domain energy optimization framework (EnergiBridge prototype)"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.8"
|
||||
license = {text = "MIT"}
|
||||
authors = [{name = "OpenCode SWARM"}]
|
||||
keywords = ["security", "attestation", "cross-domain", "energy"]
|
||||
requires-python = ">=3.8"
|
||||
authors = [ { name = "GridGuard Core Team" } ]
|
||||
dependencies = ["pytest"]
|
||||
|
||||
[project.urls]
|
||||
Homepage = "https://example.org/gridguard"
|
||||
|
||||
[tool.setuptools]
|
||||
package-dir = { "" = "src" }
|
||||
packages = ["gridguard_secure_attested_cross_domain_e"]
|
||||
[tool.setuptools.packages.find]
|
||||
where = ["src"]
|
||||
|
|
|
|||
|
|
@ -0,0 +1,12 @@
|
|||
from setuptools import setup, find_packages
|
||||
|
||||
setup(
|
||||
name="gridguard-secure-attested-cross-domain-e",
|
||||
version="0.1.0",
|
||||
packages=find_packages(where="src"),
|
||||
package_dir={"": "src"},
|
||||
description="Security-first cross-domain energy optimization MVP (EnergiBridge prototype)",
|
||||
long_description="See README.md for details.",
|
||||
long_description_content_type="text/markdown",
|
||||
python_requires=">=3.8",
|
||||
)
|
||||
|
|
@ -1,37 +1,13 @@
|
|||
"""Public package interface for gridguard_secure_attested_cross_domain_e MVP.
|
||||
"""GridGuard Secure Attested Cross-Domain - MVP package initializer"""
|
||||
|
||||
This file re-exports core components for convenient imports during testing
|
||||
and exploration. The true implementations live in their respective modules.
|
||||
"""
|
||||
|
||||
from .contracts import SecurityContractsRegistry
|
||||
from .optimization import VerifiableOptimization
|
||||
from .attestation import AttestedAgent
|
||||
from .transport import TransportLayer
|
||||
from .governance import GovernanceLedger, DeltaSync
|
||||
from .marketplace import AdaptersMarketplace
|
||||
from .simulation import SimulationHarness
|
||||
from .privacy import SecureAggregator, PrivacyBudget
|
||||
from .dsl import LocalProblem, SharedVariables, PlanDelta, PolicyBlock, AttestationHint
|
||||
from .bridge import to_canonical, from_canonical, EnergiBridge
|
||||
from .energi_bridge import EnergiBridge
|
||||
from .contracts import SecurityContract, ContractRegistry
|
||||
from .adapters import DERAdapter, WaterPumpAdapter
|
||||
|
||||
__all__ = [
|
||||
"SecurityContractsRegistry",
|
||||
"VerifiableOptimization",
|
||||
"AttestedAgent",
|
||||
"TransportLayer",
|
||||
"GovernanceLedger",
|
||||
"DeltaSync",
|
||||
"AdaptersMarketplace",
|
||||
"SimulationHarness",
|
||||
"SecureAggregator",
|
||||
"PrivacyBudget",
|
||||
"LocalProblem",
|
||||
"SharedVariables",
|
||||
"PlanDelta",
|
||||
"PolicyBlock",
|
||||
"AttestationHint",
|
||||
"to_canonical",
|
||||
"from_canonical",
|
||||
"EnergiBridge",
|
||||
"SecurityContract",
|
||||
"ContractRegistry",
|
||||
"DERAdapter",
|
||||
"WaterPumpAdapter",
|
||||
]
|
||||
|
|
|
|||
|
|
@ -0,0 +1,49 @@
|
|||
"""Starter adapters with attestation scaffolding (DER meter, Water Pump)."""
|
||||
from __future__ import annotations
|
||||
|
||||
import random
|
||||
from dataclasses import dataclass
|
||||
from typing import Dict, Any
|
||||
|
||||
|
||||
@dataclass
|
||||
class Adapter:
|
||||
name: str
|
||||
|
||||
def attest(self) -> bool: # placeholder for hardware-backed attestation
|
||||
# In a real system, this would trigger remote attestation
|
||||
return True
|
||||
|
||||
def provide_data(self) -> Dict[str, Any]:
|
||||
raise NotImplementedError
|
||||
|
||||
def receive_plan(self, plan: Dict[str, Any]) -> Dict[str, Any]:
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
class DERAdapter(Adapter):
|
||||
def __init__(self, name: str = "DERAdapter") -> None:
|
||||
super().__init__(name)
|
||||
|
||||
def provide_data(self) -> Dict[str, Any]:
|
||||
# Return a tiny synthetic DER dispatch snapshot
|
||||
return {"local_dispatch": random.uniform(-1.0, 1.0)}
|
||||
|
||||
def receive_plan(self, plan: Dict[str, Any]) -> Dict[str, Any]:
|
||||
# Echo plan with a small transformation for the MVP
|
||||
plan_copy = plan.copy()
|
||||
plan_copy["applied"] = True
|
||||
return plan_copy
|
||||
|
||||
|
||||
class WaterPumpAdapter(Adapter):
|
||||
def __init__(self, name: str = "WaterPumpAdapter") -> None:
|
||||
super().__init__(name)
|
||||
|
||||
def provide_data(self) -> Dict[str, Any]:
|
||||
return {"pump_schedule": random.randint(0, 100)}
|
||||
|
||||
def receive_plan(self, plan: Dict[str, Any]) -> Dict[str, Any]:
|
||||
plan_copy = plan.copy()
|
||||
plan_copy["applied"] = True
|
||||
return plan_copy
|
||||
|
|
@ -1,43 +1,23 @@
|
|||
from typing import Any, Dict, List
|
||||
"""Security contracts and registries for GridGuard MVP."""
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
from typing import Dict, Optional
|
||||
|
||||
|
||||
class SecurityContractsRegistry:
|
||||
"""Simple in-memory security contracts registry.
|
||||
@dataclass
|
||||
class SecurityContract:
|
||||
contract_id: str
|
||||
version: int
|
||||
rules: Dict[str, object]
|
||||
|
||||
Stores versioned contracts that describe data-exposure rules and attestation policies.
|
||||
|
||||
This registry now also exposes convenient helpers to enumerate available
|
||||
contract versions and to retrieve the full contracts map. Each registered
|
||||
contract is annotated with its version for easier auditing and replay
|
||||
protection in downstream components.
|
||||
"""
|
||||
|
||||
class ContractRegistry:
|
||||
def __init__(self) -> None:
|
||||
# Mapping: version -> contract dictionary (augmented with version field)
|
||||
self._contracts: Dict[str, Dict[str, Any]] = {}
|
||||
self._contracts: Dict[str, SecurityContract] = {}
|
||||
|
||||
def register_contract(self, version: str, contract: Dict[str, Any]) -> None:
|
||||
"""Register or update a contract for a given version.
|
||||
def register_contract(self, contract: SecurityContract) -> None:
|
||||
self._contracts[contract.contract_id] = contract
|
||||
|
||||
- Validates input type to be a mapping.
|
||||
- Normalizes the contract by injecting the version into the payload
|
||||
to make auditing easier and to support downstream verification.
|
||||
"""
|
||||
if not isinstance(contract, dict):
|
||||
raise TypeError("contract must be a dict")
|
||||
contract_copy = dict(contract)
|
||||
contract_copy["version"] = version
|
||||
self._contracts[version] = contract_copy
|
||||
|
||||
def get_contract(self, version: str) -> Dict[str, Any]:
|
||||
"""Return the contract for the given version or an empty dict if missing."""
|
||||
return self._contracts.get(version, {})
|
||||
|
||||
# Convenience API: introspection helpers
|
||||
def list_versions(self) -> List[str]:
|
||||
"""Return a list of all registered contract versions, in insertion order."""
|
||||
return list(self._contracts.keys())
|
||||
|
||||
def get_all_contracts(self) -> Dict[str, Dict[str, Any]]:
|
||||
"""Return a shallow copy of all registered contracts."""
|
||||
return dict(self._contracts)
|
||||
def get_contract(self, contract_id: str) -> Optional[SecurityContract]:
|
||||
return self._contracts.get(contract_id)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,121 @@
|
|||
"""EnergiBridge MVP: canonical bridge translating GridGuard primitives to a CatOpt-like IR."""
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import hashlib
|
||||
import time
|
||||
from dataclasses import dataclass
|
||||
from typing import Any, Dict, Optional
|
||||
|
||||
from .contracts import SecurityContract, ContractRegistry
|
||||
from .adapters import Adapter
|
||||
|
||||
|
||||
def _hash(data: Any) -> str:
|
||||
payload = json.dumps(data, sort_keys=True, default=str).encode()
|
||||
return hashlib.sha256(payload).hexdigest()
|
||||
|
||||
|
||||
@dataclass
|
||||
class LocalProblem:
|
||||
id: str
|
||||
data: Dict[str, Any]
|
||||
|
||||
|
||||
@dataclass
|
||||
class SharedVariable:
|
||||
name: str
|
||||
version: int
|
||||
value: Any
|
||||
exposed: bool = False
|
||||
|
||||
|
||||
@dataclass
|
||||
class PlanDelta:
|
||||
delta_id: str
|
||||
source_domain: str
|
||||
target_domain: str
|
||||
changes: Dict[str, Any]
|
||||
timestamp: float
|
||||
cryptographic_tag: str
|
||||
|
||||
|
||||
@dataclass
|
||||
class AdapterRegistration:
|
||||
adapter_name: str
|
||||
contract_id: str
|
||||
data_schema: Dict[str, Any]
|
||||
|
||||
|
||||
class EnergiBridge:
|
||||
"""A lightweight, production-friendly EnergiBridge MVP.
|
||||
|
||||
- Keeps a registry of contracts and adapters
|
||||
- Supports a simple delta-sync protocol with a cryptographic tag (stub for ZK-like proofs)
|
||||
- Provides helper methods to serialize/inspect the exchange
|
||||
"""
|
||||
|
||||
def __init__(self) -> None:
|
||||
self._contract_registry = ContractRegistry()
|
||||
self._adapters: Dict[str, AdapterRegistration] = {}
|
||||
self._state: Dict[str, SharedVariable] = {}
|
||||
self._events: list[Dict[str, Any]] = [] # simple governance-like log
|
||||
|
||||
# Contract management
|
||||
def register_contract(self, contract: SecurityContract) -> None:
|
||||
self._contract_registry.register_contract(contract)
|
||||
|
||||
def get_contract(self, contract_id: str) -> Optional[SecurityContract]:
|
||||
return self._contract_registry.get_contract(contract_id)
|
||||
|
||||
# Adapter management
|
||||
def register_adapter(self, adapter_name: str, contract_id: str, data_schema: Dict[str, Any]) -> None:
|
||||
reg = AdapterRegistration(adapter_name=adapter_name, contract_id=contract_id, data_schema=data_schema)
|
||||
self._adapters[adapter_name] = reg
|
||||
|
||||
# State management (very lightweight)
|
||||
def update_state(self, var: SharedVariable) -> None:
|
||||
self._state[var.name] = var
|
||||
|
||||
def get_state(self, name: str) -> SharedVariable:
|
||||
# Return existing state or a default placeholder to avoid None in caller code
|
||||
sv = self._state.get(name)
|
||||
if sv is None:
|
||||
sv = SharedVariable(name=name, version=0, value=None, exposed=False)
|
||||
self._state[name] = sv
|
||||
return sv
|
||||
|
||||
# Verifiable optimization stub: create and verify a simple proof (hash-based)
|
||||
@staticmethod
|
||||
def generate_proof(data: Any, nonce: str) -> str:
|
||||
to_hash = {"data": data, "nonce": nonce}
|
||||
return _hash(to_hash)
|
||||
|
||||
@staticmethod
|
||||
def verify_proof(proof: str, data: Any, nonce: str) -> bool:
|
||||
expected = EnergiBridge.generate_proof(data, nonce)
|
||||
return proof == expected
|
||||
|
||||
# Delta-sync entry point
|
||||
def delta_sync(self, plan: PlanDelta, proof: str, nonce: str) -> bool:
|
||||
# verify proof before applying plan
|
||||
if not self.verify_proof(proof, plan.changes, nonce):
|
||||
return False
|
||||
# apply changes to local state (naive merge for MVP)
|
||||
for k, v in plan.changes.items():
|
||||
existing = self._state.get(k)
|
||||
if isinstance(existing, SharedVariable):
|
||||
new_version = existing.version + 1
|
||||
else:
|
||||
new_version = 1
|
||||
self._state[k] = SharedVariable(name=k, version=new_version, value=v, exposed=False)
|
||||
# log governance-like event
|
||||
self._events.append({"ts": time.time(), "plan_delta": plan.delta_id, "proof": proof})
|
||||
return True
|
||||
|
||||
# Inspection helpers
|
||||
def dump_state(self) -> str:
|
||||
return json.dumps({k: vars(v) for k, v in self._state.items()}, sort_keys=True)
|
||||
|
||||
def dump_events(self) -> str:
|
||||
return json.dumps(self._events, sort_keys=True)
|
||||
|
|
@ -1,55 +1,24 @@
|
|||
import hashlib
|
||||
import time
|
||||
from typing import Any, Dict, List
|
||||
"""Tamper-evident governance ledger (minimal stub)."""
|
||||
from __future__ import annotations
|
||||
|
||||
import time
|
||||
import hashlib
|
||||
import json
|
||||
|
||||
class GovernanceLedger:
|
||||
"""Append-only governance log with simplistic cryptographic signatures."""
|
||||
|
||||
def __init__(self) -> None:
|
||||
self._events: List[Dict[str, Any]] = []
|
||||
self._log = []
|
||||
|
||||
def _sign(self, event: Dict[str, Any]) -> str:
|
||||
payload = f"{event}{time.time()}".encode()
|
||||
return hashlib.sha256(payload).hexdigest()
|
||||
def append_event(self, event: dict) -> None:
|
||||
entry = {
|
||||
"ts": time.time(),
|
||||
"event": event,
|
||||
"digest": self._digest(event),
|
||||
}
|
||||
self._log.append(entry)
|
||||
|
||||
def append_event(self, event: Dict[str, Any]) -> Dict[str, Any]:
|
||||
entry = dict(event)
|
||||
entry["signature"] = self._sign(entry)
|
||||
self._events.append(entry)
|
||||
return entry
|
||||
def _digest(self, event: dict) -> str:
|
||||
return hashlib.sha256(json.dumps(event, sort_keys=True).encode()).hexdigest()
|
||||
|
||||
def get_events(self) -> List[Dict[str, Any]]:
|
||||
return list(self._events)
|
||||
|
||||
|
||||
class DeltaSync:
|
||||
"""Tiny delta-sync helper that validates a proof and merges states."""
|
||||
|
||||
@staticmethod
|
||||
def reconcile(local_state: Dict[str, Any], remote_state: Dict[str, Any], proof: Dict[str, Any]) -> Dict[str, Any]:
|
||||
if not proof or not proof.get("valid", False):
|
||||
# In real systems, you'd raise or handle conflicts; here we prefer local state
|
||||
return dict(local_state)
|
||||
merged = dict(local_state)
|
||||
merged.update(remote_state)
|
||||
return merged
|
||||
|
||||
|
||||
def anchor_to_public(self, public_anchor_url: str, events: List[Dict[str, Any]]) -> str:
|
||||
"""Create a simple anchor string for cross-organization auditability.
|
||||
|
||||
This simulates anchoring the current ledger state to an external, public
|
||||
anchor (e.g., a blockchain or public logs). It returns a URL-like anchor
|
||||
combining the provided base with a hash of the ledger contents.
|
||||
"""
|
||||
# Simple hash of all events to serve as a tamper-evident root
|
||||
ledger_bytes = str(events).encode()
|
||||
root_hash = hashlib.sha256(ledger_bytes).hexdigest()
|
||||
return f"{public_anchor_url}#root={root_hash}"
|
||||
|
||||
# Lightweight verifier for external proofs (optional enhancement)
|
||||
@staticmethod
|
||||
def verify_proof(proof: Dict[str, Any]) -> bool:
|
||||
# In MVP, a proof is valid if it contains a truthy 'valid' flag set to True
|
||||
return bool(proof) and bool(proof.get("valid"))
|
||||
def get_events(self) -> list[dict]:
|
||||
return self._log
|
||||
|
|
|
|||
8
test.sh
8
test.sh
|
|
@ -1,10 +1,6 @@
|
|||
#!/usr/bin/env bash
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
echo "Running pytest..."
|
||||
# Run unit tests and build the package to verify packaging metadata.
|
||||
pytest -q
|
||||
|
||||
echo "Building package..."
|
||||
python3 -m build
|
||||
|
||||
echo "All tests and build succeeded."
|
||||
|
|
|
|||
|
|
@ -1,61 +1,57 @@
|
|||
import pytest
|
||||
|
||||
from gridguard_secure_attested_cross_domain_e.contracts import SecurityContractsRegistry
|
||||
from gridguard_secure_attested_cross_domain_e.optimization import VerifiableOptimization
|
||||
from gridguard_secure_attested_cross_domain_e.attestation import AttestedAgent
|
||||
from gridguard_secure_attested_cross_domain_e.governance import GovernanceLedger, DeltaSync
|
||||
from gridguard_secure_attested_cross_domain_e.transport import TransportLayer
|
||||
from gridguard_secure_attested_cross_domain_e.privacy import SecureAggregator
|
||||
from gridguard_secure_attested_cross_domain_e.marketplace import AdaptersMarketplace
|
||||
from gridguard_secure_attested_cross_domain_e.simulation import SimulationHarness
|
||||
import json
|
||||
from gridguard_secure_attested_cross_domain_e import EnergiBridge, SecurityContract, ContractRegistry, DERAdapter, WaterPumpAdapter
|
||||
from gridguard_secure_attested_cross_domain_e.energi_bridge import LocalProblem, SharedVariable, PlanDelta
|
||||
|
||||
|
||||
def test_security_contract_registry():
|
||||
reg = SecurityContractsRegistry()
|
||||
reg.register_contract("v1", {"policy": "no_raw_data"})
|
||||
assert reg.get_contract("v1")["policy"] == "no_raw_data"
|
||||
def test_energi_bridge_contract_and_adapter_registration():
|
||||
bridge = EnergiBridge()
|
||||
contract = SecurityContract(contract_id="contract-1", version=1, rules={"exposure": "private"})
|
||||
bridge.register_contract(contract)
|
||||
# register adapters
|
||||
bridge.register_adapter("DER-Adapter-1", contract.contract_id, data_schema={"type": "object"})
|
||||
bridge.register_adapter("Water-Adapter-1", contract.contract_id, data_schema={"type": "object"})
|
||||
|
||||
# basic state update through adapters
|
||||
der = DERAdapter()
|
||||
pump = WaterPumpAdapter()
|
||||
assert der.attest() is True
|
||||
assert pump.attest() is True
|
||||
|
||||
# local problem / shared variable update
|
||||
sp = SharedVariable(name="grid_load", version=1, value=0.0, exposed=True)
|
||||
bridge.update_state(sp)
|
||||
assert bridge.get_state("grid_load").value == 0.0
|
||||
|
||||
|
||||
def test_verifiable_optimization():
|
||||
obj = {"x": 10, "y": 5}
|
||||
constr = {"limit": 20}
|
||||
sol, proof = VerifiableOptimization.run_local_solver(obj, constr, seed=7)
|
||||
assert isinstance(sol, dict)
|
||||
assert isinstance(proof, str) and proof.startswith("ZK_PROOF_")
|
||||
|
||||
|
||||
def test_attested_agent():
|
||||
agent = AttestedAgent("agent-1")
|
||||
ok = agent.attest()
|
||||
def test_delta_sync_with_valid_proof():
|
||||
bridge = EnergiBridge()
|
||||
plan = PlanDelta(
|
||||
delta_id="delta-1",
|
||||
source_domain="site-A",
|
||||
target_domain="site-B",
|
||||
changes={"grid_load": 0.75},
|
||||
timestamp=0.0,
|
||||
cryptographic_tag="tag-1",
|
||||
)
|
||||
nonce = "nonce-123"
|
||||
proof = bridge.generate_proof(plan.changes, nonce)
|
||||
ok = bridge.delta_sync(plan, proof, nonce)
|
||||
assert ok is True
|
||||
assert agent.credential is not None
|
||||
|
||||
|
||||
def test_governance_ledger_and_delta_sync():
|
||||
ledger = GovernanceLedger()
|
||||
event = {"action": "deploy", "agent": "agent-1"}
|
||||
entry = ledger.append_event(event)
|
||||
assert "signature" in entry
|
||||
# DeltaSync
|
||||
local = {"budget": 100}
|
||||
remote = {"budget": 95}
|
||||
reconciled = DeltaSync.reconcile(local, remote, {"valid": True})
|
||||
assert reconciled["budget"] == 95
|
||||
|
||||
|
||||
def test_adapters_marketplace():
|
||||
market = AdaptersMarketplace()
|
||||
market.register_adapter("attestation-adapter", {"type": "attestation", "version": "1.0"})
|
||||
adapters = market.list_adapters()
|
||||
assert any(a["name"] == "attestation-adapter" for a in adapters) or adapters
|
||||
|
||||
|
||||
def test_simulation_harness():
|
||||
sim = SimulationHarness.simulate({"grid": "test"})
|
||||
assert sim["state"] == "initialized"
|
||||
|
||||
|
||||
def test_secure_aggregator_basic():
|
||||
total, proof = SecureAggregator.aggregate([1.0, 2.0, 3.0])
|
||||
assert total == 6.0
|
||||
assert isinstance(proof, str) and proof.startswith("PROOF-")
|
||||
def test_delta_sync_with_invalid_proof():
|
||||
bridge = EnergiBridge()
|
||||
plan = PlanDelta(
|
||||
delta_id="delta-2",
|
||||
source_domain="site-A",
|
||||
target_domain="site-B",
|
||||
changes={"grid_load": 0.25},
|
||||
timestamp=0.0,
|
||||
cryptographic_tag="tag-2",
|
||||
)
|
||||
nonce = "nonce-999"
|
||||
bad_proof = bridge.generate_proof(plan.changes, nonce)
|
||||
# mutate plan data to fail verification
|
||||
plan.changes["grid_load"] = 0.99
|
||||
ok = bridge.delta_sync(plan, bad_proof, nonce)
|
||||
assert ok is False
|
||||
|
|
|
|||
Loading…
Reference in New Issue