@optimystic/db-core 0.14.1 → 0.16.3
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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bus.js","sourceRoot":"","sources":["../../../../src/cohort-topic/gossip/bus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"bus.js","sourceRoot":"","sources":["../../../../src/cohort-topic/gossip/bus.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,14 @@ export interface MemberContribution {
|
|
|
19
19
|
readonly windowSeconds: number;
|
|
20
20
|
/** Exact per-topic summaries this member last reported. */
|
|
21
21
|
readonly topicSummaries: readonly CohortTopicSummary[];
|
|
22
|
+
/**
|
|
23
|
+
* `topicId` (base64url) → summary, derived from {@link topicSummaries} at {@link MutableCohortView.merge}
|
|
24
|
+
* so a per-topic reader (traffic `snapshot`) does an O(1) lookup instead of an O(summaries) `.find` per
|
|
25
|
+
* member per reply. First occurrence wins on a duplicate `topicId` (matching `Array.prototype.find`).
|
|
26
|
+
* Populated by `merge`; a contribution built without going through `merge` may omit it, in which case
|
|
27
|
+
* consumers fall back to scanning {@link topicSummaries}.
|
|
28
|
+
*/
|
|
29
|
+
readonly topicIndex?: ReadonlyMap<string, CohortTopicSummary>;
|
|
22
30
|
/** Gossip timestamp (unix ms) — the last-writer-wins key. */
|
|
23
31
|
readonly timestamp: number;
|
|
24
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../../src/cohort-topic/gossip/view.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,8DAA8D;AAC9D,MAAM,WAAW,kBAAkB;IAClC,8DAA8D;IAC9D,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,6EAA6E;IAC7E,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,uDAAuD;IACvD,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,kEAAkE;IAClE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,2DAA2D;IAC3D,QAAQ,CAAC,cAAc,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACvD,6DAA6D;IAC7D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC3B;AAED,iFAAiF;AACjF,MAAM,WAAW,UAAU;IAC1B,mFAAmF;IACnF,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAAC;IACpD,wDAAwD;IACxD,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAC/C;AAED,qFAAqF;AACrF,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACpD,6GAA6G;IAC7G,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC;CACtD;
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../../src/cohort-topic/gossip/view.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,8DAA8D;AAC9D,MAAM,WAAW,kBAAkB;IAClC,8DAA8D;IAC9D,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,6EAA6E;IAC7E,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,uDAAuD;IACvD,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,kEAAkE;IAClE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,2DAA2D;IAC3D,QAAQ,CAAC,cAAc,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACvD;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC9D,6DAA6D;IAC7D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC3B;AAED,iFAAiF;AACjF,MAAM,WAAW,UAAU;IAC1B,mFAAmF;IACnF,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAAC;IACpD,wDAAwD;IACxD,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAC/C;AAED,qFAAqF;AACrF,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACpD,6GAA6G;IAC7G,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC;CACtD;AAwCD,oDAAoD;AACpD,wBAAgB,gBAAgB,IAAI,iBAAiB,CAEpD"}
|
|
@@ -19,10 +19,26 @@ class MapCohortView {
|
|
|
19
19
|
if (held !== undefined && c.timestamp < held.timestamp) {
|
|
20
20
|
return false; // stale; keep the newer contribution
|
|
21
21
|
}
|
|
22
|
-
|
|
22
|
+
// Derive the per-topic index once, at write time, so per-topic readers never rescan the flat
|
|
23
|
+
// `topicSummaries` array per reply. A writer pays O(summaries) once per merge (gossip round).
|
|
24
|
+
this.byMember.set(member, { ...c, topicIndex: indexTopics(c.topicSummaries) });
|
|
23
25
|
return true;
|
|
24
26
|
}
|
|
25
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Index a member's flat topic summaries by `topicId` (base64url). First occurrence wins on a duplicate
|
|
30
|
+
* `topicId`, exactly matching the `Array.prototype.find` scan this replaces — so a snapshot over the index
|
|
31
|
+
* returns identical numbers to one over the array.
|
|
32
|
+
*/
|
|
33
|
+
function indexTopics(summaries) {
|
|
34
|
+
const index = new Map();
|
|
35
|
+
for (const s of summaries) {
|
|
36
|
+
if (!index.has(s.topicId)) {
|
|
37
|
+
index.set(s.topicId, s);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return index;
|
|
41
|
+
}
|
|
26
42
|
/** Construct an empty {@link MutableCohortView}. */
|
|
27
43
|
export function createCohortView() {
|
|
28
44
|
return new MapCohortView();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../../../src/cohort-topic/gossip/view.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../../../src/cohort-topic/gossip/view.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA0CH,MAAM,aAAa;IACD,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;IAElE,GAAG,CAAC,MAAc;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,GAAG;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,MAAc,EAAE,CAAqB;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YACxD,OAAO,KAAK,CAAC,CAAC,qCAAqC;QACpD,CAAC;QACD,6FAA6F;QAC7F,8FAA8F;QAC9F,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC;IACb,CAAC;CACD;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,SAAwC;IAC5D,MAAM,KAAK,GAAG,IAAI,GAAG,EAA8B,CAAC;IACpD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACzB,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,gBAAgB;IAC/B,OAAO,IAAI,aAAa,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
* on it (the activity callback in `docs/cohort-topic.md` §FRET integration). It is the cohort-facing
|
|
6
6
|
* half of the substrate, composed from the prereq tickets' pure modules — the participant-facing half
|
|
7
7
|
* lives in {@link import("./service.js").CohortTopicService}. db-p2p's FRET host decodes an inbound
|
|
8
|
-
* frame, supplies the routing context this module can't see (`followOn
|
|
9
|
-
*
|
|
8
|
+
* frame, supplies the routing context this module can't see (`followOn` — derived from the wire
|
|
9
|
+
* `RegisterV1.followOn` flag, evidence-gated in step 1 — plus the quorum-willing tally), and serializes
|
|
10
|
+
* whatever reply this returns back over the wire. db-core never imports FRET here.
|
|
10
11
|
*
|
|
11
12
|
* Inbound `RegisterV1` decision pipeline (§Registration mechanics, §Willingness, §Cold-start):
|
|
12
13
|
*
|
|
@@ -38,7 +39,13 @@ import type { NodeProfile, Tier } from "./tiers.js";
|
|
|
38
39
|
import type { DemotionNoticeV1, PromotionNoticeV1, RegisterReplyV1, RegisterV1, RenewReplyV1, RenewV1 } from "./wire/types.js";
|
|
39
40
|
/** Routing context the FRET host supplies for an inbound register (db-core can't derive it). */
|
|
40
41
|
export interface RegisterContext {
|
|
41
|
-
/**
|
|
42
|
+
/**
|
|
43
|
+
* Did this register arrive as a follow-on to a parent cohort's `Promoted` redirect? The host derives
|
|
44
|
+
* this from the wire `RegisterV1.followOn` flag (`followOn: reg.followOn === true`). It is participant-
|
|
45
|
+
* asserted and therefore evidence-gated: `runGuards` (step 1) already ran `bootstrapEvidence.verify`,
|
|
46
|
+
* which demands the same proof for `followOn: true` as for `bootstrap: true`, so an unbacked follow-on
|
|
47
|
+
* never reaches this instantiation decision (it short-circuited to `unwilling_cohort`).
|
|
48
|
+
*/
|
|
42
49
|
readonly followOn: boolean;
|
|
43
50
|
/** Tree tier `d` this cohort serves the topic at (the walk position the register landed on). */
|
|
44
51
|
readonly treeTier: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"member-engine.d.ts","sourceRoot":"","sources":["../../../src/cohort-topic/member-engine.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"member-engine.d.ts","sourceRoot":"","sources":["../../../src/cohort-topic/member-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
* on it (the activity callback in `docs/cohort-topic.md` §FRET integration). It is the cohort-facing
|
|
6
6
|
* half of the substrate, composed from the prereq tickets' pure modules — the participant-facing half
|
|
7
7
|
* lives in {@link import("./service.js").CohortTopicService}. db-p2p's FRET host decodes an inbound
|
|
8
|
-
* frame, supplies the routing context this module can't see (`followOn
|
|
9
|
-
*
|
|
8
|
+
* frame, supplies the routing context this module can't see (`followOn` — derived from the wire
|
|
9
|
+
* `RegisterV1.followOn` flag, evidence-gated in step 1 — plus the quorum-willing tally), and serializes
|
|
10
|
+
* whatever reply this returns back over the wire. db-core never imports FRET here.
|
|
10
11
|
*
|
|
11
12
|
* Inbound `RegisterV1` decision pipeline (§Registration mechanics, §Willingness, §Cold-start):
|
|
12
13
|
*
|
|
@@ -23,7 +24,7 @@
|
|
|
23
24
|
* Every collaborator is injected, so the engine unit-tests without FRET or libp2p.
|
|
24
25
|
*/
|
|
25
26
|
import { bytesEqual, bytesKey } from "./registration/bytes.js";
|
|
26
|
-
import {
|
|
27
|
+
import { clampTtl } from "./registration/types.js";
|
|
27
28
|
import { backoffRetryMs } from "./willingness.js";
|
|
28
29
|
import { promotedRedirectReply } from "./coldstart.js";
|
|
29
30
|
import { shouldInstantiate } from "./coldstart.js";
|
|
@@ -58,7 +59,10 @@ class StoreCohortMemberEngine {
|
|
|
58
59
|
}
|
|
59
60
|
return this.admitOrDecline(reg, topicId, participantId, tier, ctx, now);
|
|
60
61
|
}
|
|
61
|
-
// 3. Cold path: instantiate only at a legitimate growth point with a willing quorum.
|
|
62
|
+
// 3. Cold path: instantiate only at a legitimate growth point with a willing quorum. `ctx.followOn`
|
|
63
|
+
// mirrors the wire `reg.followOn` flag (the host derives it), and by the time we reach here the
|
|
64
|
+
// step-1 bootstrap-evidence gate has already verified a `followOn: true` carries the same proof a
|
|
65
|
+
// `bootstrap: true` root cold-start carries — so this branch never instantiates an unbacked follow-on.
|
|
62
66
|
const quorumWilling = this.deps.quorumWilling(tier);
|
|
63
67
|
if (!shouldInstantiate({ bootstrap: reg.bootstrap === true, followOn: ctx.followOn, quorumWilling })) {
|
|
64
68
|
return { v: 1, result: "no_state" };
|
|
@@ -177,7 +181,7 @@ class StoreCohortMemberEngine {
|
|
|
177
181
|
async accept(reg, topicId, participantId, tier, ctx, now) {
|
|
178
182
|
const { members, cohortEpoch } = this.deps.cohort();
|
|
179
183
|
const { primary, backups } = this.deps.slots.assignSlots(participantId, cohortEpoch, members);
|
|
180
|
-
const ttl = reg.ttl
|
|
184
|
+
const ttl = clampTtl(reg.ttl);
|
|
181
185
|
const record = {
|
|
182
186
|
topicId,
|
|
183
187
|
participantId,
|
|
@@ -226,21 +230,32 @@ class StoreCohortMemberEngine {
|
|
|
226
230
|
runGuards(reg, topicId, participantId, tier, now) {
|
|
227
231
|
if (this.deps.verifyRegisterSig?.(reg) === false) {
|
|
228
232
|
// Unsigned / forged participant signature: serve nothing and record nothing (the cohort
|
|
229
|
-
// cannot trust this participantCoord).
|
|
230
|
-
//
|
|
233
|
+
// cannot trust this participantCoord). Cheap + stateless, so checked first — a forged frame
|
|
234
|
+
// cannot consume any downstream guard state.
|
|
231
235
|
return { v: 1, result: "no_state" };
|
|
232
236
|
}
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
+
// Rate-check BEFORE the replay guard records anything: a fresh-correlationId spam frame that the
|
|
238
|
+
// rate limiter would reject must not first insert a `seen` entry (which would let an attacker grow
|
|
239
|
+
// the replay guard's memory at full attack speed regardless of the rate limit). Running it before
|
|
240
|
+
// the potentially-expensive bootstrap verify (which may do PoW) also short-circuits floods sooner.
|
|
241
|
+
// NOTE: a replayed frame now consumes a rate-limiter accept before the replay guard (below) drops it,
|
|
242
|
+
// whereas the old order dropped replays pre-rate. Fine for spam (inbound traffic should be counted);
|
|
243
|
+
// only matters if a legitimate client reuses one correlationId across retransmits — it would then
|
|
244
|
+
// burn rate budget per retransmit. If clients adopt idempotent same-cid retry, revisit this order.
|
|
245
|
+
const rate = this.deps.rateLimiter?.check(participantId, topicId, now);
|
|
246
|
+
if (rate !== undefined && rate.ok === false) {
|
|
247
|
+
return { v: 1, result: "unwilling_cohort", retryAfterMs: rate.retryAfterMs };
|
|
237
248
|
}
|
|
238
249
|
if (this.deps.bootstrapEvidence?.verify(reg, tier) === false) {
|
|
239
250
|
return this.unwillingCohort(reg, now);
|
|
240
251
|
}
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
252
|
+
// Replay guard records LAST, so only frames that passed signature + rate + bootstrap ever insert a
|
|
253
|
+
// `seen` entry. An *accepted* frame is still always recorded here, so a genuine replay of a served
|
|
254
|
+
// correlationId is still caught; only rate-rejected frames (never served, never recorded) skip it.
|
|
255
|
+
const correlationId = b64urlToBytes(reg.correlationId);
|
|
256
|
+
if (this.deps.replayGuard?.accept(correlationId, participantId, reg.timestamp, now) === false) {
|
|
257
|
+
// Stale / future-skewed / replayed: serve nothing and record nothing.
|
|
258
|
+
return { v: 1, result: "no_state" };
|
|
244
259
|
}
|
|
245
260
|
return undefined;
|
|
246
261
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"member-engine.js","sourceRoot":"","sources":["../../../src/cohort-topic/member-engine.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"member-engine.js","sourceRoot":"","sources":["../../../src/cohort-topic/member-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,13 +4,14 @@
|
|
|
4
4
|
* Per `docs/cohort-topic.md` §Membership snapshots: the cohort publishes a threshold-signed
|
|
5
5
|
* `MembershipCertV1`
|
|
6
6
|
*
|
|
7
|
-
* - at stabilization, and on any change to the
|
|
7
|
+
* - at stabilization, and on any change to the cohort identity — the epoch `H(sorted all members)`,
|
|
8
|
+
* so *any* member change (head or tail) forces a fresh publish ({@link MembershipCertPublisher.onStabilized});
|
|
8
9
|
* - refreshed every `T_membership_refresh` (default 5 min) ({@link MembershipCertPublisher.tick}).
|
|
9
10
|
*
|
|
10
11
|
* The publisher is db-core logic over the {@link CohortSigner} (threshold sign) and the
|
|
11
12
|
* {@link IMembershipPublishSink} (serve/advertise). It never imports FRET. Members are sorted
|
|
12
|
-
* ascending for the cert (matching the sharding order)
|
|
13
|
-
*
|
|
13
|
+
* ascending for the cert (matching the sharding order); the snapshot's `cohortEpoch` is the full
|
|
14
|
+
* cohort identity, and a change to it across a publish forces a fresh publish.
|
|
14
15
|
*/
|
|
15
16
|
import type { IMembershipPublishSink } from "../ports.js";
|
|
16
17
|
import type { MembershipCertV1 } from "../wire/types.js";
|
|
@@ -58,10 +59,11 @@ export interface RotationAttestation {
|
|
|
58
59
|
/** Cohort-side membership-cert publisher. */
|
|
59
60
|
export interface MembershipCertPublisher {
|
|
60
61
|
/**
|
|
61
|
-
* Drive publication on a stabilization event. Publishes (and returns the cert) when the
|
|
62
|
-
* `
|
|
63
|
-
*
|
|
64
|
-
*
|
|
62
|
+
* Drive publication on a stabilization event. Publishes (and returns the cert) when the cohort identity
|
|
63
|
+
* (`cohortEpoch = H(sorted members)`) changed since the last publish — i.e. on **any** member change,
|
|
64
|
+
* head or tail — or on the first call; otherwise returns `undefined`. Pass `rotation` to attach a
|
|
65
|
+
* predecessor-cohort rotation attestation (an epoch rotation); omit it for the default non-rotation
|
|
66
|
+
* publish (no rotation fields are emitted).
|
|
65
67
|
*/
|
|
66
68
|
onStabilized(snapshot: CohortSnapshot, now: number, rotation?: RotationAttestation): Promise<MembershipCertV1 | undefined>;
|
|
67
69
|
/**
|
|
@@ -74,6 +76,11 @@ export interface MembershipCertPublisherDeps {
|
|
|
74
76
|
signer: CohortSigner;
|
|
75
77
|
sink: IMembershipPublishSink;
|
|
76
78
|
refreshMs?: number;
|
|
79
|
+
/**
|
|
80
|
+
* Accepted for call-site compatibility but no longer read by the publisher: the republish gate now keys
|
|
81
|
+
* on the full `cohortEpoch`, not the first `k − x` members, and the threshold-sign quorum lives in the
|
|
82
|
+
* {@link CohortSigner}. Kept so existing callers (host + db-p2p tests) compile unchanged.
|
|
83
|
+
*/
|
|
77
84
|
minSigs?: number;
|
|
78
85
|
maxMessageBytes?: number;
|
|
79
86
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publisher.d.ts","sourceRoot":"","sources":["../../../../src/cohort-topic/membership/publisher.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"publisher.d.ts","sourceRoot":"","sources":["../../../../src/cohort-topic/membership/publisher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAgC,KAAK,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE/F,yEAAyE;AACzE,eAAO,MAAM,+BAA+B,QAAa,CAAC;AAE1D;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,cAAc,GAAG,sBAAsB,CAQvF;AAED,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC9B,+BAA+B;IAC/B,KAAK,EAAE,UAAU,CAAC;IAClB,sCAAsC;IACtC,WAAW,EAAE,UAAU,CAAC;IACxB,iEAAiE;IACjE,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IAC/B,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,eAAe,CAAC,EAAE,UAAU,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IACnC,kEAAkE;IAClE,SAAS,EAAE,UAAU,CAAC;IACtB,0FAA0F;IAC1F,WAAW,EAAE,UAAU,CAAC;IACxB,kFAAkF;IAClF,eAAe,EAAE,SAAS,UAAU,EAAE,CAAC;CACvC;AAED,6CAA6C;AAC7C,MAAM,WAAW,uBAAuB;IACvC;;;;;;OAMG;IACH,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;IAC3H;;;OAGG;IACH,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;CACnH;AAED,MAAM,WAAW,2BAA2B;IAC3C,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,sBAAsB,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAyDD,2DAA2D;AAC3D,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,2BAA2B,GAAG,uBAAuB,CAExG"}
|
|
@@ -4,17 +4,18 @@
|
|
|
4
4
|
* Per `docs/cohort-topic.md` §Membership snapshots: the cohort publishes a threshold-signed
|
|
5
5
|
* `MembershipCertV1`
|
|
6
6
|
*
|
|
7
|
-
* - at stabilization, and on any change to the
|
|
7
|
+
* - at stabilization, and on any change to the cohort identity — the epoch `H(sorted all members)`,
|
|
8
|
+
* so *any* member change (head or tail) forces a fresh publish ({@link MembershipCertPublisher.onStabilized});
|
|
8
9
|
* - refreshed every `T_membership_refresh` (default 5 min) ({@link MembershipCertPublisher.tick}).
|
|
9
10
|
*
|
|
10
11
|
* The publisher is db-core logic over the {@link CohortSigner} (threshold sign) and the
|
|
11
12
|
* {@link IMembershipPublishSink} (serve/advertise). It never imports FRET. Members are sorted
|
|
12
|
-
* ascending for the cert (matching the sharding order)
|
|
13
|
-
*
|
|
13
|
+
* ascending for the cert (matching the sharding order); the snapshot's `cohortEpoch` is the full
|
|
14
|
+
* cohort identity, and a change to it across a publish forces a fresh publish.
|
|
14
15
|
*/
|
|
15
16
|
import { bytesToB64url, encodeCohortMessage } from "../wire/codec.js";
|
|
16
17
|
import { compareBytes } from "../registration/bytes.js";
|
|
17
|
-
import {
|
|
18
|
+
import {} from "../sig/threshold.js";
|
|
18
19
|
import { membershipCertSigningPayload } from "../sig/payloads.js";
|
|
19
20
|
/** Default membership-cert refresh interval (`T_membership_refresh`). */
|
|
20
21
|
export const DEFAULT_T_MEMBERSHIP_REFRESH_MS = 5 * 60_000;
|
|
@@ -38,19 +39,21 @@ export function membershipCertSignable(snapshot) {
|
|
|
38
39
|
class SigningMembershipCertPublisher {
|
|
39
40
|
deps;
|
|
40
41
|
refreshMs;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
lastFirstKx;
|
|
42
|
+
/** base64url of the last published snapshot's `cohortEpoch` — the full cohort-identity republish key. */
|
|
43
|
+
lastEpoch;
|
|
44
44
|
lastPublishedAt;
|
|
45
45
|
constructor(deps) {
|
|
46
46
|
this.deps = deps;
|
|
47
47
|
this.refreshMs = deps.refreshMs ?? DEFAULT_T_MEMBERSHIP_REFRESH_MS;
|
|
48
|
-
this.minSigs = deps.minSigs ?? DEFAULT_MIN_SIGS;
|
|
49
48
|
}
|
|
50
49
|
async onStabilized(snapshot, now, rotation) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
// NOTE: republish (and the caller's rotation attestation) now fire on ANY epoch change — any member
|
|
51
|
+
// change, head or tail — not just first-(k − x) churn. Gated on an actual epoch change, never per
|
|
52
|
+
// tick, so cost is bounded by real churn. If a high-churn cohort ever shows excess `/sign` or publish
|
|
53
|
+
// load, reconsider a short debounce / batching here.
|
|
54
|
+
const epoch = bytesToB64url(snapshot.cohortEpoch);
|
|
55
|
+
if (this.lastEpoch !== undefined && this.lastEpoch === epoch) {
|
|
56
|
+
return undefined; // cohort identity unchanged — no republish needed
|
|
54
57
|
}
|
|
55
58
|
return this.publish(snapshot, now, rotation);
|
|
56
59
|
}
|
|
@@ -60,10 +63,6 @@ class SigningMembershipCertPublisher {
|
|
|
60
63
|
}
|
|
61
64
|
return this.publish(snapshot, now, rotation);
|
|
62
65
|
}
|
|
63
|
-
/** The first `minSigs` members of the cert's ascending order, base64url — the republish-change key. */
|
|
64
|
-
firstKx(members) {
|
|
65
|
-
return [...members].sort(compareBytes).slice(0, this.minSigs).map(bytesToB64url);
|
|
66
|
-
}
|
|
67
66
|
async publish(snapshot, now, rotation) {
|
|
68
67
|
const signable = membershipCertSignable(snapshot);
|
|
69
68
|
const { thresholdSig, signers } = await this.deps.signer.thresholdSign(membershipCertSigningPayload(signable));
|
|
@@ -84,22 +83,11 @@ class SigningMembershipCertPublisher {
|
|
|
84
83
|
cert.rotationSigners = rotation.rotationSigners.map(bytesToB64url);
|
|
85
84
|
}
|
|
86
85
|
this.deps.sink.publish(encodeCohortMessage(cert, this.deps.maxMessageBytes));
|
|
87
|
-
this.
|
|
86
|
+
this.lastEpoch = bytesToB64url(snapshot.cohortEpoch);
|
|
88
87
|
this.lastPublishedAt = now;
|
|
89
88
|
return cert;
|
|
90
89
|
}
|
|
91
90
|
}
|
|
92
|
-
function sameOrder(a, b) {
|
|
93
|
-
if (a.length !== b.length) {
|
|
94
|
-
return false;
|
|
95
|
-
}
|
|
96
|
-
for (let i = 0; i < a.length; i++) {
|
|
97
|
-
if (a[i] !== b[i]) {
|
|
98
|
-
return false;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return true;
|
|
102
|
-
}
|
|
103
91
|
/** Build a cohort-side {@link MembershipCertPublisher}. */
|
|
104
92
|
export function createMembershipCertPublisher(deps) {
|
|
105
93
|
return new SigningMembershipCertPublisher(deps);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../../../src/cohort-topic/membership/publisher.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../../../src/cohort-topic/membership/publisher.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,6 +47,13 @@ import type { IMembershipTrustAnchor, RingCoord, TrustRoot } from "../ports.js";
|
|
|
47
47
|
import type { MembershipCertV1 } from "../wire/types.js";
|
|
48
48
|
import { type CohortSigner } from "../sig/threshold.js";
|
|
49
49
|
import type { IMembershipSourceRouter } from "./source.js";
|
|
50
|
+
/**
|
|
51
|
+
* Default hard cap on distinct coords the verifier's per-coord maps retain (`byCoord`, `lastFetchAt`,
|
|
52
|
+
* `staleGapStrikes`). Beyond it the least-recently-used coord is evicted — bounding memory under a flood
|
|
53
|
+
* of verify-misses against attacker-chosen coords. Same 100k ballpark as the sibling anti-DoS caps
|
|
54
|
+
* ({@link import("../antidos/replay-guard.js").DEFAULT_REPLAY_GUARD_MAX_KEYS}).
|
|
55
|
+
*/
|
|
56
|
+
export declare const DEFAULT_MEMBERSHIP_VERIFIER_MAX_COORDS = 100000;
|
|
50
57
|
/** Outcome of verifying a threshold-signed message against cohort membership. */
|
|
51
58
|
export type VerifyResult = "verified" | "untrusted";
|
|
52
59
|
/** Caches certs per coord and verifies threshold-signed messages with one stale-cert refetch. */
|
|
@@ -90,6 +97,34 @@ export interface MembershipVerifierDeps {
|
|
|
90
97
|
anchor?: IMembershipTrustAnchor;
|
|
91
98
|
/** Out-of-band-seeded genesis trust roots (the base case of every attestation chain). Defaults to `[]`. */
|
|
92
99
|
trustRoots?: readonly TrustRoot[];
|
|
100
|
+
/**
|
|
101
|
+
* Number of **consecutive** gap-signalled refetches after which a **trust-locked** coord whose direct
|
|
102
|
+
* anchor has gone `"unknown"` re-enters the interim TOFU regime — the exit from a stale trust-lock a
|
|
103
|
+
* former cohort member would otherwise be stranded in until the host process restarts.
|
|
104
|
+
*
|
|
105
|
+
* The lock (a coord holding a *trusted* cached cert refuses any un-anchored refetch — no TOFU downgrade)
|
|
106
|
+
* has no other exit: a node that served coord `C`, self-published its cert (locking `C`), then left `C`'s
|
|
107
|
+
* cohort keeps distrusting every later-epoch message from `C` if it missed an intermediate rotation, since
|
|
108
|
+
* the refetched cert's `prevEpoch` no longer matches the stale cached epoch and the anchor no longer
|
|
109
|
+
* vouches for `C`. Recovery counts **only** refetched certs presenting an *explicit chain gap* — a full
|
|
110
|
+
* rotation attestation whose `prevEpoch ≠` the cached trusted epoch (the network provably rotated past the
|
|
111
|
+
* cached epoch through an epoch this node never witnessed). A forged rotation off the *current* cached
|
|
112
|
+
* predecessor (`prevEpoch == cachedEpoch`) never counts as a strike, so the lock's headline invariant
|
|
113
|
+
* (un-anchored successor of a matching predecessor stays rejected) is preserved.
|
|
114
|
+
*
|
|
115
|
+
* Defaults to `3`. Setting it to `0` (or a negative) **disables** recovery — which re-opens the stale-lock
|
|
116
|
+
* liveness bug, so leave it on unless a caller has an independent lock-drop mechanism (see the
|
|
117
|
+
* drop-the-lock-on-demotion tripwire in the ticket).
|
|
118
|
+
*/
|
|
119
|
+
staleGapRecoveryStrikes?: number;
|
|
120
|
+
/**
|
|
121
|
+
* Hard LRU cap on distinct coords retained across the verifier's per-coord maps (`byCoord`,
|
|
122
|
+
* `lastFetchAt`, `staleGapStrikes`); the least-recently-used coord is evicted beyond it. Bounds memory
|
|
123
|
+
* under a flood of verify-misses against attacker-chosen coords. Defaults to
|
|
124
|
+
* {@link DEFAULT_MEMBERSHIP_VERIFIER_MAX_COORDS}; must be a positive integer (mirrors the sibling
|
|
125
|
+
* anti-DoS `maxKeys` guard).
|
|
126
|
+
*/
|
|
127
|
+
maxCoords?: number;
|
|
93
128
|
}
|
|
94
129
|
/** Build a participant-side {@link MembershipVerifier}. */
|
|
95
130
|
export declare function createMembershipVerifier(deps: MembershipVerifierDeps): MembershipVerifier;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../../../src/cohort-topic/membership/verifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIhF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE1E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../../../src/cohort-topic/membership/verifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIhF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE1E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAG3D;;;;;GAKG;AACH,eAAO,MAAM,sCAAsC,SAAU,CAAC;AAE9D,iFAAiF;AACjF,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,WAAW,CAAC;AAEpD,iGAAiG;AACjG,MAAM,WAAW,kBAAkB;IAClC,iEAAiE;IACjE,KAAK,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACxK;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC5B,yFAAyF;IACzF,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,2DAA2D;IAC3D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACtC,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,uBAAuB,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,2GAA2G;IAC3G,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAClC;;;;;;;;;;;;;;;;;;OAkBG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AA+TD,2DAA2D;AAC3D,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,sBAAsB,GAAG,kBAAkB,CAEzF"}
|