@optimystic/db-p2p 0.22.0 → 0.24.1
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/cluster/client.d.ts +10 -0
- package/dist/src/cluster/client.d.ts.map +1 -1
- package/dist/src/cluster/client.js +30 -1
- package/dist/src/cluster/client.js.map +1 -1
- package/dist/src/cluster/cluster-repo.d.ts +39 -14
- package/dist/src/cluster/cluster-repo.d.ts.map +1 -1
- package/dist/src/cluster/cluster-repo.js +226 -119
- package/dist/src/cluster/cluster-repo.js.map +1 -1
- package/dist/src/cluster/service.d.ts +32 -1
- package/dist/src/cluster/service.d.ts.map +1 -1
- package/dist/src/cluster/service.js +43 -2
- package/dist/src/cluster/service.js.map +1 -1
- package/dist/src/cohort-topic/host.js +34 -11
- package/dist/src/cohort-topic/host.js.map +1 -1
- package/dist/src/cohort-topic/stream-util.d.ts +37 -7
- package/dist/src/cohort-topic/stream-util.d.ts.map +1 -1
- package/dist/src/cohort-topic/stream-util.js +77 -19
- package/dist/src/cohort-topic/stream-util.js.map +1 -1
- package/dist/src/dispute/dispute-service.d.ts.map +1 -1
- package/dist/src/dispute/dispute-service.js +9 -3
- package/dist/src/dispute/dispute-service.js.map +1 -1
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/libp2p-key-network.d.ts +88 -2
- package/dist/src/libp2p-key-network.d.ts.map +1 -1
- package/dist/src/libp2p-key-network.js +134 -28
- package/dist/src/libp2p-key-network.js.map +1 -1
- package/dist/src/libp2p-node-base.d.ts.map +1 -1
- package/dist/src/libp2p-node-base.js +25 -1
- package/dist/src/libp2p-node-base.js.map +1 -1
- package/dist/src/logger.d.ts +17 -1
- package/dist/src/logger.d.ts.map +1 -1
- package/dist/src/logger.js +19 -2
- package/dist/src/logger.js.map +1 -1
- package/dist/src/matchmaking/query-transport.js +3 -3
- package/dist/src/matchmaking/query-transport.js.map +1 -1
- package/dist/src/owned-block-seed.d.ts +6 -3
- package/dist/src/owned-block-seed.d.ts.map +1 -1
- package/dist/src/owned-block-seed.js +16 -3
- package/dist/src/owned-block-seed.js.map +1 -1
- package/dist/src/peer-address-book.d.ts +72 -0
- package/dist/src/peer-address-book.d.ts.map +1 -0
- package/dist/src/peer-address-book.js +123 -0
- package/dist/src/peer-address-book.js.map +1 -0
- package/dist/src/reactivity/notify-transport.d.ts +4 -4
- package/dist/src/reactivity/notify-transport.js +6 -6
- package/dist/src/reactivity/notify-transport.js.map +1 -1
- package/dist/src/reactivity/push-state-gossip.js +2 -2
- package/dist/src/reactivity/push-state-gossip.js.map +1 -1
- package/dist/src/reactivity/recover-transport.d.ts +6 -2
- package/dist/src/reactivity/recover-transport.d.ts.map +1 -1
- package/dist/src/reactivity/recover-transport.js +7 -3
- package/dist/src/reactivity/recover-transport.js.map +1 -1
- package/dist/src/repo/client.d.ts.map +1 -1
- package/dist/src/repo/client.js +11 -2
- package/dist/src/repo/client.js.map +1 -1
- package/dist/src/repo/cluster-coordinator.d.ts +30 -0
- package/dist/src/repo/cluster-coordinator.d.ts.map +1 -1
- package/dist/src/repo/cluster-coordinator.js +95 -3
- package/dist/src/repo/cluster-coordinator.js.map +1 -1
- package/dist/src/repo/coordinator-repo.d.ts +62 -9
- package/dist/src/repo/coordinator-repo.d.ts.map +1 -1
- package/dist/src/repo/coordinator-repo.js +242 -73
- package/dist/src/repo/coordinator-repo.js.map +1 -1
- package/dist/src/rn.d.ts +3 -0
- package/dist/src/rn.d.ts.map +1 -1
- package/dist/src/rn.js +3 -0
- package/dist/src/rn.js.map +1 -1
- package/dist/src/storage/cached-raw-storage.d.ts +83 -0
- package/dist/src/storage/cached-raw-storage.d.ts.map +1 -0
- package/dist/src/storage/cached-raw-storage.js +152 -0
- package/dist/src/storage/cached-raw-storage.js.map +1 -0
- package/dist/src/storage/cached-store-driver.d.ts +186 -0
- package/dist/src/storage/cached-store-driver.d.ts.map +1 -0
- package/dist/src/storage/cached-store-driver.js +775 -0
- package/dist/src/storage/cached-store-driver.js.map +1 -0
- package/dist/src/storage/i-raw-storage.d.ts +12 -5
- package/dist/src/storage/i-raw-storage.d.ts.map +1 -1
- package/dist/src/storage/shared-cache-pool.d.ts +234 -0
- package/dist/src/storage/shared-cache-pool.d.ts.map +1 -0
- package/dist/src/storage/shared-cache-pool.js +354 -0
- package/dist/src/storage/shared-cache-pool.js.map +1 -0
- package/dist/src/testing/cohort-topic-mesh-harness.d.ts +13 -6
- package/dist/src/testing/cohort-topic-mesh-harness.d.ts.map +1 -1
- package/dist/src/testing/cohort-topic-mesh-harness.js +15 -6
- package/dist/src/testing/cohort-topic-mesh-harness.js.map +1 -1
- package/dist/src/testing/raw-storage-conformance.d.ts +2 -1
- package/dist/src/testing/raw-storage-conformance.d.ts.map +1 -1
- package/dist/src/testing/raw-storage-conformance.js +35 -2
- package/dist/src/testing/raw-storage-conformance.js.map +1 -1
- package/package.json +3 -3
- package/readme.md +668 -668
- package/src/cluster/block-transfer.ts +424 -424
- package/src/cluster/client.ts +119 -88
- package/src/cluster/cluster-error.ts +64 -64
- package/src/cluster/cluster-policy.ts +203 -203
- package/src/cluster/cluster-repo.ts +242 -122
- package/src/cluster/cluster-size-coupling.ts +45 -45
- package/src/cluster/commit-cert.ts +139 -139
- package/src/cluster/i-transaction-state-store.ts +43 -43
- package/src/cluster/memory-transaction-state-store.ts +56 -56
- package/src/cluster/peer-key-binding.ts +37 -37
- package/src/cluster/persistent-transaction-state-store.ts +92 -92
- package/src/cluster/quorum-restore.ts +223 -223
- package/src/cluster/reconcile-block.ts +203 -203
- package/src/cluster/service.ts +293 -241
- package/src/cluster/supermajority-coupling.ts +37 -37
- package/src/cohort-topic/bootstrap-evidence-builder.ts +122 -122
- package/src/cohort-topic/bootstrap-evidence-verifiers.ts +132 -132
- package/src/cohort-topic/bootstrap-parent-reference.ts +159 -159
- package/src/cohort-topic/change-bridge.ts +109 -109
- package/src/cohort-topic/cohort-gossip-driver.ts +231 -231
- package/src/cohort-topic/cohort-gossip-transport.ts +84 -84
- package/src/cohort-topic/fret-trust-anchor.ts +153 -153
- package/src/cohort-topic/host.ts +42 -11
- package/src/cohort-topic/index.ts +13 -13
- package/src/cohort-topic/membership-publish-sink.ts +20 -20
- package/src/cohort-topic/membership-source.ts +68 -68
- package/src/cohort-topic/peer-codec.ts +31 -31
- package/src/cohort-topic/peer-sig.ts +86 -86
- package/src/cohort-topic/protocols.ts +71 -71
- package/src/cohort-topic/reactivity-membership-gate.ts +77 -77
- package/src/cohort-topic/size-estimator.ts +16 -16
- package/src/cohort-topic/stream-util.ts +79 -19
- package/src/cohort-topic/threshold-crypto.ts +239 -239
- package/src/cohort-topic/topic-router.ts +77 -77
- package/src/dispute/arbitrator-selection.ts +138 -138
- package/src/dispute/cascade.ts +524 -524
- package/src/dispute/dispute-service.ts +11 -5
- package/src/dispute/invalidation.ts +625 -625
- package/src/inbound-authorization.ts +190 -190
- package/src/index.ts +52 -49
- package/src/libp2p-key-network.ts +1120 -990
- package/src/libp2p-node-base.ts +1675 -1651
- package/src/libp2p-node-rn.ts +30 -30
- package/src/libp2p-node.ts +36 -36
- package/src/logger.ts +19 -2
- package/src/matchmaking/aggregate-counts.ts +104 -104
- package/src/matchmaking/index.ts +20 -20
- package/src/matchmaking/module.ts +363 -363
- package/src/matchmaking/protocols.ts +51 -51
- package/src/matchmaking/provider-manager.ts +95 -95
- package/src/matchmaking/query-handler.ts +88 -88
- package/src/matchmaking/query-transport.ts +3 -3
- package/src/matchmaking/seeker-manager.ts +64 -64
- package/src/matchmaking/seeker-walk-client.ts +293 -293
- package/src/matchmaking/traffic-validation.ts +195 -195
- package/src/optimystic-node.ts +36 -36
- package/src/owned-block-seed.ts +53 -40
- package/src/peer-address-book.ts +149 -0
- package/src/protocol-limits.ts +33 -33
- package/src/reactivity/forwarder-host.ts +438 -438
- package/src/reactivity/index.ts +19 -19
- package/src/reactivity/notify-transport.ts +144 -144
- package/src/reactivity/origination-manager.ts +192 -192
- package/src/reactivity/protocols.ts +61 -61
- package/src/reactivity/push-state-gossip.ts +291 -291
- package/src/reactivity/recover-transport.ts +7 -3
- package/src/reactivity/rotation-rereg-scheduler.ts +256 -256
- package/src/reactivity/subscriber-registry.ts +96 -96
- package/src/reactivity/subscription-manager.ts +450 -450
- package/src/reactivity/topic-bytes.ts +37 -37
- package/src/repo/client.ts +12 -2
- package/src/repo/cluster-coordinator.ts +99 -3
- package/src/repo/coordinator-repo.ts +281 -74
- package/src/repo/types.ts +7 -7
- package/src/rn.ts +39 -36
- package/src/rpc-deadline.ts +45 -45
- package/src/storage/arachnode-partition.ts +74 -74
- package/src/storage/cached-raw-storage.ts +180 -0
- package/src/storage/cached-store-driver.ts +859 -0
- package/src/storage/i-kv-store.ts +8 -8
- package/src/storage/i-raw-storage.ts +12 -5
- package/src/storage/kv-raw-storage.ts +135 -135
- package/src/storage/memory-kv-store.ts +28 -28
- package/src/storage/memory-storage.ts +25 -25
- package/src/storage/memory-store-driver.ts +157 -157
- package/src/storage/raw-store-codec.ts +42 -42
- package/src/storage/raw-store-driver.ts +80 -80
- package/src/storage/ring-selector.ts +317 -317
- package/src/storage/ring-shift-coordinator.ts +271 -271
- package/src/storage/shared-cache-pool.ts +452 -0
- package/src/storage/storage-repo.ts +1014 -1014
- package/src/testing/cohort-topic-mesh-harness.ts +673 -663
- package/src/testing/index.ts +8 -8
- package/src/testing/matchmaking-mesh-harness.ts +475 -475
- package/src/testing/raw-storage-conformance.ts +453 -417
- package/src/testing/reactivity-mesh-harness.ts +922 -922
- package/dist/src/storage/restoration-coordinator-v2.d.ts +0 -67
- package/dist/src/storage/restoration-coordinator-v2.d.ts.map +0 -1
- package/dist/src/storage/restoration-coordinator-v2.js +0 -172
- package/dist/src/storage/restoration-coordinator-v2.js.map +0 -1
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import type { PeerId } from '@libp2p/interface'
|
|
2
|
+
import { peerIdFromString } from '@libp2p/peer-id'
|
|
3
|
+
import { multiaddr, type Multiaddr } from '@multiformats/multiaddr'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Cap on addresses merged per peer from one application-level message.
|
|
7
|
+
*
|
|
8
|
+
* Without a cap, a crafted cluster record or redirect payload could stuff the address
|
|
9
|
+
* book and turn every cohort member into a dial amplifier aimed at an address of the
|
|
10
|
+
* sender's choosing. This bounds the per-peer cost;
|
|
11
|
+
* {@link MAX_LEARNED_PEERS_PER_RECORD} bounds how many peers one record may introduce.
|
|
12
|
+
*/
|
|
13
|
+
export const MAX_MERGED_ADDRS_PER_PEER = 8
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Cap on how many distinct peers one cluster record may teach us addresses for.
|
|
17
|
+
*
|
|
18
|
+
* A record's peer map is NOT self-limiting: `ClusterService.processOperation` learns from it
|
|
19
|
+
* before `checkRedirect` and before `cluster.update` validates a single signature, and inbound
|
|
20
|
+
* stream authorization is opt-in (`authorizeInboundStream` is undefined by default), so the map
|
|
21
|
+
* is attacker-authored at that point. One 1 MiB control message (`MAX_CONTROL_MESSAGE_BYTES`)
|
|
22
|
+
* holds on the order of a thousand fabricated `{ id, multiaddrs, publicKey }` entries, each of
|
|
23
|
+
* which would otherwise become a persisted peerStore record. Real cohorts are `clusterSize`
|
|
24
|
+
* peers — single digits — so this is generous margin, not a functional limit.
|
|
25
|
+
*/
|
|
26
|
+
export const MAX_LEARNED_PEERS_PER_RECORD = 64
|
|
27
|
+
|
|
28
|
+
/** The narrow slice of libp2p this module needs — a peer id and (optionally) a peerStore writer. */
|
|
29
|
+
export interface PeerAddressBookHost {
|
|
30
|
+
peerId: PeerId
|
|
31
|
+
peerStore?: {
|
|
32
|
+
merge?: (id: PeerId, data: { multiaddrs: Multiaddr[] }) => Promise<unknown>
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Log sink shaped like both `debug` loggers and libp2p's `Logger`. */
|
|
37
|
+
export type AddressLog = (fmt: string, ...args: unknown[]) => void
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Keep only the entries that parse as multiaddrs, logging (but not throwing on) the rest.
|
|
41
|
+
*
|
|
42
|
+
* The single validator for address strings arriving from the wire or from a connection —
|
|
43
|
+
* `Libp2pKeyPeerNetwork.parseMultiaddrs` delegates here so there is one definition of
|
|
44
|
+
* "an address string we are willing to carry".
|
|
45
|
+
*/
|
|
46
|
+
export function validMultiaddrStrings(addrs: string[], log: AddressLog): string[] {
|
|
47
|
+
const out: string[] = []
|
|
48
|
+
for (const a of addrs) {
|
|
49
|
+
try {
|
|
50
|
+
// An empty string parses as the root multiaddr `/` — syntactically fine, addresses
|
|
51
|
+
// nothing, and encodes to zero bytes. Reject it so a blank entry can't occupy a slot
|
|
52
|
+
// in the address book (or in the per-message cap).
|
|
53
|
+
if (multiaddr(a).bytes.length === 0) {
|
|
54
|
+
log('WARN: multiaddr addresses nothing %s', a)
|
|
55
|
+
continue
|
|
56
|
+
}
|
|
57
|
+
out.push(a)
|
|
58
|
+
} catch (err) {
|
|
59
|
+
log('WARN: invalid multiaddr %s %o', a, err)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return out
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Write dialable addresses for `peerId` into the libp2p address book, from addresses
|
|
67
|
+
* carried by an application-level message.
|
|
68
|
+
*
|
|
69
|
+
* Trust boundary: a merged multiaddr only makes a dial *attempt* possible. The dialed
|
|
70
|
+
* peer still authenticates by peer id at the noise handshake, so an address taken from
|
|
71
|
+
* a record we have not otherwise verified can waste a dial but can never impersonate.
|
|
72
|
+
* That is precisely why it is safe to consume addresses from an unverified message —
|
|
73
|
+
* and why the cost, not the authenticity, is what needs bounding (see
|
|
74
|
+
* {@link MAX_MERGED_ADDRS_PER_PEER}).
|
|
75
|
+
*/
|
|
76
|
+
export function mergePeerAddresses(
|
|
77
|
+
host: PeerAddressBookHost,
|
|
78
|
+
peerId: PeerId,
|
|
79
|
+
addrs: string[],
|
|
80
|
+
log: AddressLog
|
|
81
|
+
): void {
|
|
82
|
+
// A self entry is meaningless to our own dialer and, for a relay-only self, self-referential.
|
|
83
|
+
if (peerId.toString() === host.peerId.toString()) return
|
|
84
|
+
if (addrs.length === 0) return
|
|
85
|
+
|
|
86
|
+
const merge = host.peerStore?.merge
|
|
87
|
+
if (typeof merge !== 'function') return
|
|
88
|
+
|
|
89
|
+
const valid = validMultiaddrStrings(addrs, log)
|
|
90
|
+
if (valid.length === 0) return
|
|
91
|
+
if (valid.length > MAX_MERGED_ADDRS_PER_PEER) {
|
|
92
|
+
log('peer-address-book:capped peer=%s offered=%d kept=%d',
|
|
93
|
+
peerId.toString().substring(0, 12), valid.length, MAX_MERGED_ADDRS_PER_PEER)
|
|
94
|
+
}
|
|
95
|
+
const multiaddrs = valid.slice(0, MAX_MERGED_ADDRS_PER_PEER).map(a => multiaddr(a))
|
|
96
|
+
|
|
97
|
+
log('peer-address-book:merge peer=%s addrs=%d', peerId.toString().substring(0, 12), multiaddrs.length)
|
|
98
|
+
// `merge` is async and nothing downstream awaits the address book — the very next dial
|
|
99
|
+
// either sees the entry or falls back to the same failure it had before. Log a rejection
|
|
100
|
+
// rather than swallowing it: a persistently failing peerStore is exactly the condition
|
|
101
|
+
// that would make this whole mechanism silently inert.
|
|
102
|
+
void Promise.resolve(merge.call(host.peerStore, peerId, { multiaddrs }))
|
|
103
|
+
.catch((err: unknown) => log('WARN: peerStore.merge failed peer=%s %o', peerId.toString().substring(0, 12), err))
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** The peer map a `ClusterRecord` carries, as it arrives off the wire (nothing about it is trusted). */
|
|
107
|
+
export type RecordPeerMap = Record<string, { multiaddrs?: string[] } | undefined>
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Offer the addresses a cluster record carries for its cohort to an address-book `sink`, one
|
|
111
|
+
* peer at a time.
|
|
112
|
+
*
|
|
113
|
+
* The one traversal shared by both record ingress points — `ClusterService` (inbound, from the
|
|
114
|
+
* coordinator) and `ClusterClient` (outbound, from a member's reply) — so the entries a record is
|
|
115
|
+
* allowed to introduce are bounded in one place rather than two. Entries with no addresses, with
|
|
116
|
+
* an id equal to `skipId`, or with an unparseable id are dropped; everything past
|
|
117
|
+
* {@link MAX_LEARNED_PEERS_PER_RECORD} candidates is dropped with a log line. The per-address
|
|
118
|
+
* validation, the per-peer cap, and the trust boundary live behind `sink`
|
|
119
|
+
* (see {@link mergePeerAddresses}).
|
|
120
|
+
*/
|
|
121
|
+
export function mergeRecordPeerAddresses(
|
|
122
|
+
peers: RecordPeerMap | undefined,
|
|
123
|
+
sink: (peerId: PeerId, addrs: string[]) => void,
|
|
124
|
+
log: AddressLog,
|
|
125
|
+
skipId?: string
|
|
126
|
+
): void {
|
|
127
|
+
let offered = 0
|
|
128
|
+
for (const [idStr, peer] of Object.entries(peers ?? {})) {
|
|
129
|
+
const addrs = peer?.multiaddrs ?? []
|
|
130
|
+
if (addrs.length === 0 || idStr === skipId) continue
|
|
131
|
+
if (offered >= MAX_LEARNED_PEERS_PER_RECORD) {
|
|
132
|
+
// Count candidates, not successes, so a record full of unparseable ids cannot spend
|
|
133
|
+
// unbounded parse attempts and log lines either.
|
|
134
|
+
log('peer-address-book:record-capped kept=%d', MAX_LEARNED_PEERS_PER_RECORD)
|
|
135
|
+
return
|
|
136
|
+
}
|
|
137
|
+
offered += 1
|
|
138
|
+
let pid: PeerId
|
|
139
|
+
try {
|
|
140
|
+
pid = peerIdFromString(idStr)
|
|
141
|
+
} catch (err) {
|
|
142
|
+
// An id we cannot parse is not dialable by any route; the consensus path surfaces the
|
|
143
|
+
// resulting membership failure on its own.
|
|
144
|
+
log('WARN: record carried an unparseable peer id %s %o', idStr, err)
|
|
145
|
+
continue
|
|
146
|
+
}
|
|
147
|
+
sink(pid, addrs)
|
|
148
|
+
}
|
|
149
|
+
}
|
package/src/protocol-limits.ts
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Inbound-message size caps for the db-p2p consensus protocols.
|
|
3
|
-
*
|
|
4
|
-
* Every inbound stream handler frames its wire data with length-prefixed
|
|
5
|
-
* encoding (`it-length-prefixed`) and `JSON.parse`s each frame. Passing one of
|
|
6
|
-
* these constants as the decoder's `maxDataLength` makes an oversized frame
|
|
7
|
-
* reject at the length-prefix (before any allocation against the declared size)
|
|
8
|
-
* instead of buffering up to the library default (4 MiB) of attacker-controlled
|
|
9
|
-
* JSON per frame. Mirrors the existing precedent
|
|
10
|
-
* `DEFAULT_MAX_MESSAGE_BYTES = 1024 * 1024` in
|
|
11
|
-
* `packages/db-core/src/cohort-topic/wire/codec.ts`.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Max size (bytes) of a single inbound framed message on a *control-plane*
|
|
16
|
-
* protocol — cluster records, dispute votes, sync requests. These carry a peer
|
|
17
|
-
* set + signatures + small metadata, never bulk block data.
|
|
18
|
-
*/
|
|
19
|
-
export const MAX_CONTROL_MESSAGE_BYTES = 1 * 1024 * 1024; // 1 MiB
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Max size (bytes) of a single inbound framed message on a *block-carrying*
|
|
23
|
-
* protocol — repo operations (pend/commit transforms + block bodies),
|
|
24
|
-
* block-transfer push payloads (base64-inflated block data, multiple per
|
|
25
|
-
* request), and the block-bearing responses those protocols return.
|
|
26
|
-
*
|
|
27
|
-
* NOTE: the repo enforces no hard per-block byte ceiling today, so this is a
|
|
28
|
-
* heuristic. If a legitimate block/transform can exceed this, the transfer will
|
|
29
|
-
* be rejected — raise this constant (or thread a config override) rather than
|
|
30
|
-
* removing the cap. If the repo later grows a real max-block constant, derive
|
|
31
|
-
* this cap from it.
|
|
32
|
-
*/
|
|
33
|
-
export const MAX_BLOCK_MESSAGE_BYTES = 8 * 1024 * 1024; // 8 MiB
|
|
1
|
+
/**
|
|
2
|
+
* Inbound-message size caps for the db-p2p consensus protocols.
|
|
3
|
+
*
|
|
4
|
+
* Every inbound stream handler frames its wire data with length-prefixed
|
|
5
|
+
* encoding (`it-length-prefixed`) and `JSON.parse`s each frame. Passing one of
|
|
6
|
+
* these constants as the decoder's `maxDataLength` makes an oversized frame
|
|
7
|
+
* reject at the length-prefix (before any allocation against the declared size)
|
|
8
|
+
* instead of buffering up to the library default (4 MiB) of attacker-controlled
|
|
9
|
+
* JSON per frame. Mirrors the existing precedent
|
|
10
|
+
* `DEFAULT_MAX_MESSAGE_BYTES = 1024 * 1024` in
|
|
11
|
+
* `packages/db-core/src/cohort-topic/wire/codec.ts`.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Max size (bytes) of a single inbound framed message on a *control-plane*
|
|
16
|
+
* protocol — cluster records, dispute votes, sync requests. These carry a peer
|
|
17
|
+
* set + signatures + small metadata, never bulk block data.
|
|
18
|
+
*/
|
|
19
|
+
export const MAX_CONTROL_MESSAGE_BYTES = 1 * 1024 * 1024; // 1 MiB
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Max size (bytes) of a single inbound framed message on a *block-carrying*
|
|
23
|
+
* protocol — repo operations (pend/commit transforms + block bodies),
|
|
24
|
+
* block-transfer push payloads (base64-inflated block data, multiple per
|
|
25
|
+
* request), and the block-bearing responses those protocols return.
|
|
26
|
+
*
|
|
27
|
+
* NOTE: the repo enforces no hard per-block byte ceiling today, so this is a
|
|
28
|
+
* heuristic. If a legitimate block/transform can exceed this, the transfer will
|
|
29
|
+
* be rejected — raise this constant (or thread a config override) rather than
|
|
30
|
+
* removing the cap. If the repo later grows a real max-block constant, derive
|
|
31
|
+
* this cap from it.
|
|
32
|
+
*/
|
|
33
|
+
export const MAX_BLOCK_MESSAGE_BYTES = 8 * 1024 * 1024; // 8 MiB
|