Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 59s
federation.sx: instance = {cache, prov cid->peer}. fed-export/import share results
by global content-id (trusted import -> pure cache hit, the L2-registry analog);
trust gating rejects untrusted peers; fed-pull uses an injected fetch transport;
fed-invalidate drops a peer's provenanced results (peer-scoped, leaves local
results). fed 15/15, total 102/102. All 6 phases complete.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
76 lines
2.6 KiB
Plaintext
76 lines
2.6 KiB
Plaintext
; lib/artdag/federation.sx — Phase 6: shared content-addressed cache across
|
|
; instances (the L2-registry analog). Because content-ids are global, a result
|
|
; computed on one instance is reusable on another by id. Imports are trust-gated
|
|
; and carry provenance so a peer's results can be invalidated when trust is
|
|
; withdrawn. Transport is injected (mock in tests). Depends on dag.sx, execute.sx
|
|
; (the cache is a lib/persist/ kv backend) — federation tracks provenance beside it.
|
|
|
|
; an instance: a persist kv cache + a provenance map {cid -> origin-peer}.
|
|
(define artdag/fed-open (fn () {:cache (persist/open) :prov {}}))
|
|
(define artdag/fed-cache (fn (fed) (get fed :cache)))
|
|
(define artdag/fed-prov (fn (fed) (get fed :prov)))
|
|
|
|
(define
|
|
artdag/-dict-remove
|
|
(fn
|
|
(d key)
|
|
(reduce
|
|
(fn (acc k) (if (= k key) acc (assoc acc k (get d k))))
|
|
{}
|
|
(keys d))))
|
|
|
|
; export every cached result as a bundle of {:cid :result :peer}, tagged with
|
|
; the exporting instance's peer id (the result's origin/provenance).
|
|
(define
|
|
artdag/fed-export
|
|
(fn
|
|
(fed peer-id)
|
|
(map (fn (cid) {:peer peer-id :cid cid :result (persist/kv-get (get fed :cache) cid)}) (persist/kv-keys (get fed :cache)))))
|
|
|
|
; import a bundle, accepting only records from trusted peers (trust gating) and
|
|
; recording each accepted result's provenance. Returns the updated instance.
|
|
(define
|
|
artdag/fed-import
|
|
(fn
|
|
(fed bundle trusted?)
|
|
(reduce
|
|
(fn
|
|
(f rec)
|
|
(if
|
|
(trusted? (get rec :peer))
|
|
(begin
|
|
(persist/kv-put (get f :cache) (get rec :cid) (get rec :result))
|
|
{:cache (get f :cache) :prov (assoc (get f :prov) (get rec :cid) (get rec :peer))})
|
|
f))
|
|
fed
|
|
bundle)))
|
|
|
|
; pull from a peer through an injected transport (fetch-fn peer-id -> bundle).
|
|
(define
|
|
artdag/fed-pull
|
|
(fn
|
|
(fed fetch-fn peer-id trusted?)
|
|
(artdag/fed-import fed (fetch-fn peer-id) trusted?)))
|
|
|
|
; invalidate: drop every cached result provenanced to a peer (trust withdrawn),
|
|
; from both the cache and the provenance map. Locally-computed results (no
|
|
; provenance) are untouched. Returns the updated instance.
|
|
(define
|
|
artdag/fed-invalidate
|
|
(fn
|
|
(fed peer-id)
|
|
(reduce
|
|
(fn
|
|
(f cid)
|
|
(if
|
|
(= (get (get f :prov) cid) peer-id)
|
|
(begin (persist/kv-delete (get f :cache) cid) {:cache (get f :cache) :prov (artdag/-dict-remove (get f :prov) cid)})
|
|
f))
|
|
fed
|
|
(keys (get fed :prov)))))
|
|
|
|
; convenience: run a dag against an instance's cache.
|
|
(define
|
|
artdag/fed-run
|
|
(fn (fed dag runner) (artdag/run dag runner (artdag/fed-cache fed))))
|