@optimystic/db-core 0.21.0 → 0.24.0
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/README.md +336 -336
- package/dist/src/btree/btree.d.ts +2 -1
- package/dist/src/btree/btree.d.ts.map +1 -1
- package/dist/src/btree/btree.js +1 -1
- package/dist/src/btree/btree.js.map +1 -1
- package/dist/src/chain/chain.d.ts +1 -1
- package/dist/src/chain/chain.d.ts.map +1 -1
- package/dist/src/chain/chain.js +1 -1
- package/dist/src/chain/chain.js.map +1 -1
- package/dist/src/cluster/structs.d.ts +39 -1
- package/dist/src/cluster/structs.d.ts.map +1 -1
- package/dist/src/cluster/structs.js +24 -0
- package/dist/src/cluster/structs.js.map +1 -1
- package/dist/src/collection/collection.d.ts +20 -1
- package/dist/src/collection/collection.d.ts.map +1 -1
- package/dist/src/collection/collection.js +31 -4
- package/dist/src/collection/collection.js.map +1 -1
- package/dist/src/collections/diary/diary.d.ts.map +1 -1
- package/dist/src/collections/diary/diary.js +2 -1
- package/dist/src/collections/diary/diary.js.map +1 -1
- package/dist/src/collections/diary/struct.js +1 -1
- package/dist/src/collections/diary/struct.js.map +1 -1
- package/dist/src/collections/tree/collection-trunk.js +1 -1
- package/dist/src/collections/tree/collection-trunk.js.map +1 -1
- package/dist/src/collections/tree/struct.d.ts +1 -1
- package/dist/src/collections/tree/struct.d.ts.map +1 -1
- package/dist/src/collections/tree/struct.js +2 -1
- package/dist/src/collections/tree/struct.js.map +1 -1
- package/dist/src/collections/tree/tree.d.ts +5 -0
- package/dist/src/collections/tree/tree.d.ts.map +1 -1
- package/dist/src/collections/tree/tree.js +7 -0
- package/dist/src/collections/tree/tree.js.map +1 -1
- package/dist/src/log/log.d.ts +1 -1
- package/dist/src/log/log.d.ts.map +1 -1
- package/dist/src/log/log.js +2 -2
- package/dist/src/log/log.js.map +1 -1
- package/dist/src/network/i-peer-network.d.ts +16 -0
- package/dist/src/network/i-peer-network.d.ts.map +1 -1
- package/dist/src/network/struct.d.ts +39 -2
- package/dist/src/network/struct.d.ts.map +1 -1
- package/dist/src/network/struct.js +18 -0
- package/dist/src/network/struct.js.map +1 -1
- package/dist/src/testing/test-transactor.d.ts +95 -8
- package/dist/src/testing/test-transactor.d.ts.map +1 -1
- package/dist/src/testing/test-transactor.js +133 -12
- package/dist/src/testing/test-transactor.js.map +1 -1
- package/dist/src/transaction/coordinator.d.ts.map +1 -1
- package/dist/src/transaction/coordinator.js +2 -1
- package/dist/src/transaction/coordinator.js.map +1 -1
- package/dist/src/transaction/transaction.d.ts +1 -1
- package/dist/src/transaction/transaction.js +1 -1
- package/dist/src/transactor/network-transactor.d.ts.map +1 -1
- package/dist/src/transactor/network-transactor.js +57 -18
- package/dist/src/transactor/network-transactor.js.map +1 -1
- package/dist/src/transactor/transactor-source.d.ts.map +1 -1
- package/dist/src/transactor/transactor-source.js +25 -2
- package/dist/src/transactor/transactor-source.js.map +1 -1
- package/dist/src/transform/cache-source.js +1 -1
- package/dist/src/transform/cache-source.js.map +1 -1
- package/dist/src/transform/helpers.d.ts +6 -1
- package/dist/src/transform/helpers.d.ts.map +1 -1
- package/dist/src/transform/helpers.js +7 -6
- package/dist/src/transform/helpers.js.map +1 -1
- package/dist/src/transform/tracker.d.ts.map +1 -1
- package/dist/src/transform/tracker.js +2 -1
- package/dist/src/transform/tracker.js.map +1 -1
- package/package.json +1 -1
- package/src/btree/btree.ts +2 -1
- package/src/chain/chain.ts +2 -1
- package/src/cluster/membership.ts +85 -85
- package/src/cluster/structs.ts +43 -4
- package/src/cohort-topic/addressing.ts +120 -120
- package/src/cohort-topic/antidos/bootstrap-evidence-envelope.ts +253 -253
- package/src/cohort-topic/antidos/bootstrap-evidence.ts +106 -106
- package/src/cohort-topic/antidos/index.ts +5 -5
- package/src/cohort-topic/antidos/rate-limiter.ts +210 -210
- package/src/cohort-topic/antidos/replay-guard.ts +146 -146
- package/src/cohort-topic/antidos/topic-budget.ts +160 -160
- package/src/cohort-topic/antiflood/index.ts +2 -2
- package/src/cohort-topic/antiflood/invariants.ts +108 -108
- package/src/cohort-topic/antiflood/jitter.ts +117 -117
- package/src/cohort-topic/coldstart.ts +237 -237
- package/src/cohort-topic/dmax.ts +88 -88
- package/src/cohort-topic/gossip/bus.ts +254 -254
- package/src/cohort-topic/gossip/index.ts +3 -3
- package/src/cohort-topic/gossip/records.ts +45 -45
- package/src/cohort-topic/gossip/view.ts +91 -91
- package/src/cohort-topic/index.ts +20 -20
- package/src/cohort-topic/load/barometer.ts +134 -134
- package/src/cohort-topic/load/index.ts +1 -1
- package/src/cohort-topic/member-engine.ts +430 -430
- package/src/cohort-topic/membership/index.ts +3 -3
- package/src/cohort-topic/membership/publisher.ts +163 -163
- package/src/cohort-topic/membership/source.ts +41 -41
- package/src/cohort-topic/membership/verifier.ts +461 -461
- package/src/cohort-topic/ports.ts +157 -157
- package/src/cohort-topic/promotion.ts +405 -405
- package/src/cohort-topic/registration/bytes.ts +37 -37
- package/src/cohort-topic/registration/handoff.ts +154 -154
- package/src/cohort-topic/registration/index.ts +6 -6
- package/src/cohort-topic/registration/renewal.ts +495 -495
- package/src/cohort-topic/registration/sharding.ts +61 -61
- package/src/cohort-topic/registration/store.ts +81 -81
- package/src/cohort-topic/registration/types.ts +91 -91
- package/src/cohort-topic/ring-hash.ts +50 -50
- package/src/cohort-topic/service.ts +416 -416
- package/src/cohort-topic/sig/index.ts +2 -2
- package/src/cohort-topic/sig/payloads.ts +59 -59
- package/src/cohort-topic/sig/threshold.ts +64 -64
- package/src/cohort-topic/tiers.ts +74 -74
- package/src/cohort-topic/traffic.ts +233 -233
- package/src/cohort-topic/walk.ts +326 -326
- package/src/cohort-topic/willingness.ts +237 -237
- package/src/cohort-topic/wire/codec.ts +216 -216
- package/src/cohort-topic/wire/index.ts +18 -18
- package/src/cohort-topic/wire/payloads.ts +126 -126
- package/src/cohort-topic/wire/primitives.ts +188 -188
- package/src/cohort-topic/wire/types.ts +475 -475
- package/src/cohort-topic/wire/validate.ts +512 -512
- package/src/collection/collection-type-registry.ts +37 -37
- package/src/collection/collection.ts +32 -4
- package/src/collections/diary/diary.ts +68 -67
- package/src/collections/diary/struct.ts +1 -1
- package/src/collections/tree/collection-trunk.ts +1 -1
- package/src/collections/tree/readme.md +4 -0
- package/src/collections/tree/struct.ts +3 -1
- package/src/collections/tree/tree.ts +320 -312
- package/src/log/log.ts +2 -2
- package/src/matchmaking/capability-filter.ts +45 -45
- package/src/matchmaking/config.ts +98 -98
- package/src/matchmaking/index.ts +21 -21
- package/src/matchmaking/multi-cohort-seeker.ts +234 -234
- package/src/matchmaking/provider.ts +123 -123
- package/src/matchmaking/query-eval.ts +105 -105
- package/src/matchmaking/seeker-walk.ts +127 -127
- package/src/matchmaking/seeker.ts +86 -86
- package/src/matchmaking/topic-anchor.ts +90 -90
- package/src/matchmaking/voting-quorum.ts +394 -394
- package/src/matchmaking/wire.ts +603 -603
- package/src/network/i-peer-network.ts +17 -0
- package/src/network/stale-failure.ts +43 -43
- package/src/network/struct.ts +41 -2
- package/src/network/types.ts +37 -37
- package/src/reactivity/backfill.ts +220 -220
- package/src/reactivity/backpressure.ts +191 -191
- package/src/reactivity/checkpoint.ts +308 -308
- package/src/reactivity/config.ts +172 -172
- package/src/reactivity/dedupe.ts +132 -132
- package/src/reactivity/forwarder.ts +87 -87
- package/src/reactivity/index.ts +34 -34
- package/src/reactivity/notification.ts +123 -123
- package/src/reactivity/policy.ts +79 -79
- package/src/reactivity/push-state.ts +310 -310
- package/src/reactivity/recover.ts +153 -153
- package/src/reactivity/replay-buffer.ts +141 -141
- package/src/reactivity/resume.ts +549 -549
- package/src/reactivity/rotation.ts +415 -415
- package/src/reactivity/subscriber.ts +132 -132
- package/src/reactivity/subscription.ts +66 -66
- package/src/reactivity/topic-anchor.ts +71 -71
- package/src/reactivity/verify.ts +73 -73
- package/src/reactivity/wire-validate.ts +13 -13
- package/src/reactivity/wire.ts +224 -224
- package/src/testing/async-wait.ts +65 -65
- package/src/testing/index.ts +2 -2
- package/src/testing/test-transactor.ts +638 -489
- package/src/transaction/coordinator.ts +2 -1
- package/src/transaction/errors.ts +91 -91
- package/src/transaction/operations-hash.ts +196 -196
- package/src/transaction/read-dependency-collector.ts +78 -78
- package/src/transaction/transaction.ts +1 -1
- package/src/transactor/change-notifier.ts +80 -80
- package/src/transactor/index.ts +5 -5
- package/src/transactor/network-transactor.ts +58 -19
- package/src/transactor/transactor-source.ts +25 -2
- package/src/transform/atomic-proxy.ts +92 -92
- package/src/transform/cache-source.ts +1 -1
- package/src/transform/helpers.ts +159 -158
- package/src/transform/tracker.ts +2 -1
- package/src/utility/backoff.ts +95 -95
- package/src/utility/batch-coordinator.ts +191 -191
- package/dist/src/transaction/context.d.ts +0 -60
- package/dist/src/transaction/context.d.ts.map +0 -1
- package/dist/src/transaction/context.js +0 -91
- package/dist/src/transaction/context.js.map +0 -1
|
@@ -1,106 +1,106 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cohort-topic substrate — bootstrap evidence policy (anti-DoS).
|
|
3
|
-
*
|
|
4
|
-
* Transcribed from `docs/cohort-topic.md` §Anti-DoS bullet 4. A cold cohort that accepts a cold-start
|
|
5
|
-
* registration must demand evidence, so a cold topic cannot be instantiated for free by an attacker.
|
|
6
|
-
* **A follow-on cold-start (`followOn: true`) is gated identically to a root bootstrap
|
|
7
|
-
* (`bootstrap: true`)**: the cold tier-`(d+1)` child a `Promoted` redirect points at is participant-
|
|
8
|
-
* asserted (the child cannot infer the redirect — the routing key decorrelates tiers and it holds no
|
|
9
|
-
* breadcrumb of where the participant came from), so its safety cannot rest on provenance; it rests on
|
|
10
|
-
* this gate paying the same anti-abuse cost the root already pays. The accepted evidence is
|
|
11
|
-
* **tier-dependent**:
|
|
12
|
-
*
|
|
13
|
-
* - **T0 / T1** — generally no proof-of-work, because these tiers correspond to committed work; a
|
|
14
|
-
* *signed reference to a committed parent topic that does exist* is sufficient.
|
|
15
|
-
* - **T2 / T3** — a **proof-of-work** OR a **reputation-score signature** (a signature from a peer
|
|
16
|
-
* with sufficient reputation, see `architecture.md` §Reputation) OR a **signed parent-topic
|
|
17
|
-
* reference**.
|
|
18
|
-
*
|
|
19
|
-
* This module is the *policy* — which evidence kinds satisfy which tier. The cryptographic checks
|
|
20
|
-
* themselves (verifying a PoW, a reputation signature, a parent-topic reference) are injected, keeping
|
|
21
|
-
* db-core free of any specific PoW/reputation scheme (the same injection discipline as the threshold
|
|
22
|
-
* crypto port). The evidence travels in the registration's dedicated, signature-covered
|
|
23
|
-
* `bootstrapEvidence` field — a versioned `BootstrapEvidenceEnvelopeV1`
|
|
24
|
-
* (`./bootstrap-evidence-envelope.js`), parsed crypto-free here and checked by the injected verifiers;
|
|
25
|
-
* NOT the opaque `appPayload` slot (which the cohort copies verbatim into the registration's appState).
|
|
26
|
-
* A registration that is neither a bootstrap nor a follow-on cold-start needs no evidence and is admitted.
|
|
27
|
-
*/
|
|
28
|
-
|
|
29
|
-
import type { RegisterV1 } from "../wire/types.js";
|
|
30
|
-
import { createLogger } from "../../logger.js";
|
|
31
|
-
|
|
32
|
-
const log = createLogger("cohort-topic:antidos");
|
|
33
|
-
|
|
34
|
-
/** Tiers at/below this need no proof-of-work — a signed parent reference suffices (T0/T1). */
|
|
35
|
-
export const DEFAULT_MAX_NO_POW_TIER = 1;
|
|
36
|
-
|
|
37
|
-
export interface BootstrapEvidenceDeps {
|
|
38
|
-
/** Verify a proof-of-work attached to `reg` (T2/T3 path). Absent → PoW is never satisfiable. */
|
|
39
|
-
verifyPoW?: (reg: RegisterV1) => boolean;
|
|
40
|
-
/** Verify a sufficient-reputation signature on `reg` (T2/T3 path). Absent → never satisfiable. */
|
|
41
|
-
verifyReputation?: (reg: RegisterV1) => boolean;
|
|
42
|
-
/** Verify a signed reference to an existing committed parent topic (all tiers). Absent → never satisfiable. */
|
|
43
|
-
verifyParentReference?: (reg: RegisterV1) => boolean;
|
|
44
|
-
config?: BootstrapEvidenceConfig;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export interface BootstrapEvidenceConfig {
|
|
48
|
-
/** Highest tier exempt from proof-of-work (T0/T1 → 1). Default {@link DEFAULT_MAX_NO_POW_TIER}. */
|
|
49
|
-
maxNoPowTier?: number;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/** Tier-dependent bootstrap-evidence gate for cold-root registrations. */
|
|
53
|
-
export interface BootstrapEvidence {
|
|
54
|
-
/**
|
|
55
|
-
* Whether `reg` carries acceptable cold-start evidence for `tier`. A registration that is neither a
|
|
56
|
-
* `bootstrap` nor a `followOn` is always acceptable (nothing to prove). For a cold-start (either flag):
|
|
57
|
-
* T0/T1 require a signed parent reference; T2/T3 accept proof-of-work OR a reputation signature OR a
|
|
58
|
-
* signed parent reference.
|
|
59
|
-
*/
|
|
60
|
-
verify(reg: RegisterV1, tier: number): boolean;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
class TieredBootstrapEvidence implements BootstrapEvidence {
|
|
64
|
-
private readonly maxNoPowTier: number;
|
|
65
|
-
private readonly verifyPoW: (reg: RegisterV1) => boolean;
|
|
66
|
-
private readonly verifyReputation: (reg: RegisterV1) => boolean;
|
|
67
|
-
private readonly verifyParentReference: (reg: RegisterV1) => boolean;
|
|
68
|
-
|
|
69
|
-
constructor(deps: BootstrapEvidenceDeps = {}) {
|
|
70
|
-
this.maxNoPowTier = deps.config?.maxNoPowTier ?? DEFAULT_MAX_NO_POW_TIER;
|
|
71
|
-
this.verifyPoW = deps.verifyPoW ?? ((): boolean => false);
|
|
72
|
-
this.verifyReputation = deps.verifyReputation ?? ((): boolean => false);
|
|
73
|
-
this.verifyParentReference = deps.verifyParentReference ?? ((): boolean => false);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
verify(reg: RegisterV1, tier: number): boolean {
|
|
77
|
-
// A follow-on cold-start is gated identically to a root bootstrap — both must carry evidence.
|
|
78
|
-
// NOTE: follow-on cold-start is PoW-gated exactly like a root bootstrap; if a spoofed, PoW-paid
|
|
79
|
-
// follow-on instantiation ever shows up as real abuse, upgrade to a parent-vouched redirect —
|
|
80
|
-
// echo the parent cohort's threshold-signed PromotionNoticeV1 on the follow-on and verify it
|
|
81
|
-
// against the parent's MembershipCertV1 (needs a RegisterReplyV1 field + admission-path membership
|
|
82
|
-
// verify). See docs/cohort-topic.md §Anti-DoS "follow-on hardening".
|
|
83
|
-
if (reg.bootstrap !== true && reg.followOn !== true) {
|
|
84
|
-
return true; // only a cold-start (bootstrap or follow-on) must carry evidence
|
|
85
|
-
}
|
|
86
|
-
if (tier <= this.maxNoPowTier) {
|
|
87
|
-
// T0/T1: a signed reference to a committed parent topic is sufficient (no PoW expected).
|
|
88
|
-
const ok = this.verifyParentReference(reg);
|
|
89
|
-
if (!ok) {
|
|
90
|
-
log("bootstrap-evidence reject: tier=%d needs a signed parent reference", tier);
|
|
91
|
-
}
|
|
92
|
-
return ok;
|
|
93
|
-
}
|
|
94
|
-
// T2/T3: any one of PoW, a reputation signature, or a signed parent reference.
|
|
95
|
-
const ok = this.verifyPoW(reg) || this.verifyReputation(reg) || this.verifyParentReference(reg);
|
|
96
|
-
if (!ok) {
|
|
97
|
-
log("bootstrap-evidence reject: tier=%d needs PoW / reputation / parent reference", tier);
|
|
98
|
-
}
|
|
99
|
-
return ok;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/** Build a {@link BootstrapEvidence} policy over the injected (db-p2p-supplied) evidence verifiers. */
|
|
104
|
-
export function createBootstrapEvidence(deps: BootstrapEvidenceDeps = {}): BootstrapEvidence {
|
|
105
|
-
return new TieredBootstrapEvidence(deps);
|
|
106
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Cohort-topic substrate — bootstrap evidence policy (anti-DoS).
|
|
3
|
+
*
|
|
4
|
+
* Transcribed from `docs/cohort-topic.md` §Anti-DoS bullet 4. A cold cohort that accepts a cold-start
|
|
5
|
+
* registration must demand evidence, so a cold topic cannot be instantiated for free by an attacker.
|
|
6
|
+
* **A follow-on cold-start (`followOn: true`) is gated identically to a root bootstrap
|
|
7
|
+
* (`bootstrap: true`)**: the cold tier-`(d+1)` child a `Promoted` redirect points at is participant-
|
|
8
|
+
* asserted (the child cannot infer the redirect — the routing key decorrelates tiers and it holds no
|
|
9
|
+
* breadcrumb of where the participant came from), so its safety cannot rest on provenance; it rests on
|
|
10
|
+
* this gate paying the same anti-abuse cost the root already pays. The accepted evidence is
|
|
11
|
+
* **tier-dependent**:
|
|
12
|
+
*
|
|
13
|
+
* - **T0 / T1** — generally no proof-of-work, because these tiers correspond to committed work; a
|
|
14
|
+
* *signed reference to a committed parent topic that does exist* is sufficient.
|
|
15
|
+
* - **T2 / T3** — a **proof-of-work** OR a **reputation-score signature** (a signature from a peer
|
|
16
|
+
* with sufficient reputation, see `architecture.md` §Reputation) OR a **signed parent-topic
|
|
17
|
+
* reference**.
|
|
18
|
+
*
|
|
19
|
+
* This module is the *policy* — which evidence kinds satisfy which tier. The cryptographic checks
|
|
20
|
+
* themselves (verifying a PoW, a reputation signature, a parent-topic reference) are injected, keeping
|
|
21
|
+
* db-core free of any specific PoW/reputation scheme (the same injection discipline as the threshold
|
|
22
|
+
* crypto port). The evidence travels in the registration's dedicated, signature-covered
|
|
23
|
+
* `bootstrapEvidence` field — a versioned `BootstrapEvidenceEnvelopeV1`
|
|
24
|
+
* (`./bootstrap-evidence-envelope.js`), parsed crypto-free here and checked by the injected verifiers;
|
|
25
|
+
* NOT the opaque `appPayload` slot (which the cohort copies verbatim into the registration's appState).
|
|
26
|
+
* A registration that is neither a bootstrap nor a follow-on cold-start needs no evidence and is admitted.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import type { RegisterV1 } from "../wire/types.js";
|
|
30
|
+
import { createLogger } from "../../logger.js";
|
|
31
|
+
|
|
32
|
+
const log = createLogger("cohort-topic:antidos");
|
|
33
|
+
|
|
34
|
+
/** Tiers at/below this need no proof-of-work — a signed parent reference suffices (T0/T1). */
|
|
35
|
+
export const DEFAULT_MAX_NO_POW_TIER = 1;
|
|
36
|
+
|
|
37
|
+
export interface BootstrapEvidenceDeps {
|
|
38
|
+
/** Verify a proof-of-work attached to `reg` (T2/T3 path). Absent → PoW is never satisfiable. */
|
|
39
|
+
verifyPoW?: (reg: RegisterV1) => boolean;
|
|
40
|
+
/** Verify a sufficient-reputation signature on `reg` (T2/T3 path). Absent → never satisfiable. */
|
|
41
|
+
verifyReputation?: (reg: RegisterV1) => boolean;
|
|
42
|
+
/** Verify a signed reference to an existing committed parent topic (all tiers). Absent → never satisfiable. */
|
|
43
|
+
verifyParentReference?: (reg: RegisterV1) => boolean;
|
|
44
|
+
config?: BootstrapEvidenceConfig;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface BootstrapEvidenceConfig {
|
|
48
|
+
/** Highest tier exempt from proof-of-work (T0/T1 → 1). Default {@link DEFAULT_MAX_NO_POW_TIER}. */
|
|
49
|
+
maxNoPowTier?: number;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Tier-dependent bootstrap-evidence gate for cold-root registrations. */
|
|
53
|
+
export interface BootstrapEvidence {
|
|
54
|
+
/**
|
|
55
|
+
* Whether `reg` carries acceptable cold-start evidence for `tier`. A registration that is neither a
|
|
56
|
+
* `bootstrap` nor a `followOn` is always acceptable (nothing to prove). For a cold-start (either flag):
|
|
57
|
+
* T0/T1 require a signed parent reference; T2/T3 accept proof-of-work OR a reputation signature OR a
|
|
58
|
+
* signed parent reference.
|
|
59
|
+
*/
|
|
60
|
+
verify(reg: RegisterV1, tier: number): boolean;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
class TieredBootstrapEvidence implements BootstrapEvidence {
|
|
64
|
+
private readonly maxNoPowTier: number;
|
|
65
|
+
private readonly verifyPoW: (reg: RegisterV1) => boolean;
|
|
66
|
+
private readonly verifyReputation: (reg: RegisterV1) => boolean;
|
|
67
|
+
private readonly verifyParentReference: (reg: RegisterV1) => boolean;
|
|
68
|
+
|
|
69
|
+
constructor(deps: BootstrapEvidenceDeps = {}) {
|
|
70
|
+
this.maxNoPowTier = deps.config?.maxNoPowTier ?? DEFAULT_MAX_NO_POW_TIER;
|
|
71
|
+
this.verifyPoW = deps.verifyPoW ?? ((): boolean => false);
|
|
72
|
+
this.verifyReputation = deps.verifyReputation ?? ((): boolean => false);
|
|
73
|
+
this.verifyParentReference = deps.verifyParentReference ?? ((): boolean => false);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
verify(reg: RegisterV1, tier: number): boolean {
|
|
77
|
+
// A follow-on cold-start is gated identically to a root bootstrap — both must carry evidence.
|
|
78
|
+
// NOTE: follow-on cold-start is PoW-gated exactly like a root bootstrap; if a spoofed, PoW-paid
|
|
79
|
+
// follow-on instantiation ever shows up as real abuse, upgrade to a parent-vouched redirect —
|
|
80
|
+
// echo the parent cohort's threshold-signed PromotionNoticeV1 on the follow-on and verify it
|
|
81
|
+
// against the parent's MembershipCertV1 (needs a RegisterReplyV1 field + admission-path membership
|
|
82
|
+
// verify). See docs/cohort-topic.md §Anti-DoS "follow-on hardening".
|
|
83
|
+
if (reg.bootstrap !== true && reg.followOn !== true) {
|
|
84
|
+
return true; // only a cold-start (bootstrap or follow-on) must carry evidence
|
|
85
|
+
}
|
|
86
|
+
if (tier <= this.maxNoPowTier) {
|
|
87
|
+
// T0/T1: a signed reference to a committed parent topic is sufficient (no PoW expected).
|
|
88
|
+
const ok = this.verifyParentReference(reg);
|
|
89
|
+
if (!ok) {
|
|
90
|
+
log("bootstrap-evidence reject: tier=%d needs a signed parent reference", tier);
|
|
91
|
+
}
|
|
92
|
+
return ok;
|
|
93
|
+
}
|
|
94
|
+
// T2/T3: any one of PoW, a reputation signature, or a signed parent reference.
|
|
95
|
+
const ok = this.verifyPoW(reg) || this.verifyReputation(reg) || this.verifyParentReference(reg);
|
|
96
|
+
if (!ok) {
|
|
97
|
+
log("bootstrap-evidence reject: tier=%d needs PoW / reputation / parent reference", tier);
|
|
98
|
+
}
|
|
99
|
+
return ok;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Build a {@link BootstrapEvidence} policy over the injected (db-p2p-supplied) evidence verifiers. */
|
|
104
|
+
export function createBootstrapEvidence(deps: BootstrapEvidenceDeps = {}): BootstrapEvidence {
|
|
105
|
+
return new TieredBootstrapEvidence(deps);
|
|
106
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export * from "./rate-limiter.js";
|
|
2
|
-
export * from "./topic-budget.js";
|
|
3
|
-
export * from "./replay-guard.js";
|
|
4
|
-
export * from "./bootstrap-evidence.js";
|
|
5
|
-
export * from "./bootstrap-evidence-envelope.js";
|
|
1
|
+
export * from "./rate-limiter.js";
|
|
2
|
+
export * from "./topic-budget.js";
|
|
3
|
+
export * from "./replay-guard.js";
|
|
4
|
+
export * from "./bootstrap-evidence.js";
|
|
5
|
+
export * from "./bootstrap-evidence-envelope.js";
|