+-------------------------+ +---------------------------+
| Issuers | | Relying Applications |
| (KYC, .edu, employer) | | ("score ≥ θ?" checks) |
+------------+------------+ +--------------+------------+
| |
v v
+------------+-------------------- P2P Fabric (libp2p) -----------------------+
| Topics: events/* revocations/* rules/* checkpoints/* blobs/* (CID fetch) |
+----+----------------+-------------------+------------------+------------------+
| | | |
v v v v
+----+----+ +-----+-----+ +-----+-----+ +----+-------+
| Wallet | | Full Node | | Log Node | | Scorer |
| Light | | Storage | | (Trillian)| | Node |
| Node | | + Proofs | | + Proofs | | (Determin.)|
+----+----+ +-----+-----+ +-----+-----+ +----+-------+
| | | |
+----------------+---------+---------+------------------+
|
v
+--------+--------+
| Checkpoint Comm |
| (BLS threshold)|
+-----------------+
End-user client that holds keys & VCs, creates signed events (vouch/report), requests/assembles proofs, and returns threshold proofs or score bundles to apps.
did:key
v1; later did:web
/ION)POST /v1/events
→ submit signed Event
to p2p gateway
body: Event (detached JWS or inline sig
)GET /v1/scores?did=&ctx=
→ return cached ScoreRecord+proofs (via scorer/fullnode)POST /v1/threshold-proof
→ {proof, checkpoint}
body: {ctx, threshold, nonce}
Event
{
"type":"vouch|report",
"from":"did:key:z6Mk...",
"to":"did:key:z6Mk...",
"ctx":"general|commerce|hiring",
"epoch":"2025-09",
"payloadCID":"bafy... (optional)",
"nonce":"base64-12",
"issuedAt":"2025-09-12T19:12:45Z",
"sig":"ed25519..."
}
vouch_budget[ctx][epoch]
POST /events
→ receive CID receiptGET /scores
(or build zk) → return to appSingle entry for libp2p: gossip publish/subscribe, CID fetch, rate limiting, HTTP bridge for other services.
events/*
, revocations/*
, rules/*
, checkpoints/*
, blobs/*
POST /v1/publish?topic=
→ publish signed messageGET /v1/blobs/{cid}
→ fetch blob (with local cache)GET /v1/subscribe?topic=
(SSE/websocket for local services)GET /v1/checkpoints/latest
→ last checkpoint JSONDurable blob store & proof server. Mirrors rules, checkpoints, and StatusLists. Serves inclusion/consistency proofs (proxy to lognode).
(type, from, to, epoch)
status/{issuer}/{epoch}
, rules/active
, checkpointsPOST /v1/events
→ validate basic schema, persist blob, enqueue log append
resp: {cid, queued:true}
GET /v1/blobs/{cid}
→ raw bytesGET /v1/proofs/inclusion?cid=&epoch=
GET /v1/proofs/consistency?from=&to=
GET /v1/status/{issuer}/{epoch}
GET /v1/checkpoints/{epoch}
RocksDB:
events:{cid} -> bytes
idx:to:{did}:{epoch} -> cid[]
idx:from:{did}:{epoch} -> cid[]
status:{issuer}:{epoch} -> bitmapCID
checkpoint:{epoch} -> json
FS for large evidence blobs
POST /events
: persist → forward reference to lognodeAppend-only Merkle log of event references (CIDs + headers) with inclusion/consistency proofs (CT-style).
POST /v1/log/append
→ [{cid, header_hash}]
→ {leafHashes, treeSize, sth}
GET /v1/log/inclusion?cid=&size=
→ audit pathGET /v1/log/consistency?from=&to=
→ proof pathGET /v1/log/sth
→ latest SignedTreeHeadPeriodically aggregates log roots into checkpoints and co-signs with a rotating committee (BLS threshold). Publishes to gossip & mirrors.
Checkpoint{root, epoch, signers, sig}
GET /v1/checkpoints/latest
GET /v1/checkpoints/{epoch}
Committee internal:
POST /v1/partials
(members submit partial sigs)GET /v1/tasks/current
(root, epoch to sign)checkpoints/*
Deterministically compute trust scores from events, VCs, ruleset, and revocations; bundle verifiable proofs for relying apps.
S_i^c = αK + βA + γ*sqrt(Σ min(Sj,cap)*qj) − δR + τT
GET /v1/scores?did=&ctx=
→ ScoreRecord + proofsPOST /v1/recompute?did=
(admin/dev only)GET /v1/factors?did=&ctx=
(debug; commitments by default)RocksDB:
state:{did}:{ctx}
→ {K,A,V,R,T,S,updatedAt}
graph:{did}:{ctx}:in
→ [{from, weight, ts}]
issuer_rep:{issuer}
→ weightruleset_current
→ signed JSONcheckpoint_current
→ JSONGET /scores
: read cached; if stale beyond policy, lazily refreshvalidFrom
, timeLockDays
endpoints:
GET /v1/rules/active
GET /v1/rules/{id}
ruleset.id
+ hash in score outputs./cmd
/walletd
/p2p-gateway
/fullnode
/lognode
/checkpointor
/scorer
/internal
/events // schemas, canonicalization, signing
/didvc // vc-go adapters, sd-jwt helpers
/p2p // libp2p host, topics, quotas
/store // rocksdb wrappers
/log // trillian client wrapper
/score // algorithms, decay, diversity
/proof // bundling; zk (later)
/api
/http // OpenAPI specs, handlers
/deploy
/compose // local stack
/helm // k8s charts
/tests
/e2e // synthetic network sims
want me to expand any one of these (e.g., wallet or scorer) into a full OpenAPI + Go interface skeleton next?