@optimystic/db-core 0.14.0 → 0.16.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/blocks/block-store.d.ts +18 -1
- package/dist/src/blocks/block-store.d.ts.map +1 -1
- package/dist/src/blocks/helpers.d.ts +2 -2
- package/dist/src/blocks/helpers.d.ts.map +1 -1
- package/dist/src/blocks/helpers.js +2 -2
- package/dist/src/blocks/helpers.js.map +1 -1
- package/dist/src/btree/btree.d.ts +27 -6
- package/dist/src/btree/btree.d.ts.map +1 -1
- package/dist/src/btree/btree.js +104 -61
- package/dist/src/btree/btree.js.map +1 -1
- package/dist/src/chain/chain.d.ts.map +1 -1
- package/dist/src/chain/chain.js +11 -1
- package/dist/src/chain/chain.js.map +1 -1
- package/dist/src/cluster/index.d.ts +1 -0
- package/dist/src/cluster/index.d.ts.map +1 -1
- package/dist/src/cluster/index.js +1 -0
- package/dist/src/cluster/index.js.map +1 -1
- package/dist/src/cluster/membership.d.ts +49 -0
- package/dist/src/cluster/membership.d.ts.map +1 -0
- package/dist/src/cluster/membership.js +75 -0
- package/dist/src/cluster/membership.js.map +1 -0
- package/dist/src/cluster/structs.d.ts +50 -1
- package/dist/src/cluster/structs.d.ts.map +1 -1
- package/dist/src/cluster/structs.js +9 -1
- package/dist/src/cluster/structs.js.map +1 -1
- package/dist/src/cohort-topic/addressing.d.ts +8 -2
- package/dist/src/cohort-topic/addressing.d.ts.map +1 -1
- package/dist/src/cohort-topic/addressing.js +11 -3
- package/dist/src/cohort-topic/addressing.js.map +1 -1
- package/dist/src/cohort-topic/antidos/bootstrap-evidence.d.ts +13 -7
- package/dist/src/cohort-topic/antidos/bootstrap-evidence.d.ts.map +1 -1
- package/dist/src/cohort-topic/antidos/bootstrap-evidence.js +17 -6
- package/dist/src/cohort-topic/antidos/bootstrap-evidence.js.map +1 -1
- package/dist/src/cohort-topic/antidos/replay-guard.d.ts +17 -0
- package/dist/src/cohort-topic/antidos/replay-guard.d.ts.map +1 -1
- package/dist/src/cohort-topic/antidos/replay-guard.js +33 -0
- package/dist/src/cohort-topic/antidos/replay-guard.js.map +1 -1
- package/dist/src/cohort-topic/antidos/topic-budget.d.ts +7 -0
- package/dist/src/cohort-topic/antidos/topic-budget.d.ts.map +1 -1
- package/dist/src/cohort-topic/antidos/topic-budget.js +8 -2
- package/dist/src/cohort-topic/antidos/topic-budget.js.map +1 -1
- package/dist/src/cohort-topic/coldstart.d.ts +34 -14
- package/dist/src/cohort-topic/coldstart.d.ts.map +1 -1
- package/dist/src/cohort-topic/coldstart.js +25 -11
- package/dist/src/cohort-topic/coldstart.js.map +1 -1
- package/dist/src/cohort-topic/gossip/bus.d.ts +12 -1
- package/dist/src/cohort-topic/gossip/bus.d.ts.map +1 -1
- package/dist/src/cohort-topic/gossip/bus.js +27 -1
- package/dist/src/cohort-topic/gossip/bus.js.map +1 -1
- package/dist/src/cohort-topic/gossip/view.d.ts +8 -0
- package/dist/src/cohort-topic/gossip/view.d.ts.map +1 -1
- package/dist/src/cohort-topic/gossip/view.js +17 -1
- package/dist/src/cohort-topic/gossip/view.js.map +1 -1
- package/dist/src/cohort-topic/member-engine.d.ts +10 -3
- package/dist/src/cohort-topic/member-engine.d.ts.map +1 -1
- package/dist/src/cohort-topic/member-engine.js +29 -14
- package/dist/src/cohort-topic/member-engine.js.map +1 -1
- package/dist/src/cohort-topic/membership/publisher.d.ts +14 -7
- package/dist/src/cohort-topic/membership/publisher.d.ts.map +1 -1
- package/dist/src/cohort-topic/membership/publisher.js +15 -27
- package/dist/src/cohort-topic/membership/publisher.js.map +1 -1
- package/dist/src/cohort-topic/membership/verifier.d.ts +35 -0
- package/dist/src/cohort-topic/membership/verifier.d.ts.map +1 -1
- package/dist/src/cohort-topic/membership/verifier.js +88 -3
- package/dist/src/cohort-topic/membership/verifier.js.map +1 -1
- package/dist/src/cohort-topic/promotion.d.ts +7 -0
- package/dist/src/cohort-topic/promotion.d.ts.map +1 -1
- package/dist/src/cohort-topic/promotion.js +16 -2
- package/dist/src/cohort-topic/promotion.js.map +1 -1
- package/dist/src/cohort-topic/registration/renewal.d.ts +18 -0
- package/dist/src/cohort-topic/registration/renewal.d.ts.map +1 -1
- package/dist/src/cohort-topic/registration/renewal.js +54 -0
- package/dist/src/cohort-topic/registration/renewal.js.map +1 -1
- package/dist/src/cohort-topic/registration/types.d.ts +12 -0
- package/dist/src/cohort-topic/registration/types.d.ts.map +1 -1
- package/dist/src/cohort-topic/registration/types.js +14 -0
- package/dist/src/cohort-topic/registration/types.js.map +1 -1
- package/dist/src/cohort-topic/service.d.ts +4 -3
- package/dist/src/cohort-topic/service.d.ts.map +1 -1
- package/dist/src/cohort-topic/service.js +38 -12
- package/dist/src/cohort-topic/service.js.map +1 -1
- package/dist/src/cohort-topic/sig/payloads.d.ts +23 -7
- package/dist/src/cohort-topic/sig/payloads.d.ts.map +1 -1
- package/dist/src/cohort-topic/sig/payloads.js +22 -6
- package/dist/src/cohort-topic/sig/payloads.js.map +1 -1
- package/dist/src/cohort-topic/traffic.d.ts +6 -0
- package/dist/src/cohort-topic/traffic.d.ts.map +1 -1
- package/dist/src/cohort-topic/traffic.js +16 -1
- package/dist/src/cohort-topic/traffic.js.map +1 -1
- package/dist/src/cohort-topic/walk.d.ts +22 -7
- package/dist/src/cohort-topic/walk.d.ts.map +1 -1
- package/dist/src/cohort-topic/walk.js +78 -18
- package/dist/src/cohort-topic/walk.js.map +1 -1
- package/dist/src/cohort-topic/wire/codec.d.ts +3 -1
- package/dist/src/cohort-topic/wire/codec.d.ts.map +1 -1
- package/dist/src/cohort-topic/wire/codec.js +7 -1
- package/dist/src/cohort-topic/wire/codec.js.map +1 -1
- package/dist/src/cohort-topic/wire/index.d.ts +1 -1
- package/dist/src/cohort-topic/wire/index.d.ts.map +1 -1
- package/dist/src/cohort-topic/wire/index.js +1 -1
- package/dist/src/cohort-topic/wire/index.js.map +1 -1
- package/dist/src/cohort-topic/wire/payloads.d.ts +5 -4
- package/dist/src/cohort-topic/wire/payloads.d.ts.map +1 -1
- package/dist/src/cohort-topic/wire/payloads.js +14 -5
- package/dist/src/cohort-topic/wire/payloads.js.map +1 -1
- package/dist/src/cohort-topic/wire/primitives.d.ts +65 -0
- package/dist/src/cohort-topic/wire/primitives.d.ts.map +1 -0
- package/dist/src/cohort-topic/wire/primitives.js +173 -0
- package/dist/src/cohort-topic/wire/primitives.js.map +1 -0
- package/dist/src/cohort-topic/wire/types.d.ts +132 -5
- package/dist/src/cohort-topic/wire/types.d.ts.map +1 -1
- package/dist/src/cohort-topic/wire/validate.d.ts +15 -5
- package/dist/src/cohort-topic/wire/validate.d.ts.map +1 -1
- package/dist/src/cohort-topic/wire/validate.js +146 -123
- package/dist/src/cohort-topic/wire/validate.js.map +1 -1
- package/dist/src/collection/collection.d.ts +23 -12
- package/dist/src/collection/collection.d.ts.map +1 -1
- package/dist/src/collection/collection.js +111 -35
- package/dist/src/collection/collection.js.map +1 -1
- package/dist/src/collection/struct.d.ts +37 -2
- package/dist/src/collection/struct.d.ts.map +1 -1
- package/dist/src/collection/struct.js +16 -1
- package/dist/src/collection/struct.js.map +1 -1
- package/dist/src/collections/tree/tree.d.ts +18 -1
- package/dist/src/collections/tree/tree.d.ts.map +1 -1
- package/dist/src/collections/tree/tree.js +36 -6
- package/dist/src/collections/tree/tree.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/log/log.d.ts +26 -3
- package/dist/src/log/log.d.ts.map +1 -1
- package/dist/src/log/log.js +34 -7
- package/dist/src/log/log.js.map +1 -1
- package/dist/src/log/struct.d.ts +5 -4
- package/dist/src/log/struct.d.ts.map +1 -1
- package/dist/src/log/struct.js.map +1 -1
- package/dist/src/matchmaking/wire.d.ts +2 -1
- package/dist/src/matchmaking/wire.d.ts.map +1 -1
- package/dist/src/matchmaking/wire.js +13 -92
- package/dist/src/matchmaking/wire.js.map +1 -1
- package/dist/src/network/i-key-network.d.ts +9 -0
- package/dist/src/network/i-key-network.d.ts.map +1 -1
- package/dist/src/network/i-repo.d.ts +8 -0
- package/dist/src/network/i-repo.d.ts.map +1 -1
- package/dist/src/network/struct.d.ts +10 -0
- package/dist/src/network/struct.d.ts.map +1 -1
- package/dist/src/reactivity/push-state.d.ts.map +1 -1
- package/dist/src/reactivity/push-state.js +4 -33
- package/dist/src/reactivity/push-state.js.map +1 -1
- package/dist/src/reactivity/wire-validate.d.ts +7 -22
- package/dist/src/reactivity/wire-validate.d.ts.map +1 -1
- package/dist/src/reactivity/wire-validate.js +7 -73
- package/dist/src/reactivity/wire-validate.js.map +1 -1
- package/dist/src/reactivity/wire.js +3 -3
- package/dist/src/reactivity/wire.js.map +1 -1
- package/dist/src/testing/async-wait.d.ts +23 -0
- package/dist/src/testing/async-wait.d.ts.map +1 -0
- package/dist/src/testing/async-wait.js +42 -0
- package/dist/src/testing/async-wait.js.map +1 -0
- package/dist/src/testing/index.d.ts +3 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js +3 -0
- package/dist/src/testing/index.js.map +1 -0
- package/dist/src/testing/test-transactor.d.ts +44 -0
- package/dist/src/testing/test-transactor.d.ts.map +1 -0
- package/dist/src/testing/test-transactor.js +423 -0
- package/dist/src/testing/test-transactor.js.map +1 -0
- package/dist/src/transaction/actions-engine.d.ts +6 -3
- package/dist/src/transaction/actions-engine.d.ts.map +1 -1
- package/dist/src/transaction/actions-engine.js +8 -7
- package/dist/src/transaction/actions-engine.js.map +1 -1
- package/dist/src/transaction/coordinator.d.ts +43 -22
- package/dist/src/transaction/coordinator.d.ts.map +1 -1
- package/dist/src/transaction/coordinator.js +443 -178
- package/dist/src/transaction/coordinator.js.map +1 -1
- package/dist/src/transaction/errors.d.ts +82 -0
- package/dist/src/transaction/errors.d.ts.map +1 -0
- package/dist/src/transaction/errors.js +93 -0
- package/dist/src/transaction/errors.js.map +1 -0
- package/dist/src/transaction/index.d.ts +6 -3
- package/dist/src/transaction/index.d.ts.map +1 -1
- package/dist/src/transaction/index.js +4 -2
- package/dist/src/transaction/index.js.map +1 -1
- package/dist/src/transaction/operations-hash.d.ts +119 -0
- package/dist/src/transaction/operations-hash.d.ts.map +1 -0
- package/dist/src/transaction/operations-hash.js +180 -0
- package/dist/src/transaction/operations-hash.js.map +1 -0
- package/dist/src/transaction/read-dependency-collector.d.ts +43 -0
- package/dist/src/transaction/read-dependency-collector.d.ts.map +1 -0
- package/dist/src/transaction/read-dependency-collector.js +69 -0
- package/dist/src/transaction/read-dependency-collector.js.map +1 -0
- package/dist/src/transaction/session.d.ts +12 -3
- package/dist/src/transaction/session.d.ts.map +1 -1
- package/dist/src/transaction/session.js +35 -9
- package/dist/src/transaction/session.js.map +1 -1
- package/dist/src/transaction/transaction.d.ts +162 -1
- package/dist/src/transaction/transaction.d.ts.map +1 -1
- package/dist/src/transaction/transaction.js +85 -3
- package/dist/src/transaction/transaction.js.map +1 -1
- package/dist/src/transaction/validator.d.ts +3 -11
- package/dist/src/transaction/validator.d.ts.map +1 -1
- package/dist/src/transaction/validator.js +69 -28
- package/dist/src/transaction/validator.js.map +1 -1
- package/dist/src/transactor/network-transactor.d.ts +35 -0
- package/dist/src/transactor/network-transactor.d.ts.map +1 -1
- package/dist/src/transactor/network-transactor.js +146 -40
- package/dist/src/transactor/network-transactor.js.map +1 -1
- package/dist/src/transactor/transactor-source.d.ts +19 -5
- package/dist/src/transactor/transactor-source.d.ts.map +1 -1
- package/dist/src/transactor/transactor-source.js +43 -11
- package/dist/src/transactor/transactor-source.js.map +1 -1
- package/dist/src/transform/atomic-proxy.d.ts +35 -5
- package/dist/src/transform/atomic-proxy.d.ts.map +1 -1
- package/dist/src/transform/atomic-proxy.js +39 -7
- package/dist/src/transform/atomic-proxy.js.map +1 -1
- package/dist/src/transform/cache-source.d.ts +36 -5
- package/dist/src/transform/cache-source.d.ts.map +1 -1
- package/dist/src/transform/cache-source.js +84 -8
- package/dist/src/transform/cache-source.js.map +1 -1
- package/dist/src/transform/helpers.d.ts.map +1 -1
- package/dist/src/transform/helpers.js +8 -2
- package/dist/src/transform/helpers.js.map +1 -1
- package/dist/src/transform/tracker.d.ts +17 -2
- package/dist/src/transform/tracker.d.ts.map +1 -1
- package/dist/src/transform/tracker.js +66 -11
- package/dist/src/transform/tracker.js.map +1 -1
- package/dist/src/utility/backoff.d.ts +48 -0
- package/dist/src/utility/backoff.d.ts.map +1 -0
- package/dist/src/utility/backoff.js +60 -0
- package/dist/src/utility/backoff.js.map +1 -0
- package/dist/src/utility/pending.d.ts +1 -0
- package/dist/src/utility/pending.d.ts.map +1 -1
- package/dist/src/utility/pending.js +3 -1
- package/dist/src/utility/pending.js.map +1 -1
- package/package.json +4 -4
- package/src/blocks/block-store.ts +19 -1
- package/src/blocks/helpers.ts +3 -3
- package/src/btree/btree.ts +108 -63
- package/src/chain/chain.ts +11 -1
- package/src/cluster/index.ts +1 -0
- package/src/cluster/membership.ts +85 -0
- package/src/cluster/structs.ts +51 -1
- package/src/cohort-topic/addressing.ts +12 -4
- package/src/cohort-topic/antidos/bootstrap-evidence.ts +21 -9
- package/src/cohort-topic/antidos/replay-guard.ts +37 -0
- package/src/cohort-topic/antidos/topic-budget.ts +17 -2
- package/src/cohort-topic/coldstart.ts +48 -15
- package/src/cohort-topic/gossip/bus.ts +39 -2
- package/src/cohort-topic/gossip/view.ts +26 -1
- package/src/cohort-topic/member-engine.ts +36 -15
- package/src/cohort-topic/membership/publisher.ts +25 -33
- package/src/cohort-topic/membership/verifier.ts +119 -3
- package/src/cohort-topic/promotion.ts +23 -2
- package/src/cohort-topic/registration/renewal.ts +73 -1
- package/src/cohort-topic/registration/types.ts +15 -0
- package/src/cohort-topic/service.ts +41 -15
- package/src/cohort-topic/sig/payloads.ts +29 -9
- package/src/cohort-topic/traffic.ts +23 -1
- package/src/cohort-topic/walk.ts +95 -24
- package/src/cohort-topic/wire/codec.ts +12 -0
- package/src/cohort-topic/wire/index.ts +2 -0
- package/src/cohort-topic/wire/payloads.ts +14 -5
- package/src/cohort-topic/wire/primitives.ts +188 -0
- package/src/cohort-topic/wire/types.ts +136 -4
- package/src/cohort-topic/wire/validate.ts +168 -134
- package/src/collection/collection.ts +123 -40
- package/src/collection/struct.ts +44 -2
- package/src/collections/tree/tree.ts +42 -5
- package/src/index.ts +1 -0
- package/src/log/log.ts +37 -9
- package/src/log/struct.ts +5 -4
- package/src/matchmaking/wire.ts +25 -102
- package/src/network/i-key-network.ts +10 -0
- package/src/network/i-repo.ts +8 -0
- package/src/network/struct.ts +10 -0
- package/src/reactivity/push-state.ts +4 -37
- package/src/reactivity/wire-validate.ts +7 -81
- package/src/reactivity/wire.ts +3 -3
- package/src/testing/async-wait.ts +65 -0
- package/src/testing/index.ts +2 -0
- package/src/testing/test-transactor.ts +468 -0
- package/src/transaction/actions-engine.ts +8 -6
- package/src/transaction/coordinator.ts +498 -229
- package/src/transaction/errors.ts +91 -0
- package/src/transaction/index.ts +23 -3
- package/src/transaction/operations-hash.ts +196 -0
- package/src/transaction/read-dependency-collector.ts +78 -0
- package/src/transaction/session.ts +37 -9
- package/src/transaction/transaction.ts +211 -4
- package/src/transaction/validator.ts +73 -48
- package/src/transactor/network-transactor.ts +164 -49
- package/src/transactor/transactor-source.ts +47 -12
- package/src/transform/atomic-proxy.ts +92 -49
- package/src/transform/cache-source.ts +87 -9
- package/src/transform/helpers.ts +8 -2
- package/src/transform/tracker.ts +69 -11
- package/src/utility/backoff.ts +95 -0
- package/src/utility/pending.ts +3 -1
- package/src/transaction/context.ts +0 -103
|
@@ -48,19 +48,50 @@ import { b64urlToBytes, bytesToB64url, decodeMembershipCertV1 } from "../wire/co
|
|
|
48
48
|
import { CohortWireError } from "../wire/validate.js";
|
|
49
49
|
import { DEFAULT_MIN_SIGS } from "../sig/threshold.js";
|
|
50
50
|
import { membershipCertSigningPayload } from "../sig/payloads.js";
|
|
51
|
+
import { LruMap } from "../../utility/lru-map.js";
|
|
52
|
+
/**
|
|
53
|
+
* Default hard cap on distinct coords the verifier's per-coord maps retain (`byCoord`, `lastFetchAt`,
|
|
54
|
+
* `staleGapStrikes`). Beyond it the least-recently-used coord is evicted — bounding memory under a flood
|
|
55
|
+
* of verify-misses against attacker-chosen coords. Same 100k ballpark as the sibling anti-DoS caps
|
|
56
|
+
* ({@link import("../antidos/replay-guard.js").DEFAULT_REPLAY_GUARD_MAX_KEYS}).
|
|
57
|
+
*/
|
|
58
|
+
export const DEFAULT_MEMBERSHIP_VERIFIER_MAX_COORDS = 100_000;
|
|
51
59
|
class CachingMembershipVerifier {
|
|
52
60
|
deps;
|
|
53
|
-
|
|
61
|
+
// LRU-capped so a flood of verify-misses against attacker-chosen coords cannot grow these maps without
|
|
62
|
+
// bound (coordKey is base64url of an attacker-derivable RingCoord). Each is capped INDEPENDENTLY: the
|
|
63
|
+
// aux maps may briefly retain a coord `byCoord` already evicted — harmless (a stale `lastFetchAt` at
|
|
64
|
+
// worst permits one extra refetch; a stale strike count is itself bounded).
|
|
65
|
+
// NOTE: `byCoord` also holds this node's OWN `cache()`-published trusted cert (the trust lock). Under an
|
|
66
|
+
// attacker-coord flood the LRU can evict a trusted self-published entry, re-opening that coord to TOFU on
|
|
67
|
+
// next sight — the trust lock is best-effort under memory pressure. This mirrors the documented penalty
|
|
68
|
+
// tradeoff on the replay-guard cap and is acceptable; do not file it as a separate ticket.
|
|
69
|
+
byCoord;
|
|
54
70
|
/** Per-coord timestamp of the last `source.fetch()` attempt (the rate-limit clock for {@link RefetchBound}). */
|
|
55
|
-
lastFetchAt
|
|
71
|
+
lastFetchAt;
|
|
72
|
+
/**
|
|
73
|
+
* Per-coord count of *consecutive* gap-signalled refetches against a trust-locked coord (base64url key).
|
|
74
|
+
* Reset to zero whenever a message verifies for the coord (see {@link verifyMessage}); at
|
|
75
|
+
* {@link staleGapRecoveryStrikes} the lock is released back to TOFU (see {@link staleGapRecovery}).
|
|
76
|
+
*/
|
|
77
|
+
staleGapStrikes;
|
|
56
78
|
minSigs;
|
|
57
79
|
anchor;
|
|
58
80
|
trustRoots;
|
|
81
|
+
staleGapRecoveryStrikes;
|
|
59
82
|
constructor(deps) {
|
|
60
83
|
this.deps = deps;
|
|
61
84
|
this.minSigs = deps.minSigs ?? DEFAULT_MIN_SIGS;
|
|
62
85
|
this.anchor = deps.anchor ?? noAuthorityTrustAnchor;
|
|
63
86
|
this.trustRoots = (deps.trustRoots ?? []).map(normalizeTrustRoot);
|
|
87
|
+
this.staleGapRecoveryStrikes = deps.staleGapRecoveryStrikes ?? 3;
|
|
88
|
+
const maxCoords = deps.maxCoords ?? DEFAULT_MEMBERSHIP_VERIFIER_MAX_COORDS;
|
|
89
|
+
if (!Number.isInteger(maxCoords) || maxCoords <= 0) {
|
|
90
|
+
throw new RangeError(`maxCoords must be a positive integer, got ${maxCoords}`);
|
|
91
|
+
}
|
|
92
|
+
this.byCoord = new LruMap(maxCoords);
|
|
93
|
+
this.lastFetchAt = new LruMap(maxCoords);
|
|
94
|
+
this.staleGapStrikes = new LruMap(maxCoords);
|
|
64
95
|
}
|
|
65
96
|
cache(cert) {
|
|
66
97
|
// The public cache feeds this node its OWN freshly-published cert — a node trusts a cert it itself
|
|
@@ -77,6 +108,7 @@ class CachingMembershipVerifier {
|
|
|
77
108
|
cert = await this.loadFrom(source.current(expectedCoord), tier);
|
|
78
109
|
}
|
|
79
110
|
if (cert !== undefined && this.messageVerifies(cert, signers, payload, sig)) {
|
|
111
|
+
this.staleGapStrikes.delete(coordKey); // a verify resets the consecutive stale-gap strike count
|
|
80
112
|
return "verified";
|
|
81
113
|
}
|
|
82
114
|
// Single fetch-and-retry: a stale or missing cert forces a network refresh. A flood-exposed caller
|
|
@@ -89,6 +121,7 @@ class CachingMembershipVerifier {
|
|
|
89
121
|
}
|
|
90
122
|
const refreshed = await this.loadFrom(source.fetch(expectedCoord), tier);
|
|
91
123
|
if (refreshed !== undefined && this.messageVerifies(refreshed, signers, payload, sig)) {
|
|
124
|
+
this.staleGapStrikes.delete(coordKey); // a verify resets the consecutive stale-gap strike count
|
|
92
125
|
return "verified";
|
|
93
126
|
}
|
|
94
127
|
return "untrusted";
|
|
@@ -167,7 +200,59 @@ class CachingMembershipVerifier {
|
|
|
167
200
|
if (this.hasRotationAttestation(cert) && this.chainGrantsTrust(cert)) {
|
|
168
201
|
return "trusted";
|
|
169
202
|
}
|
|
170
|
-
|
|
203
|
+
const fallback = this.fallbackTrust(cert);
|
|
204
|
+
if (fallback !== "reject") {
|
|
205
|
+
return fallback; // first-use TOFU (coord not locked): no stale lock to recover from
|
|
206
|
+
}
|
|
207
|
+
// fallback === "reject" ⟺ the coord is trust-locked (holds a *trusted* cert) and this un-anchored cert
|
|
208
|
+
// did not chain-verify — the state that strands a former cohort member forever. Consult the stale-gap
|
|
209
|
+
// recovery counter, which releases the lock only on a demonstrated chain gap (never a forged rotation
|
|
210
|
+
// off the current predecessor). See {@link staleGapRecovery}.
|
|
211
|
+
return this.staleGapRecovery(cert);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Bounded re-TOFU recovery for a coord that is **trust-locked at a stale epoch it can no longer anchor**.
|
|
215
|
+
* Reached from {@link certIsTrusted} only when the coord already holds a *trusted* cached cert (locked),
|
|
216
|
+
* the direct anchor said `"unknown"`, and `cert` did not chain-verify — i.e. {@link fallbackTrust} would
|
|
217
|
+
* otherwise reject it forever. Runs on the *refetch* load only: a locked coord always holds a cached cert,
|
|
218
|
+
* so `verifyMessage` never routes it through the `source.current()` seed path, and the strike logic keys on
|
|
219
|
+
* "coord is locked", so `current()` never accrues a strike.
|
|
220
|
+
*
|
|
221
|
+
* NOTE: recovery fires **only** on a demonstrated chain gap — a full rotation attestation whose
|
|
222
|
+
* `prevEpoch ≠` the cached trusted epoch (proof the network rotated past the cached epoch through at least
|
|
223
|
+
* one epoch this node never witnessed). A forged rotation off the *current* cached predecessor
|
|
224
|
+
* (`prevEpoch == cachedEpoch`) is NOT a gap, never counts as a strike, and stays rejected no matter how
|
|
225
|
+
* often it is presented — that is the lock's headline invariant. After
|
|
226
|
+
* {@link staleGapRecoveryStrikes} *consecutive* gap-signalled strikes the lock is released back to TOFU
|
|
227
|
+
* (returns `"tofu"`, so {@link loadFrom} re-caches the cert as **untrusted** — a re-TOFU'd cert must never
|
|
228
|
+
* launder trust into a rotation), which is no weaker than the documented TOFU baseline: a former member
|
|
229
|
+
* returns to the same regime a never-member is already in. Strikes accrue only on refetches that actually
|
|
230
|
+
* reach the source, so a {@link RefetchBound}-suppressed refetch observes no cert and recovery paces itself
|
|
231
|
+
* with the (bounded) refetch rate — intended, do not "fix" that pacing.
|
|
232
|
+
*/
|
|
233
|
+
staleGapRecovery(cert) {
|
|
234
|
+
const coordKey = cert.cohortCoord;
|
|
235
|
+
const locked = this.byCoord.get(coordKey);
|
|
236
|
+
// Recovery-eligible only on an explicit rotation gap: a full attestation whose prevEpoch is neither the
|
|
237
|
+
// cert's own epoch (a self-referential rotation) nor the cached trusted epoch (a forgery off the current
|
|
238
|
+
// predecessor — the case the lock exists to reject).
|
|
239
|
+
const isGap = this.staleGapRecoveryStrikes > 0 &&
|
|
240
|
+
locked !== undefined &&
|
|
241
|
+
this.hasRotationAttestation(cert) &&
|
|
242
|
+
cert.prevEpoch !== cert.cohortEpoch &&
|
|
243
|
+
cert.prevEpoch !== locked.cert.cohortEpoch;
|
|
244
|
+
if (!isGap) {
|
|
245
|
+
return "reject"; // not a recovery-eligible gap → stay locked, exactly as before
|
|
246
|
+
}
|
|
247
|
+
const strikes = (this.staleGapStrikes.get(coordKey) ?? 0) + 1;
|
|
248
|
+
if (strikes < this.staleGapRecoveryStrikes) {
|
|
249
|
+
this.staleGapStrikes.set(coordKey, strikes);
|
|
250
|
+
return "reject"; // below threshold: keep rejecting; the inbound message stays untrusted
|
|
251
|
+
}
|
|
252
|
+
// Threshold reached: release the lock. `loadFrom` re-caches this cert as untrusted (`trusted: false`),
|
|
253
|
+
// and the message-verify retry runs against it, so the inbound later-epoch message finally verifies.
|
|
254
|
+
this.staleGapStrikes.delete(coordKey);
|
|
255
|
+
return "tofu";
|
|
171
256
|
}
|
|
172
257
|
/**
|
|
173
258
|
* The interim fallback for a coord with no trust-root / anchor / chain coverage. Trust-on-first-use:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../../../src/cohort-topic/membership/verifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAqB,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../../../src/cohort-topic/membership/verifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -90,6 +90,13 @@ export interface PromotionDeps {
|
|
|
90
90
|
treeTier: (topicId: Uint8Array) => number;
|
|
91
91
|
/** The tier-`(d − 1)` parent cohort coord, target of a {@link DemotionNoticeV1}. */
|
|
92
92
|
parentCoord: (topicId: Uint8Array) => Uint8Array;
|
|
93
|
+
/**
|
|
94
|
+
* The served coord `coord_d(participantCoord, topicId)` this cohort sits at (raw bytes) — stamped on
|
|
95
|
+
* every notice as `cohortCoord` and covered by its threshold signature, so a receiver routes the notice
|
|
96
|
+
* to exactly this cohort's engine and verifies it against exactly this cohort's cert. Constant for the
|
|
97
|
+
* engine's lifetime (the engine is instantiated at one served coord).
|
|
98
|
+
*/
|
|
99
|
+
cohortCoord: () => Uint8Array;
|
|
93
100
|
/** Cohort epoch (raw bytes) the notices are signed under. */
|
|
94
101
|
cohortEpoch: () => Uint8Array;
|
|
95
102
|
/** Threshold signer (the gossip ticket's `k − x` cohort signer). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promotion.d.ts","sourceRoot":"","sources":["../../../src/cohort-topic/promotion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAKjE,+CAA+C;AAC/C,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,yEAAyE;AACzE,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,2EAA2E;AAC3E,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,mEAAmE;AACnE,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB,SAAU,CAAC;AAC3C,0CAA0C;AAC1C,eAAO,MAAM,8BAA8B,QAAS,CAAC;AACrD,4FAA4F;AAC5F,eAAO,MAAM,2BAA2B,QAAS,CAAC;AAClD;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AA2BD,MAAM,WAAW,aAAa;IAC7B,+FAA+F;IAC/F,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,CAAC;IACrD;;;OAGG;IACH,UAAU,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,MAAM,CAAC;IAC5C,gFAAgF;IAChF,gBAAgB,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,MAAM,CAAC;IAClD,gGAAgG;IAChG,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,MAAM,CAAC;IAC1C,oFAAoF;IACpF,WAAW,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,UAAU,CAAC;IACjD,6DAA6D;IAC7D,WAAW,EAAE,MAAM,UAAU,CAAC;IAC9B,oEAAoE;IACpE,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,eAAe,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IAClC;;;;;OAKG;IACH,wBAAwB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAC;IACnG;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;IACrF,+FAA+F;IAC/F,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC;IACzC;;;;;;OAMG;IACH,oBAAoB,CAAC,CAAC,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9D;;;;OAIG;IACH,mBAAmB,CAAC,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5D;
|
|
1
|
+
{"version":3,"file":"promotion.d.ts","sourceRoot":"","sources":["../../../src/cohort-topic/promotion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAKjE,+CAA+C;AAC/C,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,yEAAyE;AACzE,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,2EAA2E;AAC3E,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,mEAAmE;AACnE,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB,SAAU,CAAC;AAC3C,0CAA0C;AAC1C,eAAO,MAAM,8BAA8B,QAAS,CAAC;AACrD,4FAA4F;AAC5F,eAAO,MAAM,2BAA2B,QAAS,CAAC;AAClD;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AA2BD,MAAM,WAAW,aAAa;IAC7B,+FAA+F;IAC/F,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,CAAC;IACrD;;;OAGG;IACH,UAAU,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,MAAM,CAAC;IAC5C,gFAAgF;IAChF,gBAAgB,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,MAAM,CAAC;IAClD,gGAAgG;IAChG,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,MAAM,CAAC;IAC1C,oFAAoF;IACpF,WAAW,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,UAAU,CAAC;IACjD;;;;;OAKG;IACH,WAAW,EAAE,MAAM,UAAU,CAAC;IAC9B,6DAA6D;IAC7D,WAAW,EAAE,MAAM,UAAU,CAAC;IAC9B,oEAAoE;IACpE,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,eAAe,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IAClC;;;;;OAKG;IACH,wBAAwB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAC;IACnG;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;IACrF,+FAA+F;IAC/F,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC;IACzC;;;;;;OAMG;IACH,oBAAoB,CAAC,CAAC,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9D;;;;OAIG;IACH,mBAAmB,CAAC,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5D;AAoOD,kGAAkG;AAClG,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,kBAAkB,CAEhF"}
|
|
@@ -172,9 +172,13 @@ class CohortPromotionLifecycle {
|
|
|
172
172
|
}
|
|
173
173
|
async promote(topicId, state, now) {
|
|
174
174
|
const fromTier = this.deps.treeTier(topicId);
|
|
175
|
+
// NOTE: no guard here against fromTier === DEFAULT_D_MAX_CAP (60). At that depth toTier = 61 exceeds the
|
|
176
|
+
// tree-tier ceiling, so validatePromotionNoticeV1 rejects the notice on every receiver. Unreachable today
|
|
177
|
+
// (tree tier 60 is pathological); if the tree can ever reach the cap, gate promotion below the cap here.
|
|
175
178
|
const topicB64 = bytesToB64url(topicId);
|
|
176
179
|
const epochB64 = bytesToB64url(this.deps.cohortEpoch());
|
|
177
|
-
const
|
|
180
|
+
const cohortB64 = bytesToB64url(this.deps.cohortCoord());
|
|
181
|
+
const signable = { topicId: topicB64, fromTier, toTier: fromTier + 1, effectiveAt: now, cohortEpoch: epochB64, cohortCoord: cohortB64 };
|
|
178
182
|
const { thresholdSig, signers } = await this.deps.signer.thresholdSign(promotionNoticeSigningPayload(signable));
|
|
179
183
|
state.promoted = true;
|
|
180
184
|
state.promotedAt = now;
|
|
@@ -184,6 +188,7 @@ class CohortPromotionLifecycle {
|
|
|
184
188
|
topicId: topicB64,
|
|
185
189
|
fromTier,
|
|
186
190
|
toTier: fromTier + 1,
|
|
191
|
+
cohortCoord: cohortB64,
|
|
187
192
|
effectiveAt: now,
|
|
188
193
|
thresholdSig: bytesToB64url(thresholdSig),
|
|
189
194
|
signers: signers.map(bytesToB64url),
|
|
@@ -217,10 +222,18 @@ class CohortPromotionLifecycle {
|
|
|
217
222
|
const topicB64 = bytesToB64url(topicId);
|
|
218
223
|
const epochB64 = bytesToB64url(this.deps.cohortEpoch());
|
|
219
224
|
const parentB64 = bytesToB64url(this.deps.parentCoord(topicId));
|
|
220
|
-
const
|
|
225
|
+
const cohortB64 = bytesToB64url(this.deps.cohortCoord());
|
|
226
|
+
const signable = { topicId: topicB64, tier, parentCohortCoord: parentB64, effectiveAt: now, cohortEpoch: epochB64, cohortCoord: cohortB64 };
|
|
221
227
|
const { thresholdSig, signers } = await this.deps.signer.thresholdSign(demotionNoticeSigningPayload(signable));
|
|
222
228
|
// Release forwarder state: a demoted cohort leaves promoted mode and resets its clocks so a
|
|
223
229
|
// later re-growth re-evaluates cleanly.
|
|
230
|
+
// NOTE: demotion currently resets only the promoted-bounce clocks; it does NOT stop the node serving
|
|
231
|
+
// the topic — the cold-start forwarder, the direct-participant records, and the budget slot all stay,
|
|
232
|
+
// and the cohort keeps serving at tier d. If demotion is ever made to actually collapse local tier
|
|
233
|
+
// state, it must reassign or drain the topic's records FIRST, then `coldStart.remove` + release the
|
|
234
|
+
// budget slot + `traffic.forget`, in that order — removing the forwarder while records remain re-creates
|
|
235
|
+
// the off-budget-serving drift fixed in `cohort-topic-coldstart-forwarder-reconcile` (the budget stops
|
|
236
|
+
// bounding the served-topic set). The eviction path already reconciles all three via `TopicBudget.onEvict`.
|
|
224
237
|
state.promoted = false;
|
|
225
238
|
state.promotedAt = undefined;
|
|
226
239
|
state.lowLoadSince = undefined;
|
|
@@ -230,6 +243,7 @@ class CohortPromotionLifecycle {
|
|
|
230
243
|
topicId: topicB64,
|
|
231
244
|
tier,
|
|
232
245
|
parentCohortCoord: parentB64,
|
|
246
|
+
cohortCoord: cohortB64,
|
|
233
247
|
effectiveAt: now,
|
|
234
248
|
thresholdSig: bytesToB64url(thresholdSig),
|
|
235
249
|
signers: signers.map(bytesToB64url),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promotion.js","sourceRoot":"","sources":["../../../src/cohort-topic/promotion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE/D,OAAO,EAAE,4BAA4B,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAGhG,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,8EAA8E;AAE9E,+CAA+C;AAC/C,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AACtC,yEAAyE;AACzE,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAC3C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,mEAAmE;AACnE,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AACrC,+EAA+E;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAC3C,0CAA0C;AAC1C,MAAM,CAAC,MAAM,8BAA8B,GAAG,MAAM,CAAC;AACrD,4FAA4F;AAC5F,MAAM,CAAC,MAAM,2BAA2B,GAAG,MAAM,CAAC;AAClD;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"promotion.js","sourceRoot":"","sources":["../../../src/cohort-topic/promotion.ts"],"names":[],"mappings":"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"}
|
|
@@ -102,6 +102,24 @@ export interface RenewalCohortSideDeps {
|
|
|
102
102
|
* only touch `lastPing`).
|
|
103
103
|
*/
|
|
104
104
|
verifyParticipantSig?: (renew: RenewV1) => boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Optional freshness window for the two privileged, participant-attested paths (`withdraw` eviction and
|
|
107
|
+
* `reattach` promotion). The renew signature already binds `timestamp` (see
|
|
108
|
+
* {@link import("../wire/payloads.js").renewSigningPayload}), so an attacker cannot forge a fresher
|
|
109
|
+
* timestamp onto a captured frame — replay is exact-frame only. A timestamp gate is therefore a
|
|
110
|
+
* complete freshness regime for these frames: it rejects a stale/implausibly-future `timestamp`, and a
|
|
111
|
+
* per-record monotonic check (`timestamp <= rec.lastPing`) closes the sub-`maxAge` fast-replay window
|
|
112
|
+
* using state already on the record. Defaults to the register-path skew constants
|
|
113
|
+
* ({@link DEFAULT_REPLAY_MAX_AGE_MS} / {@link DEFAULT_REPLAY_MAX_FUTURE_SKEW_MS}); db-p2p wires the same
|
|
114
|
+
* `{ maxAgeMs, maxFutureSkewMs }` config the register path's replay guard consumes so an operator tuning
|
|
115
|
+
* the skew window moves both paths together. Absent → defaults (key-less unit tests and callers work
|
|
116
|
+
* unchanged, matching how {@link verifyParticipantSig} is optional). Plain pings are NOT gated (a
|
|
117
|
+
* replayed ping is low-harm — it only re-touches `lastPing`).
|
|
118
|
+
*/
|
|
119
|
+
freshness?: {
|
|
120
|
+
maxAgeMs?: number;
|
|
121
|
+
maxFutureSkewMs?: number;
|
|
122
|
+
};
|
|
105
123
|
}
|
|
106
124
|
/** Cohort-side TTL handling: touch on renew, redirect on rotation, sweep stale records. */
|
|
107
125
|
export interface RenewalCohortSide {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renewal.d.ts","sourceRoot":"","sources":["../../../../src/cohort-topic/registration/renewal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;
|
|
1
|
+
{"version":3,"file":"renewal.d.ts","sourceRoot":"","sources":["../../../../src/cohort-topic/registration/renewal.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
* Both sides take their transport/gossip by injection so storage + sharding + TTL stay unit-testable
|
|
20
20
|
* in isolation; db-core never imports FRET or libp2p here.
|
|
21
21
|
*/
|
|
22
|
+
import { DEFAULT_REPLAY_MAX_AGE_MS, DEFAULT_REPLAY_MAX_FUTURE_SKEW_MS } from "../antidos/replay-guard.js";
|
|
22
23
|
import { b64urlToBytes } from "../wire/codec.js";
|
|
23
24
|
import { bytesEqual, bytesKey, recordKey } from "./bytes.js";
|
|
24
25
|
import { MAX_PING_FAILURES, pingIntervalMs } from "./types.js";
|
|
@@ -190,8 +191,43 @@ class StoreRenewalCohortSide {
|
|
|
190
191
|
* `isServing` dual-serve exception — distinct state, OR-ed into the serve decision.
|
|
191
192
|
*/
|
|
192
193
|
failoverServing = new Map();
|
|
194
|
+
/** Resolved staleness window / forward-skew tolerance for the privileged freshness gate. */
|
|
195
|
+
maxAgeMs;
|
|
196
|
+
maxFutureSkewMs;
|
|
193
197
|
constructor(deps) {
|
|
194
198
|
this.deps = deps;
|
|
199
|
+
this.maxAgeMs = deps.freshness?.maxAgeMs ?? DEFAULT_REPLAY_MAX_AGE_MS;
|
|
200
|
+
this.maxFutureSkewMs = deps.freshness?.maxFutureSkewMs ?? DEFAULT_REPLAY_MAX_FUTURE_SKEW_MS;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Freshness gate for the two privileged, participant-attested branches (`withdraw`, `reattach`). Returns
|
|
204
|
+
* `false` — reject — when `msg.timestamp` is stale (older than `now − maxAgeMs`), implausibly future
|
|
205
|
+
* (newer than `now + maxFutureSkewMs`), or not strictly newer than the record's `lastPing`. The signed
|
|
206
|
+
* timestamp is immutable to a replayer, so this fully bounds a captured privileged frame: the skew
|
|
207
|
+
* window catches an old capture, and the `<= rec.lastPing` monotonic check catches a fast replay that
|
|
208
|
+
* still fits inside the window (e.g. a `withdraw` captured at `t0` replayed after the record was
|
|
209
|
+
* re-registered at `t_reregister > t0`, or a `reattach` replayed after its own accepted re-stamp
|
|
210
|
+
* already advanced `lastPing`).
|
|
211
|
+
*/
|
|
212
|
+
isFreshPrivileged(msg, rec, now) {
|
|
213
|
+
if (msg.timestamp < now - this.maxAgeMs) {
|
|
214
|
+
return false; // stale
|
|
215
|
+
}
|
|
216
|
+
if (msg.timestamp > now + this.maxFutureSkewMs) {
|
|
217
|
+
return false; // implausibly future
|
|
218
|
+
}
|
|
219
|
+
// NOTE: condition (3) compares a participant-supplied `msg.timestamp` against a server-maintained
|
|
220
|
+
// `rec.lastPing` (set from whichever cohort member last touched the record, using its own clock) — two
|
|
221
|
+
// different machines' clocks. In normal operation a genuine leave/failover post-dates the last ping, so
|
|
222
|
+
// `timestamp > lastPing` holds. If a participant's clock lags the server that set `lastPing`, a
|
|
223
|
+
// legitimate reattach can be rejected; the failure is soft (returns `primary_moved`, so the failover
|
|
224
|
+
// loop tries the next backup / re-runs the d_max lookup — a delayed failover, not data loss). If
|
|
225
|
+
// cross-node skew is ever observed to stall failovers, relax (3) to strict `<` (accept `timestamp ==
|
|
226
|
+
// lastPing`); the `maxAge` window still backstops the replay-after-re-registration attack.
|
|
227
|
+
if (msg.timestamp <= rec.lastPing) {
|
|
228
|
+
return false; // replay / non-monotonic against the live record
|
|
229
|
+
}
|
|
230
|
+
return true;
|
|
195
231
|
}
|
|
196
232
|
onRenew(msg, now) {
|
|
197
233
|
const topicId = b64(msg.topicId);
|
|
@@ -211,6 +247,13 @@ class StoreRenewalCohortSide {
|
|
|
211
247
|
if (this.deps.verifyParticipantSig?.(msg) === false) {
|
|
212
248
|
return { v: 1, result: "unknown_registration" };
|
|
213
249
|
}
|
|
250
|
+
// Freshness gate: a signed withdraw is valid forever without this, so a captured one could be
|
|
251
|
+
// replayed after the victim's record TTL-expires and re-registers, evicting the *fresh* record.
|
|
252
|
+
// Reject a stale/replayed frame with the same opaque `unknown_registration` the forged-sig branch
|
|
253
|
+
// returns above — indistinguishable from an untrusted frame — and never delete.
|
|
254
|
+
if (!this.isFreshPrivileged(msg, rec, now)) {
|
|
255
|
+
return { v: 1, result: "unknown_registration" };
|
|
256
|
+
}
|
|
214
257
|
this.deps.store.delete(topicId, participantId);
|
|
215
258
|
this.failoverServing.delete(key); // mirror sweepStale: drop any crash-failover override
|
|
216
259
|
this.deps.gossip.evicted(rec);
|
|
@@ -226,6 +269,12 @@ class StoreRenewalCohortSide {
|
|
|
226
269
|
if (this.deps.verifyParticipantSig?.(msg) === false) {
|
|
227
270
|
return this.primaryMoved(primary, backups, cohortEpoch);
|
|
228
271
|
}
|
|
272
|
+
// Freshness gate: a signed reattach is valid forever without this, so a captured one could be
|
|
273
|
+
// replayed to force bogus primary re-stamps. Reject a stale/replayed frame with the same redirect
|
|
274
|
+
// the forged-sig branch returns above — revealing nothing — and never promote.
|
|
275
|
+
if (!this.isFreshPrivileged(msg, rec, now)) {
|
|
276
|
+
return this.primaryMoved(primary, backups, cohortEpoch);
|
|
277
|
+
}
|
|
229
278
|
if (bytesEqual(primary, self)) {
|
|
230
279
|
// A rotation already made this member the computed primary; serve, no override needed.
|
|
231
280
|
return this.touchAndServe(rec, now);
|
|
@@ -252,6 +301,11 @@ class StoreRenewalCohortSide {
|
|
|
252
301
|
return this.primaryMoved(primary, backups, cohortEpoch);
|
|
253
302
|
}
|
|
254
303
|
// Plain ping.
|
|
304
|
+
// NOTE: plain pings are deliberately NOT run through the privileged freshness gate (isFreshPrivileged).
|
|
305
|
+
// A replayed ping is low-harm — it can only re-touch a record's `lastPing`, never delete or usurp — and
|
|
306
|
+
// the strict `timestamp <= lastPing` monotonic check would risk rejecting a legitimate ping that arrives
|
|
307
|
+
// slightly out of order or under minor participant-clock non-monotonicity. If plain-ping replay ever
|
|
308
|
+
// becomes a concern (e.g. touch-driven traffic accounting is abused), gate it here too.
|
|
255
309
|
const isComputedPrimary = bytesEqual(primary, self);
|
|
256
310
|
const override = this.failoverServing.get(key);
|
|
257
311
|
const overrideMatches = override !== undefined && bytesEqual(override, cohortEpoch);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renewal.js","sourceRoot":"","sources":["../../../../src/cohort-topic/registration/renewal.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"renewal.js","sourceRoot":"","sources":["../../../../src/cohort-topic/registration/renewal.ts"],"names":[],"mappings":"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"}
|
|
@@ -64,8 +64,20 @@ export interface RegistrationStore {
|
|
|
64
64
|
export declare const DEFAULT_TTL_MS = 90000;
|
|
65
65
|
/** Edge-tier default registration TTL (ms). */
|
|
66
66
|
export declare const EDGE_TTL_MS = 60000;
|
|
67
|
+
/** Minimum accepted registration TTL (ms). Requests below this are clamped up. */
|
|
68
|
+
export declare const MIN_TTL_MS = 10000;
|
|
69
|
+
/** Maximum accepted registration TTL (ms). Requests above this are clamped down.
|
|
70
|
+
* 10 × DEFAULT_TTL_MS keeps the window predictable; prevents a wedged budget slot from a poison TTL. */
|
|
71
|
+
export declare const MAX_TTL_MS: number;
|
|
67
72
|
/** Consecutive ping failures before a participant promotes `backups[0]`. */
|
|
68
73
|
export declare const MAX_PING_FAILURES = 3;
|
|
74
|
+
/**
|
|
75
|
+
* Clamp a requested or replicated TTL into the accepted `[MIN_TTL_MS, MAX_TTL_MS]` window.
|
|
76
|
+
* Non-positive input falls to {@link DEFAULT_TTL_MS} first. This is the single TTL policy gate:
|
|
77
|
+
* both local admission (`accept()`) and gossip replication (`mergeRecords`) run every TTL through
|
|
78
|
+
* it, so no store — local or replica — can ever hold a record whose lifetime dodges the cap.
|
|
79
|
+
*/
|
|
80
|
+
export declare function clampTtl(ttl: number): number;
|
|
69
81
|
/** `ping_interval = ttl / 3` (default 30s Core, 20s Edge), floored to whole ms. */
|
|
70
82
|
export declare function pingIntervalMs(ttl: number): number;
|
|
71
83
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/cohort-topic/registration/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IAClC,0BAA0B;IAC1B,OAAO,EAAE,UAAU,CAAC;IACpB,+BAA+B;IAC/B,aAAa,EAAE,UAAU,CAAC;IAC1B,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,OAAO,EAAE,UAAU,CAAC;IACpB,yCAAyC;IACzC,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,GAAG,EAAE,MAAM,CAAC;IACZ,wFAAwF;IACxF,QAAQ,CAAC,EAAE,UAAU,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IACjC,mEAAmE;IACnE,GAAG,CAAC,GAAG,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACnC,6DAA6D;IAC7D,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,GAAG,kBAAkB,GAAG,SAAS,CAAC;IACjG,sDAAsD;IACtD,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,kBAAkB,EAAE,CAAC;IAChE,oFAAoF;IACpF,OAAO,IAAI,SAAS,kBAAkB,EAAE,CAAC;IACzC,wDAAwD;IACxD,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,GAAG,IAAI,CAAC;IAC7D,2EAA2E;IAC3E,kBAAkB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAAC;IAChD,mEAAmE;IACnE,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,kBAAkB,EAAE,CAAC;CACvD;AAED,+CAA+C;AAC/C,eAAO,MAAM,cAAc,QAAS,CAAC;AACrC,+CAA+C;AAC/C,eAAO,MAAM,WAAW,QAAS,CAAC;AAClC,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAElD"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/cohort-topic/registration/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IAClC,0BAA0B;IAC1B,OAAO,EAAE,UAAU,CAAC;IACpB,+BAA+B;IAC/B,aAAa,EAAE,UAAU,CAAC;IAC1B,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,OAAO,EAAE,UAAU,CAAC;IACpB,yCAAyC;IACzC,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,GAAG,EAAE,MAAM,CAAC;IACZ,wFAAwF;IACxF,QAAQ,CAAC,EAAE,UAAU,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IACjC,mEAAmE;IACnE,GAAG,CAAC,GAAG,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACnC,6DAA6D;IAC7D,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,GAAG,kBAAkB,GAAG,SAAS,CAAC;IACjG,sDAAsD;IACtD,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,kBAAkB,EAAE,CAAC;IAChE,oFAAoF;IACpF,OAAO,IAAI,SAAS,kBAAkB,EAAE,CAAC;IACzC,wDAAwD;IACxD,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,GAAG,IAAI,CAAC;IAC7D,2EAA2E;IAC3E,kBAAkB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAAC;IAChD,mEAAmE;IACnE,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,kBAAkB,EAAE,CAAC;CACvD;AAED,+CAA+C;AAC/C,eAAO,MAAM,cAAc,QAAS,CAAC;AACrC,+CAA+C;AAC/C,eAAO,MAAM,WAAW,QAAS,CAAC;AAClC,kFAAkF;AAClF,eAAO,MAAM,UAAU,QAAS,CAAC;AACjC;yGACyG;AACzG,eAAO,MAAM,UAAU,QAAsB,CAAC;AAC9C,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAElD"}
|
|
@@ -18,8 +18,22 @@
|
|
|
18
18
|
export const DEFAULT_TTL_MS = 90_000;
|
|
19
19
|
/** Edge-tier default registration TTL (ms). */
|
|
20
20
|
export const EDGE_TTL_MS = 60_000;
|
|
21
|
+
/** Minimum accepted registration TTL (ms). Requests below this are clamped up. */
|
|
22
|
+
export const MIN_TTL_MS = 10_000;
|
|
23
|
+
/** Maximum accepted registration TTL (ms). Requests above this are clamped down.
|
|
24
|
+
* 10 × DEFAULT_TTL_MS keeps the window predictable; prevents a wedged budget slot from a poison TTL. */
|
|
25
|
+
export const MAX_TTL_MS = 10 * DEFAULT_TTL_MS;
|
|
21
26
|
/** Consecutive ping failures before a participant promotes `backups[0]`. */
|
|
22
27
|
export const MAX_PING_FAILURES = 3;
|
|
28
|
+
/**
|
|
29
|
+
* Clamp a requested or replicated TTL into the accepted `[MIN_TTL_MS, MAX_TTL_MS]` window.
|
|
30
|
+
* Non-positive input falls to {@link DEFAULT_TTL_MS} first. This is the single TTL policy gate:
|
|
31
|
+
* both local admission (`accept()`) and gossip replication (`mergeRecords`) run every TTL through
|
|
32
|
+
* it, so no store — local or replica — can ever hold a record whose lifetime dodges the cap.
|
|
33
|
+
*/
|
|
34
|
+
export function clampTtl(ttl) {
|
|
35
|
+
return Math.min(Math.max(ttl > 0 ? ttl : DEFAULT_TTL_MS, MIN_TTL_MS), MAX_TTL_MS);
|
|
36
|
+
}
|
|
23
37
|
/** `ping_interval = ttl / 3` (default 30s Core, 20s Edge), floored to whole ms. */
|
|
24
38
|
export function pingIntervalMs(ttl) {
|
|
25
39
|
return Math.floor(ttl / 3);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/cohort-topic/registration/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAkDH,+CAA+C;AAC/C,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AACrC,+CAA+C;AAC/C,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC;AAClC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC,mFAAmF;AACnF,MAAM,UAAU,cAAc,CAAC,GAAW;IACzC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC5B,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/cohort-topic/registration/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAkDH,+CAA+C;AAC/C,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AACrC,+CAA+C;AAC/C,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC;AAClC,kFAAkF;AAClF,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC;AACjC;yGACyG;AACzG,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,GAAG,cAAc,CAAC;AAC9C,4EAA4E;AAC5E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW;IACnC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;AACnF,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,cAAc,CAAC,GAAW;IACzC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -133,9 +133,10 @@ export interface CohortTopicServiceDeps {
|
|
|
133
133
|
/** Monotonic-ish wall clock (unix ms); injectable for tests. Default `Date.now`. */
|
|
134
134
|
readonly clock?: () => number;
|
|
135
135
|
/**
|
|
136
|
-
* Optional cold-start bootstrap-evidence builder (db-p2p supplies it). Invoked **
|
|
137
|
-
*
|
|
138
|
-
*
|
|
136
|
+
* Optional cold-start bootstrap-evidence builder (db-p2p supplies it). Invoked on **either** cold-start
|
|
137
|
+
* re-issue — the root `bootstrap: true` or the deeper-tier `followOn: true` (both gated by the same
|
|
138
|
+
* evidence policy) — with the register's own canonical fields, the same
|
|
139
|
+
* `(topicId, tier, participantCoord, timestamp)` tuple a verifier binds via
|
|
139
140
|
* `bootstrapBoundImage`. It returns the **raw** envelope JSON bytes — `utf8(JSON.stringify(env))`,
|
|
140
141
|
* NOT the already-base64url string from `serializeBootstrapEvidenceEnvelope` — or `undefined` to
|
|
141
142
|
* attach none; the service base64url-encodes those bytes into `RegisterV1.bootstrapEvidence`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/cohort-topic/service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/cohort-topic/service.ts"],"names":[],"mappings":"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"}
|