Phase 1: RFC 6962 consistency proofs in merkle.py - Implemented _build_consistency_proof() with recursive subtree decomposition algorithm following RFC 6962 Section 2.1.2 - Added _subproof() recursive helper and _compute_root_of() - Added standalone verify_consistency_proof() function Phase 2: Federation API endpoints on FastAPI server - GET /federation/status — merkle root + log size for gossip probes - GET /federation/records?start=N&count=M — record fetch (cap 100) - GET /federation/consistency-proof?old_size=N — Merkle proof - POST /federation/records — accept records with trust filtering and SHA-256 deduplication - Cached storage singleton for concurrent safety - Added FEDERATION_DIR to paths.py Phase 3: HttpTransport implementation - Replaced stub with real aiohttp client (lazy import for optional dep) - Reusable ClientSession with configurable timeout - All 4 PeerTransport methods: get_status, get_records, get_consistency_proof, push_records - FederationError wrapping for all network failures - Added record_filter callback to GossipNode for trust-store filtering Phase 4: Peer persistence (SQLite) - New peer_store.py: SQLite-backed peer database + sync history - Tables: peers (url, fingerprint, health, last_seen) and sync_history (timestamp, records_received, success/error) - PeerStore follows dropbox.py SQLite pattern Phase 5: CLI commands + Web UI dashboard - CLI: federation status, peer-add, peer-remove, peer-list, sync-now (asyncio), history - Flask blueprint at /federation/ with peer table, sync history, add/remove peer forms, local node info cards - CSRF tokens on all forms Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4.1 KiB
4.1 KiB