@optimystic/db-p2p 0.2.3 → 0.3.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/dist/src/cluster/block-transfer-service.d.ts +66 -0
- package/dist/src/cluster/block-transfer-service.d.ts.map +1 -0
- package/dist/src/cluster/block-transfer-service.js +163 -0
- package/dist/src/cluster/block-transfer-service.js.map +1 -0
- package/dist/src/cluster/block-transfer.d.ts +79 -0
- package/dist/src/cluster/block-transfer.d.ts.map +1 -0
- package/dist/src/cluster/block-transfer.js +211 -0
- package/dist/src/cluster/block-transfer.js.map +1 -0
- package/dist/src/cluster/cluster-repo.d.ts +14 -3
- package/dist/src/cluster/cluster-repo.d.ts.map +1 -1
- package/dist/src/cluster/cluster-repo.js +80 -35
- package/dist/src/cluster/cluster-repo.js.map +1 -1
- package/dist/src/cluster/rebalance-monitor.d.ts +64 -0
- package/dist/src/cluster/rebalance-monitor.d.ts.map +1 -0
- package/dist/src/cluster/rebalance-monitor.js +159 -0
- package/dist/src/cluster/rebalance-monitor.js.map +1 -0
- package/dist/src/cluster/service.js +1 -1
- package/dist/src/cluster/service.js.map +1 -1
- package/dist/src/dispute/arbitrator-selection.d.ts +10 -0
- package/dist/src/dispute/arbitrator-selection.d.ts.map +1 -0
- package/dist/src/dispute/arbitrator-selection.js +22 -0
- package/dist/src/dispute/arbitrator-selection.js.map +1 -0
- package/dist/src/dispute/client.d.ts +17 -0
- package/dist/src/dispute/client.d.ts.map +1 -0
- package/dist/src/dispute/client.js +28 -0
- package/dist/src/dispute/client.js.map +1 -0
- package/dist/src/dispute/dispute-service.d.ts +81 -0
- package/dist/src/dispute/dispute-service.d.ts.map +1 -0
- package/dist/src/dispute/dispute-service.js +365 -0
- package/dist/src/dispute/dispute-service.js.map +1 -0
- package/dist/src/dispute/engine-health-monitor.d.ts +22 -0
- package/dist/src/dispute/engine-health-monitor.d.ts.map +1 -0
- package/dist/src/dispute/engine-health-monitor.js +75 -0
- package/dist/src/dispute/engine-health-monitor.js.map +1 -0
- package/dist/src/dispute/index.d.ts +7 -0
- package/dist/src/dispute/index.d.ts.map +1 -0
- package/dist/src/dispute/index.js +7 -0
- package/dist/src/dispute/index.js.map +1 -0
- package/dist/src/dispute/service.d.ts +41 -0
- package/dist/src/dispute/service.d.ts.map +1 -0
- package/dist/src/dispute/service.js +82 -0
- package/dist/src/dispute/service.js.map +1 -0
- package/dist/src/dispute/types.d.ts +106 -0
- package/dist/src/dispute/types.d.ts.map +1 -0
- package/dist/src/dispute/types.js +7 -0
- package/dist/src/dispute/types.js.map +1 -0
- 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 +23 -2
- package/dist/src/libp2p-key-network.d.ts.map +1 -1
- package/dist/src/libp2p-key-network.js +100 -15
- package/dist/src/libp2p-key-network.js.map +1 -1
- package/dist/src/libp2p-node-base.d.ts +6 -0
- package/dist/src/libp2p-node-base.d.ts.map +1 -1
- package/dist/src/libp2p-node-base.js +66 -12
- package/dist/src/libp2p-node-base.js.map +1 -1
- package/dist/src/logger.d.ts +1 -0
- package/dist/src/logger.d.ts.map +1 -1
- package/dist/src/logger.js +2 -0
- package/dist/src/logger.js.map +1 -1
- package/dist/src/network/network-manager-service.d.ts +15 -4
- package/dist/src/network/network-manager-service.d.ts.map +1 -1
- package/dist/src/network/network-manager-service.js +33 -20
- package/dist/src/network/network-manager-service.js.map +1 -1
- package/dist/src/protocol-client.d.ts +1 -0
- package/dist/src/protocol-client.d.ts.map +1 -1
- package/dist/src/protocol-client.js +23 -2
- package/dist/src/protocol-client.js.map +1 -1
- package/dist/src/repo/client.d.ts +1 -0
- package/dist/src/repo/client.d.ts.map +1 -1
- package/dist/src/repo/client.js +18 -1
- package/dist/src/repo/client.js.map +1 -1
- package/dist/src/repo/cluster-coordinator.d.ts +3 -1
- package/dist/src/repo/cluster-coordinator.d.ts.map +1 -1
- package/dist/src/repo/cluster-coordinator.js +42 -2
- package/dist/src/repo/cluster-coordinator.js.map +1 -1
- package/dist/src/repo/coordinator-repo.d.ts +18 -2
- package/dist/src/repo/coordinator-repo.d.ts.map +1 -1
- package/dist/src/repo/coordinator-repo.js +62 -6
- package/dist/src/repo/coordinator-repo.js.map +1 -1
- package/dist/src/repo/service.d.ts +18 -2
- package/dist/src/repo/service.d.ts.map +1 -1
- package/dist/src/repo/service.js +88 -91
- package/dist/src/repo/service.js.map +1 -1
- package/dist/src/reputation/index.d.ts +3 -0
- package/dist/src/reputation/index.d.ts.map +1 -0
- package/dist/src/reputation/index.js +3 -0
- package/dist/src/reputation/index.js.map +1 -0
- package/dist/src/reputation/peer-reputation.d.ts +23 -0
- package/dist/src/reputation/peer-reputation.d.ts.map +1 -0
- package/dist/src/reputation/peer-reputation.js +121 -0
- package/dist/src/reputation/peer-reputation.js.map +1 -0
- package/dist/src/reputation/types.d.ts +89 -0
- package/dist/src/reputation/types.d.ts.map +1 -0
- package/dist/src/reputation/types.js +42 -0
- package/dist/src/reputation/types.js.map +1 -0
- package/dist/src/storage/arachnode-fret-adapter.d.ts +5 -0
- package/dist/src/storage/arachnode-fret-adapter.d.ts.map +1 -1
- package/dist/src/storage/arachnode-fret-adapter.js +10 -0
- package/dist/src/storage/arachnode-fret-adapter.js.map +1 -1
- package/dist/src/storage/block-storage.d.ts.map +1 -1
- package/dist/src/storage/block-storage.js +5 -0
- package/dist/src/storage/block-storage.js.map +1 -1
- package/dist/src/storage/storage-repo.d.ts.map +1 -1
- package/dist/src/storage/storage-repo.js +8 -0
- package/dist/src/storage/storage-repo.js.map +1 -1
- package/package.json +11 -10
- package/src/cluster/block-transfer-service.ts +228 -0
- package/src/cluster/block-transfer.ts +284 -0
- package/src/cluster/cluster-repo.ts +93 -38
- package/src/cluster/rebalance-monitor.ts +225 -0
- package/src/dispute/arbitrator-selection.ts +28 -0
- package/src/dispute/client.ts +41 -0
- package/src/dispute/dispute-service.ts +453 -0
- package/src/dispute/engine-health-monitor.ts +86 -0
- package/src/dispute/index.ts +17 -0
- package/src/dispute/service.ts +119 -0
- package/src/dispute/types.ts +114 -0
- package/src/index.ts +3 -0
- package/src/libp2p-key-network.ts +120 -22
- package/src/libp2p-node-base.ts +77 -13
- package/src/logger.ts +2 -1
- package/src/network/network-manager-service.ts +47 -16
- package/src/protocol-client.ts +29 -7
- package/src/repo/client.ts +20 -6
- package/src/repo/cluster-coordinator.ts +43 -2
- package/src/repo/coordinator-repo.ts +70 -7
- package/src/repo/redirect.ts +0 -2
- package/src/repo/service.ts +95 -87
- package/src/reputation/index.ts +12 -0
- package/src/reputation/peer-reputation.ts +147 -0
- package/src/reputation/types.ts +117 -0
- package/src/storage/arachnode-fret-adapter.ts +11 -0
- package/src/storage/block-storage.ts +6 -0
- package/src/storage/storage-repo.ts +9 -0
- package/dist/index.min.js +0 -53
- package/dist/index.min.js.map +0 -7
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { DEFAULT_DISPUTE_CONFIG } from './types.js';
|
|
2
|
+
import { createLogger } from '../logger.js';
|
|
3
|
+
const log = createLogger('engine-health');
|
|
4
|
+
/**
|
|
5
|
+
* Tracks local engine health based on dispute outcomes.
|
|
6
|
+
* When the node repeatedly loses disputes (its validations are wrong),
|
|
7
|
+
* it flags itself as unhealthy and stops participating in promise voting.
|
|
8
|
+
*/
|
|
9
|
+
export class EngineHealthMonitor {
|
|
10
|
+
state = {
|
|
11
|
+
disputesLost: 0,
|
|
12
|
+
recentLosses: [],
|
|
13
|
+
unhealthy: false,
|
|
14
|
+
};
|
|
15
|
+
threshold;
|
|
16
|
+
windowMs;
|
|
17
|
+
constructor(config) {
|
|
18
|
+
this.threshold = config?.engineHealthDisputeThreshold ?? DEFAULT_DISPUTE_CONFIG.engineHealthDisputeThreshold;
|
|
19
|
+
this.windowMs = config?.engineHealthWindowMs ?? DEFAULT_DISPUTE_CONFIG.engineHealthWindowMs;
|
|
20
|
+
}
|
|
21
|
+
/** Record a dispute loss (our validation was wrong) */
|
|
22
|
+
recordDisputeLoss() {
|
|
23
|
+
const now = Date.now();
|
|
24
|
+
this.state.recentLosses.push(now);
|
|
25
|
+
this.pruneOldLosses(now);
|
|
26
|
+
this.state.disputesLost = this.state.recentLosses.length;
|
|
27
|
+
log('dispute-loss-recorded', {
|
|
28
|
+
recentLosses: this.state.recentLosses.length,
|
|
29
|
+
threshold: this.threshold,
|
|
30
|
+
wasUnhealthy: this.state.unhealthy,
|
|
31
|
+
});
|
|
32
|
+
if (this.state.recentLosses.length >= this.threshold && !this.state.unhealthy) {
|
|
33
|
+
this.state.unhealthy = true;
|
|
34
|
+
this.state.unhealthySince = now;
|
|
35
|
+
log('engine-marked-unhealthy', {
|
|
36
|
+
disputesLost: this.state.recentLosses.length,
|
|
37
|
+
threshold: this.threshold,
|
|
38
|
+
windowMs: this.windowMs,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Check if the engine is currently unhealthy */
|
|
43
|
+
isUnhealthy() {
|
|
44
|
+
this.pruneOldLosses(Date.now());
|
|
45
|
+
// Auto-recover if losses drop below threshold
|
|
46
|
+
if (this.state.unhealthy && this.state.recentLosses.length < this.threshold) {
|
|
47
|
+
this.state.unhealthy = false;
|
|
48
|
+
this.state.unhealthySince = undefined;
|
|
49
|
+
log('engine-auto-recovered', {
|
|
50
|
+
recentLosses: this.state.recentLosses.length,
|
|
51
|
+
threshold: this.threshold,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return this.state.unhealthy;
|
|
55
|
+
}
|
|
56
|
+
/** Get the current health state */
|
|
57
|
+
getState() {
|
|
58
|
+
this.pruneOldLosses(Date.now());
|
|
59
|
+
return { ...this.state };
|
|
60
|
+
}
|
|
61
|
+
/** Reset health state (for testing or admin recovery) */
|
|
62
|
+
reset() {
|
|
63
|
+
this.state = {
|
|
64
|
+
disputesLost: 0,
|
|
65
|
+
recentLosses: [],
|
|
66
|
+
unhealthy: false,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
pruneOldLosses(now) {
|
|
70
|
+
const cutoff = now - this.windowMs;
|
|
71
|
+
this.state.recentLosses = this.state.recentLosses.filter(t => t > cutoff);
|
|
72
|
+
this.state.disputesLost = this.state.recentLosses.length;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=engine-health-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-health-monitor.js","sourceRoot":"","sources":["../../../src/dispute/engine-health-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { DisputeService, type CreateDisputeClient, type RevalidateTransaction, type DisputeServiceInit } from './dispute-service.js';
|
|
2
|
+
export { DisputeClient } from './client.js';
|
|
3
|
+
export { DisputeProtocolService, disputeProtocolService, type DisputeProtocolServiceComponents, type DisputeProtocolServiceInit } from './service.js';
|
|
4
|
+
export { EngineHealthMonitor } from './engine-health-monitor.js';
|
|
5
|
+
export { type ValidationEvidence, type DisputeChallenge, type ArbitrationVote, type DisputeResolution, type DisputeMessage, type DisputeStatus, type DisputeConfig, type DisputePenaltyReason, type EngineHealthState, DEFAULT_DISPUTE_CONFIG, } from './types.js';
|
|
6
|
+
export { selectArbitrators } from './arbitrator-selection.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dispute/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,KAAK,qBAAqB,EAAE,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrI,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,KAAK,gCAAgC,EAAE,KAAK,0BAA0B,EAAE,MAAM,cAAc,CAAC;AACtJ,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EACN,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,sBAAsB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { DisputeService } from './dispute-service.js';
|
|
2
|
+
export { DisputeClient } from './client.js';
|
|
3
|
+
export { DisputeProtocolService, disputeProtocolService } from './service.js';
|
|
4
|
+
export { EngineHealthMonitor } from './engine-health-monitor.js';
|
|
5
|
+
export { DEFAULT_DISPUTE_CONFIG, } from './types.js';
|
|
6
|
+
export { selectArbitrators } from './arbitrator-selection.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dispute/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAiF,MAAM,sBAAsB,CAAC;AACrI,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAA0E,MAAM,cAAc,CAAC;AACtJ,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAUN,sBAAsB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Startable, Logger, StreamHandler } from '@libp2p/interface';
|
|
2
|
+
import type { DisputeService } from './dispute-service.js';
|
|
3
|
+
interface BaseComponents {
|
|
4
|
+
logger: {
|
|
5
|
+
forComponent: (name: string) => Logger;
|
|
6
|
+
};
|
|
7
|
+
registrar: {
|
|
8
|
+
handle: (protocol: string, handler: StreamHandler, options: any) => Promise<void>;
|
|
9
|
+
unhandle: (protocol: string) => Promise<void>;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export interface DisputeProtocolServiceComponents extends BaseComponents {
|
|
13
|
+
disputeService: DisputeService;
|
|
14
|
+
}
|
|
15
|
+
export interface DisputeProtocolServiceInit {
|
|
16
|
+
protocol?: string;
|
|
17
|
+
protocolPrefix?: string;
|
|
18
|
+
maxInboundStreams?: number;
|
|
19
|
+
maxOutboundStreams?: number;
|
|
20
|
+
}
|
|
21
|
+
export declare function disputeProtocolService(init?: DisputeProtocolServiceInit): (components: DisputeProtocolServiceComponents) => DisputeProtocolService;
|
|
22
|
+
/**
|
|
23
|
+
* Libp2p service that handles dispute protocol messages.
|
|
24
|
+
* Follows the same pattern as ClusterService.
|
|
25
|
+
*/
|
|
26
|
+
export declare class DisputeProtocolService implements Startable {
|
|
27
|
+
private readonly protocol;
|
|
28
|
+
private readonly maxInboundStreams;
|
|
29
|
+
private readonly maxOutboundStreams;
|
|
30
|
+
private readonly log;
|
|
31
|
+
private readonly disputeService;
|
|
32
|
+
private readonly components;
|
|
33
|
+
private running;
|
|
34
|
+
constructor(components: DisputeProtocolServiceComponents, init?: DisputeProtocolServiceInit);
|
|
35
|
+
readonly [Symbol.toStringTag] = "@libp2p/dispute";
|
|
36
|
+
start(): Promise<void>;
|
|
37
|
+
stop(): Promise<void>;
|
|
38
|
+
private handleIncomingStream;
|
|
39
|
+
}
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/dispute/service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAsB,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAG9F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,UAAU,cAAc;IACvB,MAAM,EAAE;QAAE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;KAAE,CAAC;IACnD,SAAS,EAAE;QACV,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAClF,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAC9C,CAAC;CACF;AAED,MAAM,WAAW,gCAAiC,SAAQ,cAAc;IACvE,cAAc,EAAE,cAAc,CAAC;CAC/B;AAED,MAAM,WAAW,0BAA0B;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,sBAAsB,CAAC,IAAI,GAAE,0BAA+B,GAAG,CAAC,UAAU,EAAE,gCAAgC,KAAK,sBAAsB,CAEtJ;AAED;;;GAGG;AACH,qBAAa,sBAAuB,YAAW,SAAS;IACvD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmC;IAC9D,OAAO,CAAC,OAAO,CAAU;gBAEb,UAAU,EAAE,gCAAgC,EAAE,IAAI,GAAE,0BAA+B;IAU/F,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,qBAAqB;IAE5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,OAAO,CAAC,oBAAoB;CA8C5B"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { pipe } from 'it-pipe';
|
|
2
|
+
import { decode as lpDecode, encode as lpEncode } from 'it-length-prefixed';
|
|
3
|
+
export function disputeProtocolService(init = {}) {
|
|
4
|
+
return (components) => new DisputeProtocolService(components, init);
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Libp2p service that handles dispute protocol messages.
|
|
8
|
+
* Follows the same pattern as ClusterService.
|
|
9
|
+
*/
|
|
10
|
+
export class DisputeProtocolService {
|
|
11
|
+
protocol;
|
|
12
|
+
maxInboundStreams;
|
|
13
|
+
maxOutboundStreams;
|
|
14
|
+
log;
|
|
15
|
+
disputeService;
|
|
16
|
+
components;
|
|
17
|
+
running;
|
|
18
|
+
constructor(components, init = {}) {
|
|
19
|
+
this.components = components;
|
|
20
|
+
this.protocol = init.protocol ?? (init.protocolPrefix ?? '/db-p2p') + '/dispute/1.0.0';
|
|
21
|
+
this.maxInboundStreams = init.maxInboundStreams ?? 16;
|
|
22
|
+
this.maxOutboundStreams = init.maxOutboundStreams ?? 32;
|
|
23
|
+
this.log = components.logger.forComponent('db-p2p:dispute');
|
|
24
|
+
this.disputeService = components.disputeService;
|
|
25
|
+
this.running = false;
|
|
26
|
+
}
|
|
27
|
+
[Symbol.toStringTag] = '@libp2p/dispute';
|
|
28
|
+
async start() {
|
|
29
|
+
if (this.running)
|
|
30
|
+
return;
|
|
31
|
+
await this.components.registrar.handle(this.protocol, this.handleIncomingStream.bind(this), {
|
|
32
|
+
maxInboundStreams: this.maxInboundStreams,
|
|
33
|
+
maxOutboundStreams: this.maxOutboundStreams,
|
|
34
|
+
});
|
|
35
|
+
this.running = true;
|
|
36
|
+
}
|
|
37
|
+
async stop() {
|
|
38
|
+
if (!this.running)
|
|
39
|
+
return;
|
|
40
|
+
await this.components.registrar.unhandle(this.protocol);
|
|
41
|
+
this.running = false;
|
|
42
|
+
}
|
|
43
|
+
handleIncomingStream(stream, connection) {
|
|
44
|
+
const peerId = connection.remotePeer;
|
|
45
|
+
const processStream = async function* (source) {
|
|
46
|
+
for await (const msg of source) {
|
|
47
|
+
const decoded = new TextDecoder().decode(msg.subarray());
|
|
48
|
+
const message = JSON.parse(decoded);
|
|
49
|
+
let response;
|
|
50
|
+
switch (message.type) {
|
|
51
|
+
case 'challenge': {
|
|
52
|
+
const vote = await this.disputeService.handleChallenge(message.challenge);
|
|
53
|
+
response = { type: 'vote', vote };
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
case 'resolution': {
|
|
57
|
+
this.disputeService.handleResolution(message.resolution);
|
|
58
|
+
response = { type: 'ack' };
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
default:
|
|
62
|
+
throw new Error(`Unknown dispute message type: ${message.type}`);
|
|
63
|
+
}
|
|
64
|
+
yield new TextEncoder().encode(JSON.stringify(response));
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
void (async () => {
|
|
68
|
+
try {
|
|
69
|
+
const responses = pipe(stream, (source) => lpDecode(source), processStream.bind(this), (source) => lpEncode(source));
|
|
70
|
+
for await (const chunk of responses) {
|
|
71
|
+
stream.send(chunk);
|
|
72
|
+
}
|
|
73
|
+
await stream.close();
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
this.log.error('error handling dispute protocol message from %p - %e', peerId, err);
|
|
77
|
+
stream.abort(err instanceof Error ? err : new Error(String(err)));
|
|
78
|
+
}
|
|
79
|
+
})();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/dispute/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { ClusterRecord } from '@optimystic/db-core';
|
|
2
|
+
/** Evidence a validator collects during transaction re-execution */
|
|
3
|
+
export type ValidationEvidence = {
|
|
4
|
+
/** Operations hash the validator computed */
|
|
5
|
+
computedHash: string;
|
|
6
|
+
/** Engine used for validation */
|
|
7
|
+
engineId: string;
|
|
8
|
+
/** Schema hash at time of validation */
|
|
9
|
+
schemaHash: string;
|
|
10
|
+
/** Snapshot of block states during validation */
|
|
11
|
+
blockStateHashes: {
|
|
12
|
+
[blockId: string]: {
|
|
13
|
+
revision: number;
|
|
14
|
+
contentHash: string;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
/** A challenge initiated by an overridden minority peer */
|
|
19
|
+
export type DisputeChallenge = {
|
|
20
|
+
/** Hash of (messageHash + challengerPeerId + timestamp) */
|
|
21
|
+
disputeId: string;
|
|
22
|
+
/** References the disputed ClusterRecord */
|
|
23
|
+
originalMessageHash: string;
|
|
24
|
+
/** Full record including all promises */
|
|
25
|
+
originalRecord: ClusterRecord;
|
|
26
|
+
/** Peer ID of the challenger */
|
|
27
|
+
challengerPeerId: string;
|
|
28
|
+
/** Challenger's validation evidence */
|
|
29
|
+
challengerEvidence: ValidationEvidence;
|
|
30
|
+
/** Challenger signs the dispute */
|
|
31
|
+
signature: string;
|
|
32
|
+
/** Timestamp of dispute creation */
|
|
33
|
+
timestamp: number;
|
|
34
|
+
/** TTL for arbitration (default: 2 × transaction TTL) */
|
|
35
|
+
expiration: number;
|
|
36
|
+
};
|
|
37
|
+
/** An arbitrator's independent assessment */
|
|
38
|
+
export type ArbitrationVote = {
|
|
39
|
+
/** Dispute being voted on */
|
|
40
|
+
disputeId: string;
|
|
41
|
+
/** Peer ID of the arbitrator */
|
|
42
|
+
arbitratorPeerId: string;
|
|
43
|
+
/** The arbitrator's verdict */
|
|
44
|
+
vote: 'agree-with-challenger' | 'agree-with-majority' | 'inconclusive';
|
|
45
|
+
/** Arbitrator's own re-execution results */
|
|
46
|
+
evidence: ValidationEvidence;
|
|
47
|
+
/** Arbitrator signs the vote */
|
|
48
|
+
signature: string;
|
|
49
|
+
};
|
|
50
|
+
/** Final resolution of a dispute */
|
|
51
|
+
export type DisputeResolution = {
|
|
52
|
+
/** Dispute being resolved */
|
|
53
|
+
disputeId: string;
|
|
54
|
+
/** Outcome of the dispute */
|
|
55
|
+
outcome: 'challenger-wins' | 'majority-wins' | 'inconclusive';
|
|
56
|
+
/** All votes collected */
|
|
57
|
+
votes: ArbitrationVote[];
|
|
58
|
+
/** Peers receiving reputation adjustments */
|
|
59
|
+
affectedPeers: {
|
|
60
|
+
peerId: string;
|
|
61
|
+
reason: DisputePenaltyReason;
|
|
62
|
+
}[];
|
|
63
|
+
/** Timestamp of resolution */
|
|
64
|
+
timestamp: number;
|
|
65
|
+
};
|
|
66
|
+
/** Dispute-specific penalty reasons (mapped to PenaltyReason for reputation) */
|
|
67
|
+
export type DisputePenaltyReason = 'false-approval' | 'dispute-lost';
|
|
68
|
+
/** Dispute protocol message types */
|
|
69
|
+
export type DisputeMessage = {
|
|
70
|
+
type: 'challenge';
|
|
71
|
+
challenge: DisputeChallenge;
|
|
72
|
+
} | {
|
|
73
|
+
type: 'vote';
|
|
74
|
+
vote: ArbitrationVote;
|
|
75
|
+
} | {
|
|
76
|
+
type: 'resolution';
|
|
77
|
+
resolution: DisputeResolution;
|
|
78
|
+
};
|
|
79
|
+
/** Dispute status for transaction queries */
|
|
80
|
+
export type DisputeStatus = 'committed-disputed' | 'committed-validated' | 'committed-invalidated';
|
|
81
|
+
/** Engine health state */
|
|
82
|
+
export type EngineHealthState = {
|
|
83
|
+
/** Number of disputes lost in the tracking window */
|
|
84
|
+
disputesLost: number;
|
|
85
|
+
/** Timestamps of recent dispute losses */
|
|
86
|
+
recentLosses: number[];
|
|
87
|
+
/** Whether the engine is flagged as unhealthy */
|
|
88
|
+
unhealthy: boolean;
|
|
89
|
+
/** When the unhealthy flag was set */
|
|
90
|
+
unhealthySince?: number;
|
|
91
|
+
};
|
|
92
|
+
/** Dispute configuration */
|
|
93
|
+
export interface DisputeConfig {
|
|
94
|
+
/** Enable/disable dispute protocol */
|
|
95
|
+
disputeEnabled: boolean;
|
|
96
|
+
/** Timeout for arbitration in milliseconds (default: 60000) */
|
|
97
|
+
disputeArbitrationTimeoutMs: number;
|
|
98
|
+
/** Number of arbitrators to select (default: same as cluster size) */
|
|
99
|
+
arbitratorCount?: number;
|
|
100
|
+
/** Engine health: max disputes lost in window before marking unhealthy */
|
|
101
|
+
engineHealthDisputeThreshold: number;
|
|
102
|
+
/** Engine health: window in ms for counting disputes (default: 600000 = 10 min) */
|
|
103
|
+
engineHealthWindowMs: number;
|
|
104
|
+
}
|
|
105
|
+
export declare const DEFAULT_DISPUTE_CONFIG: DisputeConfig;
|
|
106
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/dispute/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/dispute/types.ts"],"names":[],"mappings":"AA4GA,MAAM,CAAC,MAAM,sBAAsB,GAAkB;IACpD,cAAc,EAAE,KAAK;IACrB,2BAA2B,EAAE,MAAM;IACnC,4BAA4B,EAAE,CAAC;IAC/B,oBAAoB,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;CACpC,CAAC"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from "./cluster/client.js";
|
|
2
2
|
export * from "./cluster/cluster-repo.js";
|
|
3
3
|
export * from "./cluster/service.js";
|
|
4
|
+
export * from "./cluster/rebalance-monitor.js";
|
|
4
5
|
export * from "./protocol-client.js";
|
|
5
6
|
export * from "./repo/client.js";
|
|
6
7
|
export * from "./repo/cluster-coordinator.js";
|
|
@@ -26,4 +27,6 @@ export * from "./routing/responsibility.js";
|
|
|
26
27
|
export * from "./routing/libp2p-known-peers.js";
|
|
27
28
|
export * from "./network/network-manager-service.js";
|
|
28
29
|
export * from "./network/get-network-manager.js";
|
|
30
|
+
export * from "./reputation/index.js";
|
|
31
|
+
export * from "./dispute/index.js";
|
|
29
32
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yCAAyC,CAAC;AACxD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qCAAqC,CAAC;AACpD,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AACrD,cAAc,kCAAkC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yCAAyC,CAAC;AACxD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qCAAqC,CAAC;AACpD,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AACrD,cAAc,kCAAkC,CAAC;AACjD,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from "./cluster/client.js";
|
|
2
2
|
export * from "./cluster/cluster-repo.js";
|
|
3
3
|
export * from "./cluster/service.js";
|
|
4
|
+
export * from "./cluster/rebalance-monitor.js";
|
|
4
5
|
export * from "./protocol-client.js";
|
|
5
6
|
export * from "./repo/client.js";
|
|
6
7
|
export * from "./repo/cluster-coordinator.js";
|
|
@@ -26,4 +27,6 @@ export * from "./routing/responsibility.js";
|
|
|
26
27
|
export * from "./routing/libp2p-known-peers.js";
|
|
27
28
|
export * from "./network/network-manager-service.js";
|
|
28
29
|
export * from "./network/get-network-manager.js";
|
|
30
|
+
export * from "./reputation/index.js";
|
|
31
|
+
export * from "./dispute/index.js";
|
|
29
32
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yCAAyC,CAAC;AACxD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qCAAqC,CAAC;AACpD,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AACrD,cAAc,kCAAkC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yCAAyC,CAAC;AACxD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qCAAqC,CAAC;AACpD,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AACrD,cAAc,kCAAkC,CAAC;AACjD,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC"}
|
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
import type { AbortOptions, Libp2p, PeerId, Stream } from "@libp2p/interface";
|
|
2
2
|
import type { ClusterPeers, FindCoordinatorOptions, IKeyNetwork, IPeerNetwork } from "@optimystic/db-core";
|
|
3
|
+
import type { SerializedTable } from 'p2p-fret';
|
|
4
|
+
import type { IPeerReputation } from './reputation/types.js';
|
|
5
|
+
export type NetworkMode = 'forming' | 'joining';
|
|
6
|
+
export interface PersistedNetworkState {
|
|
7
|
+
version: 1;
|
|
8
|
+
networkHighWaterMark: number;
|
|
9
|
+
lastConnectedTimestamp: number;
|
|
10
|
+
consecutiveIsolatedSessions: number;
|
|
11
|
+
fretTable?: SerializedTable;
|
|
12
|
+
}
|
|
13
|
+
export interface NetworkStatePersistence {
|
|
14
|
+
load(): Promise<PersistedNetworkState | undefined>;
|
|
15
|
+
save(state: PersistedNetworkState): Promise<void>;
|
|
16
|
+
}
|
|
3
17
|
/**
|
|
4
18
|
* Configuration options for self-coordination behavior
|
|
5
19
|
*/
|
|
@@ -16,16 +30,20 @@ export interface SelfCoordinationConfig {
|
|
|
16
30
|
*/
|
|
17
31
|
export interface SelfCoordinationDecision {
|
|
18
32
|
allow: boolean;
|
|
19
|
-
reason: 'bootstrap-node' | 'partition-detected' | 'suspicious-shrinkage' | 'grace-period-not-elapsed' | 'extended-isolation' | 'disabled';
|
|
33
|
+
reason: 'bootstrap-node' | 'partition-detected' | 'suspicious-shrinkage' | 'grace-period-not-elapsed' | 'extended-isolation' | 'hwm-decay' | 'disabled';
|
|
20
34
|
warn?: boolean;
|
|
21
35
|
}
|
|
22
36
|
export declare class Libp2pKeyPeerNetwork implements IKeyNetwork, IPeerNetwork {
|
|
23
37
|
private readonly libp2p;
|
|
24
38
|
private readonly clusterSize;
|
|
39
|
+
private readonly reputation?;
|
|
25
40
|
private readonly selfCoordinationConfig;
|
|
26
41
|
private networkHighWaterMark;
|
|
27
42
|
private lastConnectedTime;
|
|
28
|
-
|
|
43
|
+
private consecutiveIsolatedSessions;
|
|
44
|
+
private readonly networkMode;
|
|
45
|
+
private readonly persistence?;
|
|
46
|
+
constructor(libp2p: Libp2p, clusterSize?: number, selfCoordinationConfig?: SelfCoordinationConfig, networkMode?: NetworkMode, persistence?: NetworkStatePersistence, reputation?: IPeerReputation | undefined);
|
|
29
47
|
private readonly coordinatorCache;
|
|
30
48
|
private static readonly MAX_CACHE_ENTRIES;
|
|
31
49
|
private readonly log;
|
|
@@ -39,6 +57,9 @@ export declare class Libp2pKeyPeerNetwork implements IKeyNetwork, IPeerNetwork {
|
|
|
39
57
|
* Called on new connections.
|
|
40
58
|
*/
|
|
41
59
|
private updateNetworkObservations;
|
|
60
|
+
initFromPersistedState(): Promise<void>;
|
|
61
|
+
private canRetryImprove;
|
|
62
|
+
private persistState;
|
|
42
63
|
/**
|
|
43
64
|
* Determine if self-coordination should be allowed based on network observations.
|
|
44
65
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libp2p-key-network.d.ts","sourceRoot":"","sources":["../../src/libp2p-key-network.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE9E,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"libp2p-key-network.d.ts","sourceRoot":"","sources":["../../src/libp2p-key-network.ts"],"names":[],"mappings":"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"}
|