Summary
Implement transitive trust via signed endorsements. Nodes publish trust endorsements for peers they vouch for; other nodes compute a local trust graph with configurable depth and policy.
Motivation
Static allowlists (Phase 8) don't scale — every operator must manually approve every node. Web-of-trust enables organic mesh growth: if you trust node A, and A endorses node B, you can automatically trust B (with reduced confidence). This mirrors how PGP key signing works, but automated and integrated into the mesh.
Design
Trust endorsements via state map
Each node publishes endorsements in its own namespace (Phase 5 state map):
<myNodeID>/trust/<targetNodeID> = {"action": "endorse", "timestamp": ..., "note": "..."}
Since writes are namespaced and signed, endorsements are unforgeable — only node X can write X/trust/*.
Revocations work the same way:
<myNodeID>/trust/<targetNodeID> = {"action": "revoke", "timestamp": ...}
Trust levels (extended from Phase 4 keyring)
const (
TrustDirectlyVerified TrustLevel = 0 // Noise handshake (existing)
TrustManuallyTrusted TrustLevel = 1 // Explicitly added to allowlist
TrustEndorsedDepth1 TrustLevel = 2 // Endorsed by a directly verified peer
TrustEndorsedDepth2 TrustLevel = 3 // Endorsed by an endorsed peer
TrustGossipLearned TrustLevel = 4 // Auto-learned from sender_pubkey (existing)
TrustUntrusted TrustLevel = 5 // Known but not trusted
)
Local trust computation
Each node independently computes its trust graph:
- Start from directly verified peers (trust depth 0)
- Follow endorsements up to
max_trust_depth (configurable, default 2)
- Apply local policy: minimum endorsements required, trust decay per hop
- Result: a local map of
nodeID → TrustLevel used by ACL (Phase 8) and gossip engine
Config
[trust]
max_depth = 2 # Maximum endorsement chain length
min_endorsements = 1 # Minimum endorsements to trust at each depth
auto_endorse_direct_peers = true # Automatically endorse nodes after successful PeerHello
Partyline commands
/trust endorse <nodeID> [note] — publish an endorsement
/trust revoke <nodeID> — revoke an endorsement
/trust list — show local trust graph with levels
/trust path <nodeID> — show the endorsement chain to a node
Deliverables
Dependencies
- Phase 5 (state map) — endorsements stored as state map entries
- Phase 8 (ACL) — trust levels feed into access control decisions
Summary
Implement transitive trust via signed endorsements. Nodes publish trust endorsements for peers they vouch for; other nodes compute a local trust graph with configurable depth and policy.
Motivation
Static allowlists (Phase 8) don't scale — every operator must manually approve every node. Web-of-trust enables organic mesh growth: if you trust node A, and A endorses node B, you can automatically trust B (with reduced confidence). This mirrors how PGP key signing works, but automated and integrated into the mesh.
Design
Trust endorsements via state map
Each node publishes endorsements in its own namespace (Phase 5 state map):
Since writes are namespaced and signed, endorsements are unforgeable — only node X can write
X/trust/*.Revocations work the same way:
Trust levels (extended from Phase 4 keyring)
Local trust computation
Each node independently computes its trust graph:
max_trust_depth(configurable, default 2)nodeID → TrustLevelused by ACL (Phase 8) and gossip engineConfig
Partyline commands
/trust endorse <nodeID> [note]— publish an endorsement/trust revoke <nodeID>— revoke an endorsement/trust list— show local trust graph with levels/trust path <nodeID>— show the endorsement chain to a nodeDeliverables
[trust]sectionDependencies