@xyo-network/chain-sdk 5.2.0 → 5.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/modules/analyze/ChainHeadSelector.d.ts +16 -0
- package/dist/browser/modules/analyze/ChainHeadSelector.d.ts.map +1 -1
- package/dist/browser/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts +1 -0
- package/dist/browser/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts.map +1 -1
- package/dist/browser/modules/services/implementation/processPendingBlocks.d.ts +6 -1
- package/dist/browser/modules/services/implementation/processPendingBlocks.d.ts.map +1 -1
- package/dist/browser/modules/services/simple/block/runner/SimpleBlockRunner.d.ts +7 -0
- package/dist/browser/modules/services/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -1
- package/dist/neutral/analyze.mjs +33 -3
- package/dist/neutral/analyze.mjs.map +2 -2
- package/dist/neutral/modules/analyze/ChainHeadSelector.d.ts +16 -0
- package/dist/neutral/modules/analyze/ChainHeadSelector.d.ts.map +1 -1
- package/dist/neutral/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts +1 -0
- package/dist/neutral/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts.map +1 -1
- package/dist/neutral/modules/services/implementation/processPendingBlocks.d.ts +6 -1
- package/dist/neutral/modules/services/implementation/processPendingBlocks.d.ts.map +1 -1
- package/dist/neutral/modules/services/simple/block/runner/SimpleBlockRunner.d.ts +7 -0
- package/dist/neutral/modules/services/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -1
- package/dist/neutral/services.mjs +8 -1
- package/dist/neutral/services.mjs.map +2 -2
- package/dist/node/modules/analyze/ChainHeadSelector.d.ts +16 -0
- package/dist/node/modules/analyze/ChainHeadSelector.d.ts.map +1 -1
- package/dist/node/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts +1 -0
- package/dist/node/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts.map +1 -1
- package/dist/node/modules/services/implementation/processPendingBlocks.d.ts +6 -1
- package/dist/node/modules/services/implementation/processPendingBlocks.d.ts.map +1 -1
- package/dist/node/modules/services/simple/block/runner/SimpleBlockRunner.d.ts +7 -0
- package/dist/node/modules/services/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -1
- package/package.json +5 -5
|
@@ -24,6 +24,12 @@ export interface ChainHeadSelectorParams extends ChainFinalizerParams {
|
|
|
24
24
|
* asked, which is what keeps a node with no stake readers running exactly as it does today.
|
|
25
25
|
*/
|
|
26
26
|
eligibility?: ProducerEligibilityEvaluator;
|
|
27
|
+
/**
|
|
28
|
+
* Minimum epoch spacing (ms) between transaction-less heartbeat blocks this selector will
|
|
29
|
+
* qualify — a defense against producers heartbeating faster than the network's intended pace.
|
|
30
|
+
* Transaction-carrying candidates are exempt. Undefined disables the check.
|
|
31
|
+
*/
|
|
32
|
+
heartbeatInterval?: number;
|
|
27
33
|
mempoolViewer: MempoolViewer;
|
|
28
34
|
/**
|
|
29
35
|
* Minimum number of uncle candidates required before accepting one.
|
|
@@ -42,6 +48,7 @@ export declare class ChainHeadSelector extends ChainFinalizer<ChainHeadSelectorP
|
|
|
42
48
|
protected admission: AdmissionMode;
|
|
43
49
|
protected allowedProducers?: Address[];
|
|
44
50
|
protected backoffMs?: number;
|
|
51
|
+
protected heartbeatInterval?: number;
|
|
45
52
|
protected minCandidates?: number;
|
|
46
53
|
private _timeSinceLastUncle;
|
|
47
54
|
constructor(params: ChainHeadSelectorParams);
|
|
@@ -78,6 +85,15 @@ export declare class ChainHeadSelector extends ChainFinalizer<ChainHeadSelectorP
|
|
|
78
85
|
* chain from finalizing.
|
|
79
86
|
*/
|
|
80
87
|
protected assess(all: SignedHydratedBlockWithHashMeta[]): Promise<AdmissionAssessment[]>;
|
|
88
|
+
/**
|
|
89
|
+
* Defense against unwanted heartbeat rates: a transaction-less (heartbeat) candidate qualifies
|
|
90
|
+
* only when its signing epoch is at least heartbeatInterval after the current head's. Measured
|
|
91
|
+
* on chain data, so every finalizer applies the same pace deterministically regardless of wall
|
|
92
|
+
* clock. A producer heartbeating faster than the network's pace — misconfigured or hostile —
|
|
93
|
+
* cannot drive the chain's block rate: its candidates never qualify and age out of the pool,
|
|
94
|
+
* while transaction-carrying candidates are exempt and finalize immediately.
|
|
95
|
+
*/
|
|
96
|
+
protected filterPacedHeartbeatCandidates(proposedBlocks: SignedHydratedBlockWithHashMeta[]): SignedHydratedBlockWithHashMeta[];
|
|
81
97
|
/** Whether the configured allow-list admits a candidate. An empty list admits everyone. */
|
|
82
98
|
protected isAllowed(candidate: SignedHydratedBlockWithHashMeta): boolean;
|
|
83
99
|
/** Publishes what the two gates concluded, swallowing failures. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChainHeadSelector.d.ts","sourceRoot":"","sources":["../../../../src/modules/analyze/ChainHeadSelector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAI9C,OAAO,KAAK,EACV,WAAW,EAAE,aAAa,EAAE,+BAA+B,EAC5D,MAAM,sBAAsB,CAAA;AAK7B,OAAO,KAAK,EACV,mBAAmB,EAAE,aAAa,EAAE,qBAAqB,EAAE,4BAA4B,EACxF,MAAM,gBAAgB,CAAA;AAEvB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,MAAM,WAAW,uBAAwB,SAAQ,oBAAoB;IACnE;;OAEG;IACH,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAA;IAC5B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,WAAW,CAAA;IACpB;;;OAGG;IACH,WAAW,CAAC,EAAE,4BAA4B,CAAA;IAC1C,aAAa,EAAE,aAAa,CAAA;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,wEAAwE;IACxE,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1E;AAOD,qBAAa,iBAAkB,SAAQ,cAAc,CAAC,uBAAuB,CAAC;IAC5E;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,+BAA+B,QAAO;IAEtD,SAAS,CAAC,SAAS,EAAE,aAAa,CAAA;IAClC,SAAS,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAA;IACtC,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC5B,SAAS,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAChC,OAAO,CAAC,mBAAmB,CAAa;gBAE5B,MAAM,EAAE,uBAAuB;
|
|
1
|
+
{"version":3,"file":"ChainHeadSelector.d.ts","sourceRoot":"","sources":["../../../../src/modules/analyze/ChainHeadSelector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAI9C,OAAO,KAAK,EACV,WAAW,EAAE,aAAa,EAAE,+BAA+B,EAC5D,MAAM,sBAAsB,CAAA;AAK7B,OAAO,KAAK,EACV,mBAAmB,EAAE,aAAa,EAAE,qBAAqB,EAAE,4BAA4B,EACxF,MAAM,gBAAgB,CAAA;AAEvB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,MAAM,WAAW,uBAAwB,SAAQ,oBAAoB;IACnE;;OAEG;IACH,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAA;IAC5B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,WAAW,CAAA;IACpB;;;OAGG;IACH,WAAW,CAAC,EAAE,4BAA4B,CAAA;IAC1C;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,aAAa,EAAE,aAAa,CAAA;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,wEAAwE;IACxE,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1E;AAOD,qBAAa,iBAAkB,SAAQ,cAAc,CAAC,uBAAuB,CAAC;IAC5E;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,+BAA+B,QAAO;IAEtD,SAAS,CAAC,SAAS,EAAE,aAAa,CAAA;IAClC,SAAS,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAA;IACtC,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC5B,SAAS,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IACpC,SAAS,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAChC,OAAO,CAAC,mBAAmB,CAAa;gBAE5B,MAAM,EAAE,uBAAuB;IAS3C,SAAS,KAAK,OAAO;;;;;;;MAEpB;IAED,SAAS,KAAK,aAAa,kBAE1B;IAEK,YAAY,IAAI,OAAO,CAAC,+BAA+B,EAAE,CAAC;IAehE;;;;;;;;;;;;;OAaG;cACa,KAAK,CACnB,GAAG,EAAE,+BAA+B,EAAE,EACtC,OAAO,EAAE,+BAA+B,EAAE,GACzC,OAAO,CAAC,+BAA+B,EAAE,CAAC;IAW7C;;;;;;OAMG;cACa,MAAM,CAAC,GAAG,EAAE,+BAA+B,EAAE,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAmB9F;;;;;;;OAOG;IACH,SAAS,CAAC,8BAA8B,CAAC,cAAc,EAAE,+BAA+B,EAAE,GAAG,+BAA+B,EAAE;IAqB9H,2FAA2F;IAC3F,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,+BAA+B,GAAG,OAAO;IAOxE,mEAAmE;cACnD,aAAa,CAAC,WAAW,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAehF;;;;;;;;;OASG;IACH,OAAO,CAAC,2BAA2B;CAoBpC"}
|
package/dist/browser/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts
CHANGED
|
@@ -15,6 +15,7 @@ export declare class BaseNetworkStakeStepRewardService extends AbstractCreatable
|
|
|
15
15
|
networkStakeStepRewardAddressHistory(_address: Address): Promisable<Record<Address, AttoXL1>>;
|
|
16
16
|
networkStakeStepRewardAddressReward(_context: StepIdentity, _address: Address): Promisable<Record<Address, AttoXL1>>;
|
|
17
17
|
networkStakeStepRewardAddressShare(_context: StepIdentity, _address: Address): Promisable<[bigint, bigint]>;
|
|
18
|
+
networkStakeStepRewardAllocationsForStep(_context: StepIdentity): Promisable<Record<number, AttoXL1>>;
|
|
18
19
|
networkStakeStepRewardClaimedByAddress(_address: Address): Promisable<AttoXL1>;
|
|
19
20
|
networkStakeStepRewardForPosition(_position: number, _range: [number, number]): Promisable<[AttoXL1, AttoXL1]>;
|
|
20
21
|
networkStakeStepRewardForStep(_context: StepIdentity): Promisable<AttoXL1>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseNetworkStakeStepRewardService.d.ts","sourceRoot":"","sources":["../../../../../src/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BaseNetworkStakeStepRewardService.d.ts","sourceRoot":"","sources":["../../../../../src/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,11 @@ interface ProcessPendingBlocksParams {
|
|
|
14
14
|
/** Computes producer standing, for the shadow and enforce postures. */
|
|
15
15
|
eligibility?: ProducerEligibilityEvaluator;
|
|
16
16
|
finalizationRunner: FinalizationRunner;
|
|
17
|
+
/**
|
|
18
|
+
* Minimum epoch spacing (ms) between transaction-less heartbeat blocks the head selector will
|
|
19
|
+
* qualify; transaction-carrying candidates are exempt. Undefined disables the pace check.
|
|
20
|
+
*/
|
|
21
|
+
heartbeatInterval?: number;
|
|
17
22
|
logger?: Logger;
|
|
18
23
|
mempoolViewer: MempoolViewer;
|
|
19
24
|
minCandidates?: number;
|
|
@@ -25,7 +30,7 @@ interface ProcessPendingBlocksParams {
|
|
|
25
30
|
/** Where to publish what both admission gates concluded, in shadow posture. */
|
|
26
31
|
publishAdmissionShadow?: (report: AdmissionShadowReport) => Promise<void>;
|
|
27
32
|
}
|
|
28
|
-
export declare function processPendingBlocks({ blockValidationViewer, blockViewer, context, logger, mempoolViewer, finalizationRunner, allowedProducers, backoffMs, minCandidates, deadLetterQueueRunner, observer, admission, eligibility, publishAdmissionShadow, }: ProcessPendingBlocksParams): Promise<[{
|
|
33
|
+
export declare function processPendingBlocks({ blockValidationViewer, blockViewer, context, logger, mempoolViewer, finalizationRunner, allowedProducers, backoffMs, heartbeatInterval, minCandidates, deadLetterQueueRunner, observer, admission, eligibility, publishAdmissionShadow, }: ProcessPendingBlocksParams): Promise<[{
|
|
29
34
|
schema: "network.xyo.boundwitness" & {
|
|
30
35
|
readonly __schema: true;
|
|
31
36
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processPendingBlocks.d.ts","sourceRoot":"","sources":["../../../../../src/modules/services/implementation/processPendingBlocks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAEtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EACV,WAAW,EAAE,qBAAqB,EAAE,WAAW,EAAE,qBAAqB,EAAE,kBAAkB,EAA6B,aAAa,EACrI,MAAM,sBAAsB,CAAA;AAK7B,OAAO,KAAK,EACV,aAAa,EAAE,qBAAqB,EAAE,4BAA4B,EACnE,MAAM,UAAU,CAAA;AAKjB,UAAU,0BAA0B;IAClC,uFAAuF;IACvF,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAA;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qBAAqB,EAAE,qBAAqB,CAAA;IAC5C,WAAW,EAAE,WAAW,CAAA;IACxB,OAAO,EAAE,WAAW,CAAA;IACpB,qBAAqB,CAAC,EAAE,qBAAqB,CAAA;IAC7C,uEAAuE;IACvE,WAAW,CAAC,EAAE,4BAA4B,CAAA;IAC1C,kBAAkB,EAAE,kBAAkB,CAAA;IACtC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,+EAA+E;IAC/E,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1E;AAgCD,wBAAsB,oBAAoB,CAAC,EACzC,qBAAqB,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE,qBAAqB,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"processPendingBlocks.d.ts","sourceRoot":"","sources":["../../../../../src/modules/services/implementation/processPendingBlocks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAEtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EACV,WAAW,EAAE,qBAAqB,EAAE,WAAW,EAAE,qBAAqB,EAAE,kBAAkB,EAA6B,aAAa,EACrI,MAAM,sBAAsB,CAAA;AAK7B,OAAO,KAAK,EACV,aAAa,EAAE,qBAAqB,EAAE,4BAA4B,EACnE,MAAM,UAAU,CAAA;AAKjB,UAAU,0BAA0B;IAClC,uFAAuF;IACvF,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAA;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qBAAqB,EAAE,qBAAqB,CAAA;IAC5C,WAAW,EAAE,WAAW,CAAA;IACxB,OAAO,EAAE,WAAW,CAAA;IACpB,qBAAqB,CAAC,EAAE,qBAAqB,CAAA;IAC7C,uEAAuE;IACvE,WAAW,CAAC,EAAE,4BAA4B,CAAA;IAC1C,kBAAkB,EAAE,kBAAkB,CAAA;IACtC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,+EAA+E;IAC/E,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1E;AAgCD,wBAAsB,oBAAoB,CAAC,EACzC,qBAAqB,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,SAAS,EAAE,iBAAiB,EAAE,aAAa,EAAE,qBAAqB,EAAE,QAAQ,EACtL,SAAS,EAAE,WAAW,EAAE,sBAAsB,GAC/C,EAAE,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBA4E5B"}
|
|
@@ -13,6 +13,13 @@ interface ExcludedTransactionEntry {
|
|
|
13
13
|
* The default block size for a block
|
|
14
14
|
*/
|
|
15
15
|
export declare const DEFAULT_BLOCK_SIZE = 10;
|
|
16
|
+
/**
|
|
17
|
+
* Default minimum age (ms) of the head before a producer emits a transaction-less heartbeat
|
|
18
|
+
* block. Five minutes keeps a quiet chain visibly alive without accumulating meaningful storage
|
|
19
|
+
* or block-reward drift. Finalizers use the same default as the floor for how fast they will
|
|
20
|
+
* finalize heartbeat blocks.
|
|
21
|
+
*/
|
|
22
|
+
export declare const DEFAULT_HEARTBEAT_INTERVAL = 300000;
|
|
16
23
|
/**
|
|
17
24
|
* The amount of time for which a producer will restake their intent
|
|
18
25
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SimpleBlockRunner.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/services/simple/block/runner/SimpleBlockRunner.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SimpleBlockRunner.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/services/simple/block/runner/SimpleBlockRunner.ts"],"names":[],"mappings":"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"}
|
package/dist/neutral/analyze.mjs
CHANGED
|
@@ -173,7 +173,8 @@ import {
|
|
|
173
173
|
import {
|
|
174
174
|
findBestUncle,
|
|
175
175
|
findUncles,
|
|
176
|
-
getWindowedChain
|
|
176
|
+
getWindowedChain,
|
|
177
|
+
isTransactionBoundWitness
|
|
177
178
|
} from "@xyo-network/xl1-sdk";
|
|
178
179
|
var ChainHeadSelector = class _ChainHeadSelector extends ChainFinalizer {
|
|
179
180
|
/**
|
|
@@ -184,6 +185,7 @@ var ChainHeadSelector = class _ChainHeadSelector extends ChainFinalizer {
|
|
|
184
185
|
admission;
|
|
185
186
|
allowedProducers;
|
|
186
187
|
backoffMs;
|
|
188
|
+
heartbeatInterval;
|
|
187
189
|
minCandidates;
|
|
188
190
|
_timeSinceLastUncle = Date.now();
|
|
189
191
|
constructor(params) {
|
|
@@ -191,6 +193,7 @@ var ChainHeadSelector = class _ChainHeadSelector extends ChainFinalizer {
|
|
|
191
193
|
this.admission = params.admission ?? "allowlist";
|
|
192
194
|
this.allowedProducers = params.allowedProducers;
|
|
193
195
|
this.backoffMs = params.backoffMs;
|
|
196
|
+
this.heartbeatInterval = params.heartbeatInterval;
|
|
194
197
|
this.minCandidates = params.minCandidates;
|
|
195
198
|
}
|
|
196
199
|
get context() {
|
|
@@ -205,8 +208,9 @@ var ChainHeadSelector = class _ChainHeadSelector extends ChainFinalizer {
|
|
|
205
208
|
const allowed = allProposedBlocks.filter((pb) => this.isAllowed(pb));
|
|
206
209
|
const proposedBlocks = await this.admit(allProposedBlocks, allowed);
|
|
207
210
|
this.windowedFinalizedChain = await getWindowedChain(this.context, this.blockViewer, this.maxWindowSize, this.windowedFinalizedChain);
|
|
208
|
-
const
|
|
209
|
-
this.
|
|
211
|
+
const pacedBlocks = this.filterPacedHeartbeatCandidates(proposedBlocks);
|
|
212
|
+
const uncles = findUncles(this.context, this.windowedFinalizedChain, pacedBlocks);
|
|
213
|
+
this.reportSilentUncleRejections(pacedBlocks, uncles.length);
|
|
210
214
|
return findBestUncle(this.windowedFinalizedChain, uncles, { backoffMs: this.backoffMs, minCandidates: this.minCandidates }) ?? this.windowedFinalizedChain;
|
|
211
215
|
}, this.context);
|
|
212
216
|
}
|
|
@@ -257,6 +261,32 @@ var ChainHeadSelector = class _ChainHeadSelector extends ChainFinalizer {
|
|
|
257
261
|
producer: candidate[0].addresses[0]
|
|
258
262
|
})));
|
|
259
263
|
}
|
|
264
|
+
/**
|
|
265
|
+
* Defense against unwanted heartbeat rates: a transaction-less (heartbeat) candidate qualifies
|
|
266
|
+
* only when its signing epoch is at least heartbeatInterval after the current head's. Measured
|
|
267
|
+
* on chain data, so every finalizer applies the same pace deterministically regardless of wall
|
|
268
|
+
* clock. A producer heartbeating faster than the network's pace — misconfigured or hostile —
|
|
269
|
+
* cannot drive the chain's block rate: its candidates never qualify and age out of the pool,
|
|
270
|
+
* while transaction-carrying candidates are exempt and finalize immediately.
|
|
271
|
+
*/
|
|
272
|
+
filterPacedHeartbeatCandidates(proposedBlocks) {
|
|
273
|
+
const interval = this.heartbeatInterval;
|
|
274
|
+
if (interval === void 0 || proposedBlocks.length === 0) return proposedBlocks;
|
|
275
|
+
const headEpoch = this.windowedFinalizedChain.at(-1)?.[0].$epoch;
|
|
276
|
+
if (!isDefined2(headEpoch)) return proposedBlocks;
|
|
277
|
+
const paced = proposedBlocks.filter((candidate) => {
|
|
278
|
+
if (candidate[1].some((payload) => isTransactionBoundWitness(payload))) return true;
|
|
279
|
+
const candidateEpoch = candidate[0].$epoch;
|
|
280
|
+
if (!isDefined2(candidateEpoch)) return true;
|
|
281
|
+
return candidateEpoch - headEpoch >= interval;
|
|
282
|
+
});
|
|
283
|
+
if (paced.length < proposedBlocks.length) {
|
|
284
|
+
this.context.logger?.debug(
|
|
285
|
+
`findBestHead: paced out ${proposedBlocks.length - paced.length} heartbeat candidate(s) younger than ${interval}ms since the head`
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
return paced;
|
|
289
|
+
}
|
|
260
290
|
/** Whether the configured allow-list admits a candidate. An empty list admits everyone. */
|
|
261
291
|
isAllowed(candidate) {
|
|
262
292
|
const allowedProducers = this.allowedProducers;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/modules/analyze/admission.ts", "../../src/modules/analyze/analyzeChain.ts", "../../src/modules/analyze/BalanceAnalyzer/BalanceAnalyzer.ts", "../../src/modules/analyze/BalanceAnalyzer/ChainSummaryBalances.ts", "../../src/modules/analyze/ChainFinalizer.ts", "../../src/modules/analyze/ChainHeadSelector.ts", "../../src/modules/analyze/producer/ChainProducersAnalyzer.ts", "../../src/modules/analyze/producer/ChainSummaryProducers.ts", "../../src/modules/analyze/producer/ChainStakeIntentAnalyzer.ts", "../../src/modules/analyze/producer/ChainSummaryStakeIntent.ts", "../../src/modules/analyze/TransferAnalyzer/ChainSummaryTransfers.ts", "../../src/modules/analyze/TransferAnalyzer/TransferAnalyzer.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Promisable } from '@ariestools/sdk'\nimport type { XyoAddress } from '@xyo-network/sdk'\nimport type { SignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-sdk'\n\nimport type { EligibilityEvaluation } from '#slashing'\n\n/**\n * How a finalizer decides which candidates it will consider.\n *\n * Three postures, and moving between them is a configuration change rather than a different\n * build. That constraint is deliberate: a network that had to be redeployed to step back from\n * enforcement would, in the moment it most needed to step back, be unable to.\n *\n * - `allowlist` \u2014 only the named producers, which is how the chain runs today\n * - `shadow` \u2014 the same gate, plus participation computed and published for every candidate\n * - `enforce` \u2014 participation itself gates\n */\nexport const AdmissionModes = ['allowlist', 'shadow', 'enforce'] as const\n\n/** How a finalizer decides which candidates it will consider. */\nexport type AdmissionMode = typeof AdmissionModes[number]\n\n/** Evaluates whether a candidate's producer had standing to produce it. */\nexport type ProducerEligibilityEvaluator\n = (candidate: SignedHydratedBlockWithHashMeta) => Promisable<EligibilityEvaluation>\n\n/** What both gates concluded about one candidate. */\nexport interface AdmissionAssessment {\n /** Whether the allow-list admits it. */\n admittedByAllowList: boolean\n /** The candidate's height. */\n block: number\n /** The candidate's signed identity. */\n dataHash: string\n /** What the participation predicate concluded. */\n eligibility: EligibilityEvaluation\n /** The producer. */\n producer: XyoAddress\n}\n\n/**\n * What the two gates said about a round of candidates, and where they disagreed.\n *\n * Published rather than logged, because the whole purpose of the shadow posture is that anyone \u2014\n * not just the operator holding the terminal \u2014 can see what enforcement would have done before it\n * does it. An operator convinced by their own logs has convinced nobody.\n */\nexport interface AdmissionShadowReport {\n /** Every candidate considered this round. */\n assessments: AdmissionAssessment[]\n /** Only those where the two gates disagreed. */\n divergent: AdmissionAssessment[]\n /** The finalized height this round was selected against. */\n head: number\n}\n\n/** Moniker the admission shadow publisher resolves under. */\nexport const AdmissionShadowPublishRunnerMoniker = 'AdmissionShadowPublishRunner'\n\n/**\n * Publishes what both admission gates concluded.\n *\n * An interface rather than a class here because the finalizer must not depend on the launcher\n * that supplies the implementation \u2014 the actor states what it needs, and orchestration decides\n * what satisfies it.\n */\nexport interface AdmissionShadowPublishRunner {\n publish(report: AdmissionShadowReport): Promisable<void>\n}\n\n/** Whether a resolved provider can actually publish shadow reports. */\nexport function isAdmissionShadowPublishRunner(value: unknown): value is AdmissionShadowPublishRunner {\n return typeof (value as Partial<AdmissionShadowPublishRunner> | undefined)?.publish === 'function'\n}\n\n/** Whether the two gates reached different conclusions about a candidate. */\nexport function isDivergent(assessment: AdmissionAssessment): boolean {\n // an unresolvable evaluation is not a disagreement \u2014 it is an absence of one\n if (!assessment.eligibility.resolvable) return false\n return assessment.admittedByAllowList !== (assessment.eligibility.eligible === true)\n}\n", "/* eslint-disable complexity */\nimport type { Hash } from '@ariestools/sdk'\nimport {\n assertEx, isError, spanRootAsync,\n} from '@ariestools/sdk'\nimport type { Payload } from '@xyo-network/sdk'\nimport type {\n BlockContextRead,\n ChainAnalyzer,\n HydratedBlock, HydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-sdk'\nimport { hydrateBlock } from '@xyo-network/xl1-sdk'\n\nconst analyzeBlock = async (block: HydratedBlock, handlers: ChainAnalyzer[]): Promise<HydratedBlock> => {\n await Promise.all(handlers.map(async (handler) => {\n await handler.onBlock(block)\n }))\n return block\n}\n\nexport const analyzeChain = async (\n context: BlockContextRead,\n handlers: ChainAnalyzer[],\n /* the hash to start at */\n head: Hash | HydratedBlockWithHashMeta,\n /* a hash that we should stop at if we reach it */\n previousHead: Hash | null = null,\n /* max number of blocks to analyze (-1 for no limit) */\n maxDepth = -1n,\n): Promise<Payload[]> => {\n const { logger } = context\n logger?.log('analyzeChain.start', previousHead)\n return assertEx(await spanRootAsync('analyzeChain', async () => {\n let lastBlockNumber = -1\n let maxDepthLimit = maxDepth === -1n ? BigInt(Number.MAX_SAFE_INTEGER) : maxDepth\n let cursor: HydratedBlockWithHashMeta | null = typeof head === 'string' ? await hydrateBlock(context, head) : head\n // If the terminal block is the current head, we don't need to analyze it\n logger?.log('analyzeChain.cursor', cursor?.[0].block)\n if (previousHead !== null && cursor?.[0]._hash === previousHead) return []\n while (cursor && (maxDepthLimit > 0n)) {\n maxDepthLimit -= 1n\n await analyzeBlock(cursor, handlers)\n lastBlockNumber = cursor[0].block\n try {\n cursor = cursor[0].previous === null ? null : await hydrateBlock(context, cursor[0].previous)\n } catch (ex) {\n if (isError(ex)) {\n logger?.warn('Error in hydrateBlock', ex)\n }\n break\n }\n if (cursor?.[0]._hash === previousHead) break\n }\n if (previousHead === null && maxDepth === -1n && lastBlockNumber !== 0) {\n logger?.warn(`Expected root block number to be 0, but was ${lastBlockNumber} : ${previousHead}`)\n }\n logger?.log('analyzeChain.done', lastBlockNumber)\n return handlers.map((handler) => {\n return handler.result()\n })\n }, context), () => 'analyzeChain failed')\n}\n", "import type { Address, Hash } from '@ariestools/sdk'\nimport { isDefined, toAddress } from '@ariestools/sdk'\nimport { trace, type Tracer } from '@opentelemetry/api'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport type {\n ChainAnalyzer,\n HydratedBlockWithHashMeta, SignedBigInt,\n} from '@xyo-network/xl1-sdk'\nimport {\n netBalancesForPayloads,\n parseSignedBigInt, toSignedBigInt,\n} from '@xyo-network/xl1-sdk'\n\nimport type { ChainSummaryBalances } from './ChainSummaryBalances.ts'\nimport { ChainSummaryBalancesSchema } from './ChainSummaryBalances.ts'\n\nconst bigintBalances = (balances: Partial<Record<Address, SignedBigInt>>) => {\n const result: Record<string, bigint> = {}\n for (const [address, balance] of Object.entries(balances)) {\n if (isDefined(balance)) {\n const propertyKey = String(toAddress(address))\n result[propertyKey] = parseSignedBigInt(balance)\n }\n }\n return result\n}\n\nexport class BalanceAnalyzer implements ChainAnalyzer {\n protected _tracer: Tracer | undefined\n private _addresses: Address[]\n private _balances: Record<string, bigint> = {}\n private _firstBlock?: Hash\n private _lastBlock?: Hash\n private _minBalances: bigint[]\n\n constructor(addresses: Address[] = [], minBalances: bigint[] = [], startingBalances?: ChainSummaryBalances) {\n this._addresses = addresses\n this._minBalances = minBalances\n this._balances = startingBalances ? bigintBalances(startingBalances.balances) : {}\n }\n\n protected get tracer() {\n if (this._tracer) return this._tracer\n this._tracer = trace.getTracer('BalanceAnalyzer')\n return this._tracer\n }\n\n onBlock([block, payloads]: HydratedBlockWithHashMeta): boolean {\n this._firstBlock = this._firstBlock ?? block._hash\n this._lastBlock = block._hash\n const netBalances = netBalancesForPayloads({ singletons: {} }, payloads)\n for (const [address, balance] of Object.entries(netBalances)) {\n const propertyKey = String(toAddress(address))\n this._balances[propertyKey] = (this._balances[propertyKey] ?? 0n) + balance\n }\n return this.shouldContinue()\n }\n\n result() {\n const balances: Record<string, SignedBigInt> = {}\n const positiveBalances = Object.entries(this._balances).filter(([, balance]) => balance > 0n)\n for (const [address, balance] of positiveBalances) {\n const propertyKey = String(toAddress(address))\n balances[propertyKey] = toSignedBigInt(balance)\n }\n const builder = new PayloadBuilder<ChainSummaryBalances>({ schema: ChainSummaryBalancesSchema })\n return builder.fields({\n firstBlock: this._firstBlock ?? null,\n lastBlock: this._lastBlock ?? null,\n balances,\n }).build()\n }\n\n shouldContinue() {\n return !this.allMinBalancesReached()\n }\n\n protected allMinBalancesReached() {\n if (this._minBalances.length === 0) return true\n for (let i = 0; i < this._addresses.length; i++) {\n const propertyKey = String(this._addresses[i])\n if ((this._balances[propertyKey] ?? 0n) < this._minBalances[i]) return false\n }\n return true\n }\n}\n", "import {\n type Address, type Hash, type Hex,\n} from '@ariestools/sdk'\nimport type { Payload } from '@xyo-network/sdk'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/sdk'\nimport type { SignedBigInt } from '@xyo-network/xl1-sdk'\n\nexport const ChainSummaryBalancesSchema = asSchema('network.xyo.chain.summary.balances', true)\nexport type ChainSummaryBalancesSchema = typeof ChainSummaryBalancesSchema\n\nexport interface ChainSummaryBalancesFields {\n balances: Partial<Record<Address, SignedBigInt>>\n firstBlock: Hash | null\n hasMinBalance?: Record<Address, Hex>\n lastBlock: Hash | null\n}\n\nexport type ChainSummaryBalances = Payload<ChainSummaryBalancesFields, ChainSummaryBalancesSchema>\nexport const isChainSummaryBalances = isPayloadOfSchemaType<ChainSummaryBalances>(ChainSummaryBalancesSchema)\n", "import type { BaseParams, Promisable } from '@ariestools/sdk'\nimport { Base } from '@ariestools/sdk'\nimport type { Tracer } from '@opentelemetry/api'\nimport type { BlockViewer, SignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-sdk'\nimport { asXL1BlockRange } from '@xyo-network/xl1-sdk'\n\nexport interface ChainFinalizerParams extends BaseParams {\n blockViewer: BlockViewer\n maxWindowSize?: number\n windowedFinalizedChain?: SignedHydratedBlockWithHashMeta[]\n}\n\nexport class ChainFinalizer<TParams extends ChainFinalizerParams = ChainFinalizerParams> extends Base<TParams> {\n protected _tracer: Tracer | undefined\n // the chainArchivist is assumed to be an archivist with already validated blocks in it along with all the transactions and payloads\n // it is also assumed that the sequence order of archivist is that newer blocks come after older blocks\n\n protected windowedFinalizedChain: SignedHydratedBlockWithHashMeta[]\n\n constructor(params: TParams) {\n super(params)\n this.windowedFinalizedChain = [...(params.windowedFinalizedChain ?? [])]\n }\n\n protected get blockViewer() {\n return this.params.blockViewer\n }\n\n protected get finalizedBlockNumber() {\n return this.windowedFinalizedChain?.at(-1)?.[0].block ?? -1\n }\n\n protected get maxWindowSize() {\n return this.params.maxWindowSize ?? 100\n }\n\n protected get windowRange() {\n return asXL1BlockRange([this.windowedFinalizedChain.at(0)?.[0].block ?? 0, this.finalizedBlockNumber])\n }\n\n finalizeChainFragment(chain: SignedHydratedBlockWithHashMeta[]): Promisable<void> {\n this.windowedFinalizedChain = [...this.windowedFinalizedChain, ...chain].slice(-this.maxWindowSize)\n }\n}\n", "import type { Address } from '@ariestools/sdk'\nimport {\n isDefined, spanRootAsync, toAddress,\n} from '@ariestools/sdk'\nimport type {\n BaseContext, MempoolViewer, SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-sdk'\nimport {\n findBestUncle, findUncles, getWindowedChain,\n} from '@xyo-network/xl1-sdk'\n\nimport type {\n AdmissionAssessment, AdmissionMode, AdmissionShadowReport, ProducerEligibilityEvaluator,\n} from './admission.ts'\nimport { isDivergent } from './admission.ts'\nimport type { ChainFinalizerParams } from './ChainFinalizer.ts'\nimport { ChainFinalizer } from './ChainFinalizer.ts'\n\nexport interface ChainHeadSelectorParams extends ChainFinalizerParams {\n /**\n * How candidates are admitted. Defaults to `allowlist`, which is how the chain runs today.\n */\n admission?: AdmissionMode\n /**\n * List of allowed producer addresses, if undefined anyone can participate\n */\n allowedProducers?: Address[]\n /**\n * Back-off timeout (ms) after which a head is accepted even with fewer than\n * minCandidates uncle chains available.\n * When undefined, findBestUncle applies DEFAULT_BACKOFF_MS from the protocol SDK.\n */\n backoffMs?: number\n context: BaseContext\n /**\n * Computes whether a candidate's producer had standing. Absent means the question is never\n * asked, which is what keeps a node with no stake readers running exactly as it does today.\n */\n eligibility?: ProducerEligibilityEvaluator\n mempoolViewer: MempoolViewer\n /**\n * Minimum number of uncle candidates required before accepting one.\n * When undefined, findBestUncle applies DEFAULT_MIN_CANDIDATES from the protocol SDK.\n */\n minCandidates?: number\n /** Where to publish what the two gates concluded, in shadow posture. */\n publishAdmissionShadow?: (report: AdmissionShadowReport) => Promise<void>\n}\n\ninterface UncleSelectionHealth {\n lastWarnedAt: number\n unqualifiedSince?: number\n}\n\nexport class ChainHeadSelector extends ChainFinalizer<ChainHeadSelectorParams> {\n /**\n * How long uncle selection may go without a single qualifying candidate (while candidates are\n * present) before a warning is emitted; also the minimum interval between repeat warnings.\n */\n static readonly SilentUncleRejectionWarnAfterMs = 5000\n\n protected admission: AdmissionMode\n protected allowedProducers?: Address[]\n protected backoffMs?: number\n protected minCandidates?: number\n private _timeSinceLastUncle = Date.now()\n\n constructor(params: ChainHeadSelectorParams) {\n super(params)\n this.admission = params.admission ?? 'allowlist'\n this.allowedProducers = params.allowedProducers\n this.backoffMs = params.backoffMs\n this.minCandidates = params.minCandidates\n }\n\n protected get context() {\n return this.params.context\n }\n\n protected get mempoolViewer() {\n return this.params.mempoolViewer\n }\n\n async findBestHead(): Promise<SignedHydratedBlockWithHashMeta[]> {\n return await spanRootAsync('findBestHead', async () => {\n const allProposedBlocks = await this.mempoolViewer.pendingBlocks()\n const allowed = allProposedBlocks.filter(pb => this.isAllowed(pb))\n const proposedBlocks = await this.admit(allProposedBlocks, allowed)\n\n // TODO: Validate proposed blocks\n this.windowedFinalizedChain = await getWindowedChain(this.context, this.blockViewer, this.maxWindowSize, this.windowedFinalizedChain)\n const uncles = findUncles(this.context, this.windowedFinalizedChain, proposedBlocks)\n this.reportSilentUncleRejections(proposedBlocks, uncles.length)\n return findBestUncle(this.windowedFinalizedChain, uncles, { backoffMs: this.backoffMs, minCandidates: this.minCandidates }) ?? this.windowedFinalizedChain\n }, this.context)\n }\n\n /**\n * Applies the configured admission posture.\n *\n * In `shadow` the allow-list still decides \u2014 participation is computed and published beside it,\n * and changes nothing. That is the entire value of the posture: the network keeps behaving\n * exactly as it did while everyone gets to see what the new rule would have done.\n *\n * In `enforce` participation gates, but only when it reached a conclusion. A candidate whose\n * standing cannot be established is admitted, not rejected \u2014 otherwise a finalizer that lost\n * its stake reader would quietly stop accepting anyone's blocks and stall the chain.\n *\n * Assessments publish in both postures. The audit trail must not disappear at the moment\n * admission starts gating \u2014 enforce is when it matters most.\n */\n protected async admit(\n all: SignedHydratedBlockWithHashMeta[],\n allowed: SignedHydratedBlockWithHashMeta[],\n ): Promise<SignedHydratedBlockWithHashMeta[]> {\n if (this.admission === 'allowlist' || this.params.eligibility === undefined) return allowed\n const assessments = await this.assess(all)\n await this.publishShadow(assessments)\n if (this.admission === 'shadow') return allowed\n const ineligible = new Set(assessments\n .filter(assessment => assessment.eligibility.resolvable && assessment.eligibility.eligible !== true)\n .map(assessment => assessment.dataHash))\n return allowed.filter(candidate => !ineligible.has(candidate[0]._dataHash))\n }\n\n /**\n * Runs both gates over every candidate.\n *\n * An evaluator that throws yields an unresolvable assessment rather than an exception: this\n * sits on the head-selection path, and a flaky stake reader must never be able to stop the\n * chain from finalizing.\n */\n protected async assess(all: SignedHydratedBlockWithHashMeta[]): Promise<AdmissionAssessment[]> {\n const evaluate = this.params.eligibility\n if (evaluate === undefined) return []\n const evaluateSafely = async (candidate: SignedHydratedBlockWithHashMeta) => {\n try {\n return await evaluate(candidate)\n } catch {\n return { resolvable: false }\n }\n }\n return await Promise.all(all.map(async candidate => ({\n admittedByAllowList: this.isAllowed(candidate),\n block: candidate[0].block,\n dataHash: candidate[0]._dataHash,\n eligibility: await evaluateSafely(candidate),\n producer: candidate[0].addresses[0],\n })))\n }\n\n /** Whether the configured allow-list admits a candidate. An empty list admits everyone. */\n protected isAllowed(candidate: SignedHydratedBlockWithHashMeta): boolean {\n const allowedProducers = this.allowedProducers\n return isDefined(allowedProducers) && allowedProducers.length > 0\n ? allowedProducers.includes(toAddress(candidate[0].addresses[0]))\n : true\n }\n\n /** Publishes what the two gates concluded, swallowing failures. */\n protected async publishShadow(assessments: AdmissionAssessment[]): Promise<void> {\n const publish = this.params.publishAdmissionShadow\n // an empty round says nothing worth a write\n if (publish === undefined || assessments.length === 0) return\n try {\n await publish({\n assessments,\n divergent: assessments.filter(assessment => isDivergent(assessment)),\n head: this.windowedFinalizedChain[0]?.[0]?.block ?? 0,\n })\n } catch {\n // observing must never be able to stop the chain from finalizing\n }\n }\n\n /**\n * Surfaces the otherwise-silent case where candidates are continuously present but none\n * qualifies as an uncle \u2014 without this, the only signal of a stalled selector is an endless\n * \"No new blocks found N to N\" while rejected candidates cycle through the pool. Zero-qualify\n * moments are routine in healthy operation (a just-finalized candidate lingers until the pool\n * GC), so this warns only after candidates have been failing continuously for\n * SilentUncleRejectionWarnAfterMs \u2014 an idle (candidate-free) tick resets the clock \u2014 then\n * rate-limits to one warn per that interval. State lives in context.singletons because a\n * fresh ChainHeadSelector is constructed on every finalization tick.\n */\n private reportSilentUncleRejections(proposedBlocks: SignedHydratedBlockWithHashMeta[], uncleCount: number): void {\n const singletons = this.context.singletons\n const stateKey = 'ChainHeadSelector:uncleSelectionHealth'\n const now = Date.now()\n const state = (singletons[stateKey] ?? { lastWarnedAt: 0 }) as UncleSelectionHealth\n singletons[stateKey] = state\n if (uncleCount > 0 || proposedBlocks.length === 0) {\n state.unqualifiedSince = undefined\n return\n }\n state.unqualifiedSince ??= now\n if (now - state.unqualifiedSince < ChainHeadSelector.SilentUncleRejectionWarnAfterMs) return\n if (now - state.lastWarnedAt < ChainHeadSelector.SilentUncleRejectionWarnAfterMs) return\n state.lastWarnedAt = now\n this.context.logger?.warn(\n `findBestHead: candidates have failed uncle qualification continuously for ${now - state.unqualifiedSince}ms \u2014 `\n + `${proposedBlocks.length} pending candidate(s): `\n + proposedBlocks.map(b => `${b[0].block} [${b[0]._hash}]`).join(', '),\n )\n }\n}\n\n/*\n\nComparing two heads for which is better\n\nProducer Energy\n\n1. +1 Point for every block not produced by it in recent chain LOG(active producers * 100)\n2a. Energy Multiplied by - # of transactions in block is above normal (last 1000 blocks) (+0.5 per std deviation) (max 2.5)\n2b. Energy Divided by - # of transactions in block is below normal (last 1000 blocks) (+0.5 per std deviation) (max 2.5)\n3a. Energy Multiplied by - # of gas in block is above normal (last 1000 blocks) (+0.5 per std deviation) (max 2.5)\n3b. Energy Divided by - # of gas in block is below normal (last 1000 blocks) (+0.5 per std deviation) (max 2.5)\n\nOther Ideas\n\n1. Total diverse addresses in block (not quite incentivizing what we really want)\n2. Total transactions in block (more is better, encourages non-lethargic blocks)\n3. Sum total of transactions in block (higher value means more influential/better)\n4. Sum of gas of transactions in block (higher is better, prioritizes paying contributors)\n5. Exp of transactions in block (lower is better, prioritizes not aging out before inclusion)\n6. Recency of this producer's last produced block (encourages diversification in block producers)\n\n*/\n", "import type { Promisable } from '@ariestools/sdk'\nimport { isDefined, toAddress } from '@ariestools/sdk'\nimport { type ChainAnalyzer, type HydratedBlock } from '@xyo-network/xl1-sdk'\n\nimport type { AnalyzedProducer, ChainSummaryProducers } from './ChainSummaryProducers.ts'\nimport { ChainSummaryProducersSchema } from './ChainSummaryProducers.ts'\n\nexport class ChainProducersAnalyzer implements ChainAnalyzer<ChainSummaryProducers> {\n private endingBlock = 0\n private producers: Record<string, AnalyzedProducer> = {}\n private startingBlock = 0\n\n onBlock([block]: HydratedBlock): Promisable<boolean> {\n // avoid analyzing the same block twice\n if (block.block === this.endingBlock) return true\n\n // update the ending block\n this.endingBlock = block.block\n const blockProducerAddressRaw = block.addresses[0]\n\n if (blockProducerAddressRaw === undefined) return true\n\n const blockProducerAddress = toAddress(blockProducerAddressRaw)\n\n const producerKey = String(blockProducerAddress)\n const existingProducer: AnalyzedProducer | undefined = this.producers[producerKey]\n if (isDefined(existingProducer)) {\n existingProducer.rewardsEarned = (existingProducer.rewardsEarned ?? 0n) + 0n\n existingProducer.blocksProduced++\n } else {\n const newProducer: AnalyzedProducer = {\n address: blockProducerAddress, rewardsEarned: 0n, blocksProduced: 1,\n }\n this.producers[producerKey] = newProducer\n }\n\n return true\n }\n\n result(): ChainSummaryProducers {\n return {\n endingBlock: this.endingBlock,\n producers: this.producers,\n schema: ChainSummaryProducersSchema,\n startingBlock: this.startingBlock,\n }\n }\n\n shouldContinue(): boolean {\n return true\n }\n}\n", "import type { Address } from '@ariestools/sdk'\nimport type { Payload } from '@xyo-network/sdk'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/sdk'\n\nexport const ChainSummaryProducersSchema = asSchema('network.xyo.chain.summary.producers', true)\nexport type ChainSummaryProducersSchema = typeof ChainSummaryProducersSchema\n\nexport interface AnalyzedProducer {\n address: Address\n blocksProduced: number\n rewardsEarned: bigint\n}\n\nexport interface ChainSummaryProducersFields {\n endingBlock: number\n producers: Record<string, AnalyzedProducer>\n startingBlock: number\n}\n\nexport type ChainSummaryProducers = Payload<ChainSummaryProducersFields, ChainSummaryProducersSchema>\nexport const isChainSummaryProducers = isPayloadOfSchemaType<ChainSummaryProducers>(ChainSummaryProducersSchema)\n", "import type { Promisable } from '@ariestools/sdk'\nimport { assertEx } from '@ariestools/sdk'\nimport {\n type ChainAnalyzer, type ChainStakeIntent, type HydratedBlock,\n type Intent,\n isChainStakeIntentWithStorageMeta,\n} from '@xyo-network/xl1-sdk'\n\nimport type { ChainSummaryStakeIntent } from './ChainSummaryStakeIntent.ts'\nimport { ChainSummaryStakeIntentSchema } from './ChainSummaryStakeIntent.ts'\n\nexport class ChainStakeIntentAnalyzer implements ChainAnalyzer<ChainSummaryStakeIntent> {\n private _endingBlock: number | undefined = undefined\n private _intent: Intent\n private _intentPayloads: ChainStakeIntent[] = []\n private _startingBlock: number | undefined = undefined\n\n constructor(intent: Intent) {\n this._intent = intent\n }\n\n onBlock([block, validatedPayloads]: HydratedBlock): Promisable<boolean> {\n this._startingBlock ??= block.block\n\n // Update the ending block\n this._endingBlock = block.block\n const intents = validatedPayloads.filter(isChainStakeIntentWithStorageMeta)\n const desiredIntents = intents.filter(intent => intent.intent === this._intent)\n this._intentPayloads.push(...desiredIntents)\n return true\n }\n\n result(): ChainSummaryStakeIntent {\n assertEx(this._startingBlock !== undefined, () => 'ChainStakeIntentAnalyzer: Invalid startingBlock')\n assertEx(this._endingBlock !== undefined, () => 'ChainStakeIntentAnalyzer: Invalid endingBlock')\n return {\n endingBlock: this._endingBlock!,\n intents: this._intentPayloads,\n schema: ChainSummaryStakeIntentSchema,\n startingBlock: this._startingBlock!,\n }\n }\n\n shouldContinue(): boolean {\n return true\n }\n}\n", "import type { Payload } from '@xyo-network/sdk'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/sdk'\nimport type { ChainStakeIntent } from '@xyo-network/xl1-sdk'\n\nexport const ChainSummaryStakeIntentSchema = asSchema('network.xyo.chain.summary.staked.intent', true)\nexport type ChainSummaryStakeIntentSchema = typeof ChainSummaryStakeIntentSchema\n\ninterface ChainSummaryStakeIntentFields {\n endingBlock: number\n intents: ChainStakeIntent[]\n startingBlock: number\n}\n\nexport type ChainSummaryStakeIntent = Payload<ChainSummaryStakeIntentFields, ChainSummaryStakeIntentSchema>\nexport const isChainSummaryStakeIntent = isPayloadOfSchemaType<ChainSummaryStakeIntent>(ChainSummaryStakeIntentSchema)\n", "import {\n type Address, type Hash, type Hex,\n} from '@ariestools/sdk'\nimport type { Payload } from '@xyo-network/sdk'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/sdk'\nimport type { SignedBigInt } from '@xyo-network/xl1-sdk'\n\nexport const ChainSummaryTransfersSchema = asSchema('network.xyo.chain.summary.transfers', true)\nexport type ChainSummaryTransfersSchema = typeof ChainSummaryTransfersSchema\n\nexport interface ChainSummaryTransfersFields {\n firstBlock: Hash | null\n hasMinTransfer?: Record<Address, Hex>\n lastBlock: Hash | null\n transfers: Record<Address, Record<Address, SignedBigInt>>\n}\n\nexport type ChainSummaryTransfers = Payload<ChainSummaryTransfersFields, ChainSummaryTransfersSchema>\nexport const isChainSummaryTransfers = isPayloadOfSchemaType<ChainSummaryTransfers>(ChainSummaryTransfersSchema)\n", "import type { Address, Hash } from '@ariestools/sdk'\nimport { isDefined, toAddress } from '@ariestools/sdk'\nimport { trace, type Tracer } from '@opentelemetry/api'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport type {\n ChainAnalyzer,\n HydratedBlockWithHashMeta, SignedBigInt,\n} from '@xyo-network/xl1-sdk'\nimport {\n netTransfersForPayloads,\n parseSignedBigInt, toSignedBigInt,\n} from '@xyo-network/xl1-sdk'\n\nimport type { ChainSummaryTransfers } from './ChainSummaryTransfers.ts'\nimport { ChainSummaryTransfersSchema } from './ChainSummaryTransfers.ts'\n\nconst bigintTransfers = (transfers: Record<Address, Record<Address, SignedBigInt>>) => {\n const result: Record<string, Record<string, bigint>> = {}\n for (const [from, toMap] of Object.entries(transfers)) {\n const fromKey = String(toAddress(from))\n for (const [to, balance] of Object.entries(toMap)) {\n const toKey = String(toAddress(to))\n if (isDefined(balance)) {\n const fromTransfers = result[fromKey] ?? {}\n result[fromKey] = fromTransfers\n fromTransfers[toKey] = parseSignedBigInt(balance)\n }\n }\n }\n return result\n}\n\nexport class TransferAnalyzer implements ChainAnalyzer {\n protected _tracer: Tracer | undefined\n private _firstBlock?: Hash\n private _lastBlock?: Hash\n private _transfers: Record<string, Record<string, bigint>> = {}\n\n constructor(startingTransfers?: ChainSummaryTransfers) {\n this._transfers = startingTransfers ? bigintTransfers(startingTransfers.transfers) : {}\n }\n\n protected get tracer() {\n if (this._tracer) return this._tracer\n this._tracer = trace.getTracer('TransferAnalyzer')\n return this._tracer\n }\n\n onBlock([block, payloads]: HydratedBlockWithHashMeta): boolean {\n this._firstBlock = this._firstBlock ?? block._hash\n this._lastBlock = block._hash\n const netTransfers = netTransfersForPayloads({ singletons: {} }, payloads)\n for (const [from, toMap] of Object.entries(netTransfers)) {\n const fromKey = String(toAddress(from))\n const fromTransfers = this._transfers[fromKey] ?? {}\n this._transfers[fromKey] = fromTransfers\n for (const [to, balance] of Object.entries(toMap)) {\n const toKey = String(toAddress(to))\n fromTransfers[toKey] = (fromTransfers[toKey] ?? 0n) + balance\n }\n }\n return this.shouldContinue()\n }\n\n result() {\n const transfers: Record<string, Record<string, SignedBigInt>> = {}\n for (const [from, toMap] of Object.entries(this._transfers)) {\n const fromKey = String(toAddress(from))\n const positiveTransfers = Object.entries(toMap).filter(([, balance]) => balance > 0n)\n for (const [to, balance] of positiveTransfers) {\n const fromTransfers = transfers[fromKey] ?? {}\n transfers[fromKey] = fromTransfers\n const toKey = String(toAddress(to))\n fromTransfers[toKey] = toSignedBigInt(balance)\n }\n }\n const builder = new PayloadBuilder<ChainSummaryTransfers>({ schema: ChainSummaryTransfersSchema })\n return builder.fields({\n firstBlock: this._firstBlock ?? null,\n lastBlock: this._lastBlock ?? null,\n transfers,\n }).build()\n }\n\n shouldContinue() {\n return true\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type { Promisable } from '@ariestools/sdk'\nimport type { XyoAddress } from '@xyo-network/sdk'\nimport type { SignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-sdk'\n\nimport type { EligibilityEvaluation } from '#slashing'\n\n/**\n * How a finalizer decides which candidates it will consider.\n *\n * Three postures, and moving between them is a configuration change rather than a different\n * build. That constraint is deliberate: a network that had to be redeployed to step back from\n * enforcement would, in the moment it most needed to step back, be unable to.\n *\n * - `allowlist` \u2014 only the named producers, which is how the chain runs today\n * - `shadow` \u2014 the same gate, plus participation computed and published for every candidate\n * - `enforce` \u2014 participation itself gates\n */\nexport const AdmissionModes = ['allowlist', 'shadow', 'enforce'] as const\n\n/** How a finalizer decides which candidates it will consider. */\nexport type AdmissionMode = typeof AdmissionModes[number]\n\n/** Evaluates whether a candidate's producer had standing to produce it. */\nexport type ProducerEligibilityEvaluator\n = (candidate: SignedHydratedBlockWithHashMeta) => Promisable<EligibilityEvaluation>\n\n/** What both gates concluded about one candidate. */\nexport interface AdmissionAssessment {\n /** Whether the allow-list admits it. */\n admittedByAllowList: boolean\n /** The candidate's height. */\n block: number\n /** The candidate's signed identity. */\n dataHash: string\n /** What the participation predicate concluded. */\n eligibility: EligibilityEvaluation\n /** The producer. */\n producer: XyoAddress\n}\n\n/**\n * What the two gates said about a round of candidates, and where they disagreed.\n *\n * Published rather than logged, because the whole purpose of the shadow posture is that anyone \u2014\n * not just the operator holding the terminal \u2014 can see what enforcement would have done before it\n * does it. An operator convinced by their own logs has convinced nobody.\n */\nexport interface AdmissionShadowReport {\n /** Every candidate considered this round. */\n assessments: AdmissionAssessment[]\n /** Only those where the two gates disagreed. */\n divergent: AdmissionAssessment[]\n /** The finalized height this round was selected against. */\n head: number\n}\n\n/** Moniker the admission shadow publisher resolves under. */\nexport const AdmissionShadowPublishRunnerMoniker = 'AdmissionShadowPublishRunner'\n\n/**\n * Publishes what both admission gates concluded.\n *\n * An interface rather than a class here because the finalizer must not depend on the launcher\n * that supplies the implementation \u2014 the actor states what it needs, and orchestration decides\n * what satisfies it.\n */\nexport interface AdmissionShadowPublishRunner {\n publish(report: AdmissionShadowReport): Promisable<void>\n}\n\n/** Whether a resolved provider can actually publish shadow reports. */\nexport function isAdmissionShadowPublishRunner(value: unknown): value is AdmissionShadowPublishRunner {\n return typeof (value as Partial<AdmissionShadowPublishRunner> | undefined)?.publish === 'function'\n}\n\n/** Whether the two gates reached different conclusions about a candidate. */\nexport function isDivergent(assessment: AdmissionAssessment): boolean {\n // an unresolvable evaluation is not a disagreement \u2014 it is an absence of one\n if (!assessment.eligibility.resolvable) return false\n return assessment.admittedByAllowList !== (assessment.eligibility.eligible === true)\n}\n", "/* eslint-disable complexity */\nimport type { Hash } from '@ariestools/sdk'\nimport {\n assertEx, isError, spanRootAsync,\n} from '@ariestools/sdk'\nimport type { Payload } from '@xyo-network/sdk'\nimport type {\n BlockContextRead,\n ChainAnalyzer,\n HydratedBlock, HydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-sdk'\nimport { hydrateBlock } from '@xyo-network/xl1-sdk'\n\nconst analyzeBlock = async (block: HydratedBlock, handlers: ChainAnalyzer[]): Promise<HydratedBlock> => {\n await Promise.all(handlers.map(async (handler) => {\n await handler.onBlock(block)\n }))\n return block\n}\n\nexport const analyzeChain = async (\n context: BlockContextRead,\n handlers: ChainAnalyzer[],\n /* the hash to start at */\n head: Hash | HydratedBlockWithHashMeta,\n /* a hash that we should stop at if we reach it */\n previousHead: Hash | null = null,\n /* max number of blocks to analyze (-1 for no limit) */\n maxDepth = -1n,\n): Promise<Payload[]> => {\n const { logger } = context\n logger?.log('analyzeChain.start', previousHead)\n return assertEx(await spanRootAsync('analyzeChain', async () => {\n let lastBlockNumber = -1\n let maxDepthLimit = maxDepth === -1n ? BigInt(Number.MAX_SAFE_INTEGER) : maxDepth\n let cursor: HydratedBlockWithHashMeta | null = typeof head === 'string' ? await hydrateBlock(context, head) : head\n // If the terminal block is the current head, we don't need to analyze it\n logger?.log('analyzeChain.cursor', cursor?.[0].block)\n if (previousHead !== null && cursor?.[0]._hash === previousHead) return []\n while (cursor && (maxDepthLimit > 0n)) {\n maxDepthLimit -= 1n\n await analyzeBlock(cursor, handlers)\n lastBlockNumber = cursor[0].block\n try {\n cursor = cursor[0].previous === null ? null : await hydrateBlock(context, cursor[0].previous)\n } catch (ex) {\n if (isError(ex)) {\n logger?.warn('Error in hydrateBlock', ex)\n }\n break\n }\n if (cursor?.[0]._hash === previousHead) break\n }\n if (previousHead === null && maxDepth === -1n && lastBlockNumber !== 0) {\n logger?.warn(`Expected root block number to be 0, but was ${lastBlockNumber} : ${previousHead}`)\n }\n logger?.log('analyzeChain.done', lastBlockNumber)\n return handlers.map((handler) => {\n return handler.result()\n })\n }, context), () => 'analyzeChain failed')\n}\n", "import type { Address, Hash } from '@ariestools/sdk'\nimport { isDefined, toAddress } from '@ariestools/sdk'\nimport { trace, type Tracer } from '@opentelemetry/api'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport type {\n ChainAnalyzer,\n HydratedBlockWithHashMeta, SignedBigInt,\n} from '@xyo-network/xl1-sdk'\nimport {\n netBalancesForPayloads,\n parseSignedBigInt, toSignedBigInt,\n} from '@xyo-network/xl1-sdk'\n\nimport type { ChainSummaryBalances } from './ChainSummaryBalances.ts'\nimport { ChainSummaryBalancesSchema } from './ChainSummaryBalances.ts'\n\nconst bigintBalances = (balances: Partial<Record<Address, SignedBigInt>>) => {\n const result: Record<string, bigint> = {}\n for (const [address, balance] of Object.entries(balances)) {\n if (isDefined(balance)) {\n const propertyKey = String(toAddress(address))\n result[propertyKey] = parseSignedBigInt(balance)\n }\n }\n return result\n}\n\nexport class BalanceAnalyzer implements ChainAnalyzer {\n protected _tracer: Tracer | undefined\n private _addresses: Address[]\n private _balances: Record<string, bigint> = {}\n private _firstBlock?: Hash\n private _lastBlock?: Hash\n private _minBalances: bigint[]\n\n constructor(addresses: Address[] = [], minBalances: bigint[] = [], startingBalances?: ChainSummaryBalances) {\n this._addresses = addresses\n this._minBalances = minBalances\n this._balances = startingBalances ? bigintBalances(startingBalances.balances) : {}\n }\n\n protected get tracer() {\n if (this._tracer) return this._tracer\n this._tracer = trace.getTracer('BalanceAnalyzer')\n return this._tracer\n }\n\n onBlock([block, payloads]: HydratedBlockWithHashMeta): boolean {\n this._firstBlock = this._firstBlock ?? block._hash\n this._lastBlock = block._hash\n const netBalances = netBalancesForPayloads({ singletons: {} }, payloads)\n for (const [address, balance] of Object.entries(netBalances)) {\n const propertyKey = String(toAddress(address))\n this._balances[propertyKey] = (this._balances[propertyKey] ?? 0n) + balance\n }\n return this.shouldContinue()\n }\n\n result() {\n const balances: Record<string, SignedBigInt> = {}\n const positiveBalances = Object.entries(this._balances).filter(([, balance]) => balance > 0n)\n for (const [address, balance] of positiveBalances) {\n const propertyKey = String(toAddress(address))\n balances[propertyKey] = toSignedBigInt(balance)\n }\n const builder = new PayloadBuilder<ChainSummaryBalances>({ schema: ChainSummaryBalancesSchema })\n return builder.fields({\n firstBlock: this._firstBlock ?? null,\n lastBlock: this._lastBlock ?? null,\n balances,\n }).build()\n }\n\n shouldContinue() {\n return !this.allMinBalancesReached()\n }\n\n protected allMinBalancesReached() {\n if (this._minBalances.length === 0) return true\n for (let i = 0; i < this._addresses.length; i++) {\n const propertyKey = String(this._addresses[i])\n if ((this._balances[propertyKey] ?? 0n) < this._minBalances[i]) return false\n }\n return true\n }\n}\n", "import {\n type Address, type Hash, type Hex,\n} from '@ariestools/sdk'\nimport type { Payload } from '@xyo-network/sdk'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/sdk'\nimport type { SignedBigInt } from '@xyo-network/xl1-sdk'\n\nexport const ChainSummaryBalancesSchema = asSchema('network.xyo.chain.summary.balances', true)\nexport type ChainSummaryBalancesSchema = typeof ChainSummaryBalancesSchema\n\nexport interface ChainSummaryBalancesFields {\n balances: Partial<Record<Address, SignedBigInt>>\n firstBlock: Hash | null\n hasMinBalance?: Record<Address, Hex>\n lastBlock: Hash | null\n}\n\nexport type ChainSummaryBalances = Payload<ChainSummaryBalancesFields, ChainSummaryBalancesSchema>\nexport const isChainSummaryBalances = isPayloadOfSchemaType<ChainSummaryBalances>(ChainSummaryBalancesSchema)\n", "import type { BaseParams, Promisable } from '@ariestools/sdk'\nimport { Base } from '@ariestools/sdk'\nimport type { Tracer } from '@opentelemetry/api'\nimport type { BlockViewer, SignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-sdk'\nimport { asXL1BlockRange } from '@xyo-network/xl1-sdk'\n\nexport interface ChainFinalizerParams extends BaseParams {\n blockViewer: BlockViewer\n maxWindowSize?: number\n windowedFinalizedChain?: SignedHydratedBlockWithHashMeta[]\n}\n\nexport class ChainFinalizer<TParams extends ChainFinalizerParams = ChainFinalizerParams> extends Base<TParams> {\n protected _tracer: Tracer | undefined\n // the chainArchivist is assumed to be an archivist with already validated blocks in it along with all the transactions and payloads\n // it is also assumed that the sequence order of archivist is that newer blocks come after older blocks\n\n protected windowedFinalizedChain: SignedHydratedBlockWithHashMeta[]\n\n constructor(params: TParams) {\n super(params)\n this.windowedFinalizedChain = [...(params.windowedFinalizedChain ?? [])]\n }\n\n protected get blockViewer() {\n return this.params.blockViewer\n }\n\n protected get finalizedBlockNumber() {\n return this.windowedFinalizedChain?.at(-1)?.[0].block ?? -1\n }\n\n protected get maxWindowSize() {\n return this.params.maxWindowSize ?? 100\n }\n\n protected get windowRange() {\n return asXL1BlockRange([this.windowedFinalizedChain.at(0)?.[0].block ?? 0, this.finalizedBlockNumber])\n }\n\n finalizeChainFragment(chain: SignedHydratedBlockWithHashMeta[]): Promisable<void> {\n this.windowedFinalizedChain = [...this.windowedFinalizedChain, ...chain].slice(-this.maxWindowSize)\n }\n}\n", "import type { Address } from '@ariestools/sdk'\nimport {\n isDefined, spanRootAsync, toAddress,\n} from '@ariestools/sdk'\nimport type {\n BaseContext, MempoolViewer, SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-sdk'\nimport {\n findBestUncle, findUncles, getWindowedChain, isTransactionBoundWitness,\n} from '@xyo-network/xl1-sdk'\n\nimport type {\n AdmissionAssessment, AdmissionMode, AdmissionShadowReport, ProducerEligibilityEvaluator,\n} from './admission.ts'\nimport { isDivergent } from './admission.ts'\nimport type { ChainFinalizerParams } from './ChainFinalizer.ts'\nimport { ChainFinalizer } from './ChainFinalizer.ts'\n\nexport interface ChainHeadSelectorParams extends ChainFinalizerParams {\n /**\n * How candidates are admitted. Defaults to `allowlist`, which is how the chain runs today.\n */\n admission?: AdmissionMode\n /**\n * List of allowed producer addresses, if undefined anyone can participate\n */\n allowedProducers?: Address[]\n /**\n * Back-off timeout (ms) after which a head is accepted even with fewer than\n * minCandidates uncle chains available.\n * When undefined, findBestUncle applies DEFAULT_BACKOFF_MS from the protocol SDK.\n */\n backoffMs?: number\n context: BaseContext\n /**\n * Computes whether a candidate's producer had standing. Absent means the question is never\n * asked, which is what keeps a node with no stake readers running exactly as it does today.\n */\n eligibility?: ProducerEligibilityEvaluator\n /**\n * Minimum epoch spacing (ms) between transaction-less heartbeat blocks this selector will\n * qualify \u2014 a defense against producers heartbeating faster than the network's intended pace.\n * Transaction-carrying candidates are exempt. Undefined disables the check.\n */\n heartbeatInterval?: number\n mempoolViewer: MempoolViewer\n /**\n * Minimum number of uncle candidates required before accepting one.\n * When undefined, findBestUncle applies DEFAULT_MIN_CANDIDATES from the protocol SDK.\n */\n minCandidates?: number\n /** Where to publish what the two gates concluded, in shadow posture. */\n publishAdmissionShadow?: (report: AdmissionShadowReport) => Promise<void>\n}\n\ninterface UncleSelectionHealth {\n lastWarnedAt: number\n unqualifiedSince?: number\n}\n\nexport class ChainHeadSelector extends ChainFinalizer<ChainHeadSelectorParams> {\n /**\n * How long uncle selection may go without a single qualifying candidate (while candidates are\n * present) before a warning is emitted; also the minimum interval between repeat warnings.\n */\n static readonly SilentUncleRejectionWarnAfterMs = 5000\n\n protected admission: AdmissionMode\n protected allowedProducers?: Address[]\n protected backoffMs?: number\n protected heartbeatInterval?: number\n protected minCandidates?: number\n private _timeSinceLastUncle = Date.now()\n\n constructor(params: ChainHeadSelectorParams) {\n super(params)\n this.admission = params.admission ?? 'allowlist'\n this.allowedProducers = params.allowedProducers\n this.backoffMs = params.backoffMs\n this.heartbeatInterval = params.heartbeatInterval\n this.minCandidates = params.minCandidates\n }\n\n protected get context() {\n return this.params.context\n }\n\n protected get mempoolViewer() {\n return this.params.mempoolViewer\n }\n\n async findBestHead(): Promise<SignedHydratedBlockWithHashMeta[]> {\n return await spanRootAsync('findBestHead', async () => {\n const allProposedBlocks = await this.mempoolViewer.pendingBlocks()\n const allowed = allProposedBlocks.filter(pb => this.isAllowed(pb))\n const proposedBlocks = await this.admit(allProposedBlocks, allowed)\n\n // TODO: Validate proposed blocks\n this.windowedFinalizedChain = await getWindowedChain(this.context, this.blockViewer, this.maxWindowSize, this.windowedFinalizedChain)\n const pacedBlocks = this.filterPacedHeartbeatCandidates(proposedBlocks)\n const uncles = findUncles(this.context, this.windowedFinalizedChain, pacedBlocks)\n this.reportSilentUncleRejections(pacedBlocks, uncles.length)\n return findBestUncle(this.windowedFinalizedChain, uncles, { backoffMs: this.backoffMs, minCandidates: this.minCandidates }) ?? this.windowedFinalizedChain\n }, this.context)\n }\n\n /**\n * Applies the configured admission posture.\n *\n * In `shadow` the allow-list still decides \u2014 participation is computed and published beside it,\n * and changes nothing. That is the entire value of the posture: the network keeps behaving\n * exactly as it did while everyone gets to see what the new rule would have done.\n *\n * In `enforce` participation gates, but only when it reached a conclusion. A candidate whose\n * standing cannot be established is admitted, not rejected \u2014 otherwise a finalizer that lost\n * its stake reader would quietly stop accepting anyone's blocks and stall the chain.\n *\n * Assessments publish in both postures. The audit trail must not disappear at the moment\n * admission starts gating \u2014 enforce is when it matters most.\n */\n protected async admit(\n all: SignedHydratedBlockWithHashMeta[],\n allowed: SignedHydratedBlockWithHashMeta[],\n ): Promise<SignedHydratedBlockWithHashMeta[]> {\n if (this.admission === 'allowlist' || this.params.eligibility === undefined) return allowed\n const assessments = await this.assess(all)\n await this.publishShadow(assessments)\n if (this.admission === 'shadow') return allowed\n const ineligible = new Set(assessments\n .filter(assessment => assessment.eligibility.resolvable && assessment.eligibility.eligible !== true)\n .map(assessment => assessment.dataHash))\n return allowed.filter(candidate => !ineligible.has(candidate[0]._dataHash))\n }\n\n /**\n * Runs both gates over every candidate.\n *\n * An evaluator that throws yields an unresolvable assessment rather than an exception: this\n * sits on the head-selection path, and a flaky stake reader must never be able to stop the\n * chain from finalizing.\n */\n protected async assess(all: SignedHydratedBlockWithHashMeta[]): Promise<AdmissionAssessment[]> {\n const evaluate = this.params.eligibility\n if (evaluate === undefined) return []\n const evaluateSafely = async (candidate: SignedHydratedBlockWithHashMeta) => {\n try {\n return await evaluate(candidate)\n } catch {\n return { resolvable: false }\n }\n }\n return await Promise.all(all.map(async candidate => ({\n admittedByAllowList: this.isAllowed(candidate),\n block: candidate[0].block,\n dataHash: candidate[0]._dataHash,\n eligibility: await evaluateSafely(candidate),\n producer: candidate[0].addresses[0],\n })))\n }\n\n /**\n * Defense against unwanted heartbeat rates: a transaction-less (heartbeat) candidate qualifies\n * only when its signing epoch is at least heartbeatInterval after the current head's. Measured\n * on chain data, so every finalizer applies the same pace deterministically regardless of wall\n * clock. A producer heartbeating faster than the network's pace \u2014 misconfigured or hostile \u2014\n * cannot drive the chain's block rate: its candidates never qualify and age out of the pool,\n * while transaction-carrying candidates are exempt and finalize immediately.\n */\n protected filterPacedHeartbeatCandidates(proposedBlocks: SignedHydratedBlockWithHashMeta[]): SignedHydratedBlockWithHashMeta[] {\n const interval = this.heartbeatInterval\n if (interval === undefined || proposedBlocks.length === 0) return proposedBlocks\n const headEpoch = this.windowedFinalizedChain.at(-1)?.[0].$epoch\n if (!isDefined(headEpoch)) return proposedBlocks\n const paced = proposedBlocks.filter((candidate) => {\n if (candidate[1].some(payload => isTransactionBoundWitness(payload))) return true\n const candidateEpoch = candidate[0].$epoch\n // a candidate without an epoch cannot be paced here; shape validation owns that case\n if (!isDefined(candidateEpoch)) return true\n return candidateEpoch - headEpoch >= interval\n })\n if (paced.length < proposedBlocks.length) {\n this.context.logger?.debug(\n `findBestHead: paced out ${proposedBlocks.length - paced.length} heartbeat candidate(s) `\n + `younger than ${interval}ms since the head`,\n )\n }\n return paced\n }\n\n /** Whether the configured allow-list admits a candidate. An empty list admits everyone. */\n protected isAllowed(candidate: SignedHydratedBlockWithHashMeta): boolean {\n const allowedProducers = this.allowedProducers\n return isDefined(allowedProducers) && allowedProducers.length > 0\n ? allowedProducers.includes(toAddress(candidate[0].addresses[0]))\n : true\n }\n\n /** Publishes what the two gates concluded, swallowing failures. */\n protected async publishShadow(assessments: AdmissionAssessment[]): Promise<void> {\n const publish = this.params.publishAdmissionShadow\n // an empty round says nothing worth a write\n if (publish === undefined || assessments.length === 0) return\n try {\n await publish({\n assessments,\n divergent: assessments.filter(assessment => isDivergent(assessment)),\n head: this.windowedFinalizedChain[0]?.[0]?.block ?? 0,\n })\n } catch {\n // observing must never be able to stop the chain from finalizing\n }\n }\n\n /**\n * Surfaces the otherwise-silent case where candidates are continuously present but none\n * qualifies as an uncle \u2014 without this, the only signal of a stalled selector is an endless\n * \"No new blocks found N to N\" while rejected candidates cycle through the pool. Zero-qualify\n * moments are routine in healthy operation (a just-finalized candidate lingers until the pool\n * GC), so this warns only after candidates have been failing continuously for\n * SilentUncleRejectionWarnAfterMs \u2014 an idle (candidate-free) tick resets the clock \u2014 then\n * rate-limits to one warn per that interval. State lives in context.singletons because a\n * fresh ChainHeadSelector is constructed on every finalization tick.\n */\n private reportSilentUncleRejections(proposedBlocks: SignedHydratedBlockWithHashMeta[], uncleCount: number): void {\n const singletons = this.context.singletons\n const stateKey = 'ChainHeadSelector:uncleSelectionHealth'\n const now = Date.now()\n const state = (singletons[stateKey] ?? { lastWarnedAt: 0 }) as UncleSelectionHealth\n singletons[stateKey] = state\n if (uncleCount > 0 || proposedBlocks.length === 0) {\n state.unqualifiedSince = undefined\n return\n }\n state.unqualifiedSince ??= now\n if (now - state.unqualifiedSince < ChainHeadSelector.SilentUncleRejectionWarnAfterMs) return\n if (now - state.lastWarnedAt < ChainHeadSelector.SilentUncleRejectionWarnAfterMs) return\n state.lastWarnedAt = now\n this.context.logger?.warn(\n `findBestHead: candidates have failed uncle qualification continuously for ${now - state.unqualifiedSince}ms \u2014 `\n + `${proposedBlocks.length} pending candidate(s): `\n + proposedBlocks.map(b => `${b[0].block} [${b[0]._hash}]`).join(', '),\n )\n }\n}\n\n/*\n\nComparing two heads for which is better\n\nProducer Energy\n\n1. +1 Point for every block not produced by it in recent chain LOG(active producers * 100)\n2a. Energy Multiplied by - # of transactions in block is above normal (last 1000 blocks) (+0.5 per std deviation) (max 2.5)\n2b. Energy Divided by - # of transactions in block is below normal (last 1000 blocks) (+0.5 per std deviation) (max 2.5)\n3a. Energy Multiplied by - # of gas in block is above normal (last 1000 blocks) (+0.5 per std deviation) (max 2.5)\n3b. Energy Divided by - # of gas in block is below normal (last 1000 blocks) (+0.5 per std deviation) (max 2.5)\n\nOther Ideas\n\n1. Total diverse addresses in block (not quite incentivizing what we really want)\n2. Total transactions in block (more is better, encourages non-lethargic blocks)\n3. Sum total of transactions in block (higher value means more influential/better)\n4. Sum of gas of transactions in block (higher is better, prioritizes paying contributors)\n5. Exp of transactions in block (lower is better, prioritizes not aging out before inclusion)\n6. Recency of this producer's last produced block (encourages diversification in block producers)\n\n*/\n", "import type { Promisable } from '@ariestools/sdk'\nimport { isDefined, toAddress } from '@ariestools/sdk'\nimport { type ChainAnalyzer, type HydratedBlock } from '@xyo-network/xl1-sdk'\n\nimport type { AnalyzedProducer, ChainSummaryProducers } from './ChainSummaryProducers.ts'\nimport { ChainSummaryProducersSchema } from './ChainSummaryProducers.ts'\n\nexport class ChainProducersAnalyzer implements ChainAnalyzer<ChainSummaryProducers> {\n private endingBlock = 0\n private producers: Record<string, AnalyzedProducer> = {}\n private startingBlock = 0\n\n onBlock([block]: HydratedBlock): Promisable<boolean> {\n // avoid analyzing the same block twice\n if (block.block === this.endingBlock) return true\n\n // update the ending block\n this.endingBlock = block.block\n const blockProducerAddressRaw = block.addresses[0]\n\n if (blockProducerAddressRaw === undefined) return true\n\n const blockProducerAddress = toAddress(blockProducerAddressRaw)\n\n const producerKey = String(blockProducerAddress)\n const existingProducer: AnalyzedProducer | undefined = this.producers[producerKey]\n if (isDefined(existingProducer)) {\n existingProducer.rewardsEarned = (existingProducer.rewardsEarned ?? 0n) + 0n\n existingProducer.blocksProduced++\n } else {\n const newProducer: AnalyzedProducer = {\n address: blockProducerAddress, rewardsEarned: 0n, blocksProduced: 1,\n }\n this.producers[producerKey] = newProducer\n }\n\n return true\n }\n\n result(): ChainSummaryProducers {\n return {\n endingBlock: this.endingBlock,\n producers: this.producers,\n schema: ChainSummaryProducersSchema,\n startingBlock: this.startingBlock,\n }\n }\n\n shouldContinue(): boolean {\n return true\n }\n}\n", "import type { Address } from '@ariestools/sdk'\nimport type { Payload } from '@xyo-network/sdk'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/sdk'\n\nexport const ChainSummaryProducersSchema = asSchema('network.xyo.chain.summary.producers', true)\nexport type ChainSummaryProducersSchema = typeof ChainSummaryProducersSchema\n\nexport interface AnalyzedProducer {\n address: Address\n blocksProduced: number\n rewardsEarned: bigint\n}\n\nexport interface ChainSummaryProducersFields {\n endingBlock: number\n producers: Record<string, AnalyzedProducer>\n startingBlock: number\n}\n\nexport type ChainSummaryProducers = Payload<ChainSummaryProducersFields, ChainSummaryProducersSchema>\nexport const isChainSummaryProducers = isPayloadOfSchemaType<ChainSummaryProducers>(ChainSummaryProducersSchema)\n", "import type { Promisable } from '@ariestools/sdk'\nimport { assertEx } from '@ariestools/sdk'\nimport {\n type ChainAnalyzer, type ChainStakeIntent, type HydratedBlock,\n type Intent,\n isChainStakeIntentWithStorageMeta,\n} from '@xyo-network/xl1-sdk'\n\nimport type { ChainSummaryStakeIntent } from './ChainSummaryStakeIntent.ts'\nimport { ChainSummaryStakeIntentSchema } from './ChainSummaryStakeIntent.ts'\n\nexport class ChainStakeIntentAnalyzer implements ChainAnalyzer<ChainSummaryStakeIntent> {\n private _endingBlock: number | undefined = undefined\n private _intent: Intent\n private _intentPayloads: ChainStakeIntent[] = []\n private _startingBlock: number | undefined = undefined\n\n constructor(intent: Intent) {\n this._intent = intent\n }\n\n onBlock([block, validatedPayloads]: HydratedBlock): Promisable<boolean> {\n this._startingBlock ??= block.block\n\n // Update the ending block\n this._endingBlock = block.block\n const intents = validatedPayloads.filter(isChainStakeIntentWithStorageMeta)\n const desiredIntents = intents.filter(intent => intent.intent === this._intent)\n this._intentPayloads.push(...desiredIntents)\n return true\n }\n\n result(): ChainSummaryStakeIntent {\n assertEx(this._startingBlock !== undefined, () => 'ChainStakeIntentAnalyzer: Invalid startingBlock')\n assertEx(this._endingBlock !== undefined, () => 'ChainStakeIntentAnalyzer: Invalid endingBlock')\n return {\n endingBlock: this._endingBlock!,\n intents: this._intentPayloads,\n schema: ChainSummaryStakeIntentSchema,\n startingBlock: this._startingBlock!,\n }\n }\n\n shouldContinue(): boolean {\n return true\n }\n}\n", "import type { Payload } from '@xyo-network/sdk'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/sdk'\nimport type { ChainStakeIntent } from '@xyo-network/xl1-sdk'\n\nexport const ChainSummaryStakeIntentSchema = asSchema('network.xyo.chain.summary.staked.intent', true)\nexport type ChainSummaryStakeIntentSchema = typeof ChainSummaryStakeIntentSchema\n\ninterface ChainSummaryStakeIntentFields {\n endingBlock: number\n intents: ChainStakeIntent[]\n startingBlock: number\n}\n\nexport type ChainSummaryStakeIntent = Payload<ChainSummaryStakeIntentFields, ChainSummaryStakeIntentSchema>\nexport const isChainSummaryStakeIntent = isPayloadOfSchemaType<ChainSummaryStakeIntent>(ChainSummaryStakeIntentSchema)\n", "import {\n type Address, type Hash, type Hex,\n} from '@ariestools/sdk'\nimport type { Payload } from '@xyo-network/sdk'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/sdk'\nimport type { SignedBigInt } from '@xyo-network/xl1-sdk'\n\nexport const ChainSummaryTransfersSchema = asSchema('network.xyo.chain.summary.transfers', true)\nexport type ChainSummaryTransfersSchema = typeof ChainSummaryTransfersSchema\n\nexport interface ChainSummaryTransfersFields {\n firstBlock: Hash | null\n hasMinTransfer?: Record<Address, Hex>\n lastBlock: Hash | null\n transfers: Record<Address, Record<Address, SignedBigInt>>\n}\n\nexport type ChainSummaryTransfers = Payload<ChainSummaryTransfersFields, ChainSummaryTransfersSchema>\nexport const isChainSummaryTransfers = isPayloadOfSchemaType<ChainSummaryTransfers>(ChainSummaryTransfersSchema)\n", "import type { Address, Hash } from '@ariestools/sdk'\nimport { isDefined, toAddress } from '@ariestools/sdk'\nimport { trace, type Tracer } from '@opentelemetry/api'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport type {\n ChainAnalyzer,\n HydratedBlockWithHashMeta, SignedBigInt,\n} from '@xyo-network/xl1-sdk'\nimport {\n netTransfersForPayloads,\n parseSignedBigInt, toSignedBigInt,\n} from '@xyo-network/xl1-sdk'\n\nimport type { ChainSummaryTransfers } from './ChainSummaryTransfers.ts'\nimport { ChainSummaryTransfersSchema } from './ChainSummaryTransfers.ts'\n\nconst bigintTransfers = (transfers: Record<Address, Record<Address, SignedBigInt>>) => {\n const result: Record<string, Record<string, bigint>> = {}\n for (const [from, toMap] of Object.entries(transfers)) {\n const fromKey = String(toAddress(from))\n for (const [to, balance] of Object.entries(toMap)) {\n const toKey = String(toAddress(to))\n if (isDefined(balance)) {\n const fromTransfers = result[fromKey] ?? {}\n result[fromKey] = fromTransfers\n fromTransfers[toKey] = parseSignedBigInt(balance)\n }\n }\n }\n return result\n}\n\nexport class TransferAnalyzer implements ChainAnalyzer {\n protected _tracer: Tracer | undefined\n private _firstBlock?: Hash\n private _lastBlock?: Hash\n private _transfers: Record<string, Record<string, bigint>> = {}\n\n constructor(startingTransfers?: ChainSummaryTransfers) {\n this._transfers = startingTransfers ? bigintTransfers(startingTransfers.transfers) : {}\n }\n\n protected get tracer() {\n if (this._tracer) return this._tracer\n this._tracer = trace.getTracer('TransferAnalyzer')\n return this._tracer\n }\n\n onBlock([block, payloads]: HydratedBlockWithHashMeta): boolean {\n this._firstBlock = this._firstBlock ?? block._hash\n this._lastBlock = block._hash\n const netTransfers = netTransfersForPayloads({ singletons: {} }, payloads)\n for (const [from, toMap] of Object.entries(netTransfers)) {\n const fromKey = String(toAddress(from))\n const fromTransfers = this._transfers[fromKey] ?? {}\n this._transfers[fromKey] = fromTransfers\n for (const [to, balance] of Object.entries(toMap)) {\n const toKey = String(toAddress(to))\n fromTransfers[toKey] = (fromTransfers[toKey] ?? 0n) + balance\n }\n }\n return this.shouldContinue()\n }\n\n result() {\n const transfers: Record<string, Record<string, SignedBigInt>> = {}\n for (const [from, toMap] of Object.entries(this._transfers)) {\n const fromKey = String(toAddress(from))\n const positiveTransfers = Object.entries(toMap).filter(([, balance]) => balance > 0n)\n for (const [to, balance] of positiveTransfers) {\n const fromTransfers = transfers[fromKey] ?? {}\n transfers[fromKey] = fromTransfers\n const toKey = String(toAddress(to))\n fromTransfers[toKey] = toSignedBigInt(balance)\n }\n }\n const builder = new PayloadBuilder<ChainSummaryTransfers>({ schema: ChainSummaryTransfersSchema })\n return builder.fields({\n firstBlock: this._firstBlock ?? null,\n lastBlock: this._lastBlock ?? null,\n transfers,\n }).build()\n }\n\n shouldContinue() {\n return true\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["isDefined", "spanRootAsync", "toAddress", "spanRootAsync", "isDefined", "toAddress", "isDefined", "toAddress", "asSchema", "isPayloadOfSchemaType", "toAddress", "isDefined", "assertEx", "asSchema", "isPayloadOfSchemaType", "assertEx", "asSchema", "isPayloadOfSchemaType", "isDefined", "toAddress", "trace", "PayloadBuilder", "parseSignedBigInt", "toSignedBigInt", "toAddress", "isDefined", "parseSignedBigInt", "trace", "toSignedBigInt", "PayloadBuilder"]
|
|
7
7
|
}
|
|
@@ -24,6 +24,12 @@ export interface ChainHeadSelectorParams extends ChainFinalizerParams {
|
|
|
24
24
|
* asked, which is what keeps a node with no stake readers running exactly as it does today.
|
|
25
25
|
*/
|
|
26
26
|
eligibility?: ProducerEligibilityEvaluator;
|
|
27
|
+
/**
|
|
28
|
+
* Minimum epoch spacing (ms) between transaction-less heartbeat blocks this selector will
|
|
29
|
+
* qualify — a defense against producers heartbeating faster than the network's intended pace.
|
|
30
|
+
* Transaction-carrying candidates are exempt. Undefined disables the check.
|
|
31
|
+
*/
|
|
32
|
+
heartbeatInterval?: number;
|
|
27
33
|
mempoolViewer: MempoolViewer;
|
|
28
34
|
/**
|
|
29
35
|
* Minimum number of uncle candidates required before accepting one.
|
|
@@ -42,6 +48,7 @@ export declare class ChainHeadSelector extends ChainFinalizer<ChainHeadSelectorP
|
|
|
42
48
|
protected admission: AdmissionMode;
|
|
43
49
|
protected allowedProducers?: Address[];
|
|
44
50
|
protected backoffMs?: number;
|
|
51
|
+
protected heartbeatInterval?: number;
|
|
45
52
|
protected minCandidates?: number;
|
|
46
53
|
private _timeSinceLastUncle;
|
|
47
54
|
constructor(params: ChainHeadSelectorParams);
|
|
@@ -78,6 +85,15 @@ export declare class ChainHeadSelector extends ChainFinalizer<ChainHeadSelectorP
|
|
|
78
85
|
* chain from finalizing.
|
|
79
86
|
*/
|
|
80
87
|
protected assess(all: SignedHydratedBlockWithHashMeta[]): Promise<AdmissionAssessment[]>;
|
|
88
|
+
/**
|
|
89
|
+
* Defense against unwanted heartbeat rates: a transaction-less (heartbeat) candidate qualifies
|
|
90
|
+
* only when its signing epoch is at least heartbeatInterval after the current head's. Measured
|
|
91
|
+
* on chain data, so every finalizer applies the same pace deterministically regardless of wall
|
|
92
|
+
* clock. A producer heartbeating faster than the network's pace — misconfigured or hostile —
|
|
93
|
+
* cannot drive the chain's block rate: its candidates never qualify and age out of the pool,
|
|
94
|
+
* while transaction-carrying candidates are exempt and finalize immediately.
|
|
95
|
+
*/
|
|
96
|
+
protected filterPacedHeartbeatCandidates(proposedBlocks: SignedHydratedBlockWithHashMeta[]): SignedHydratedBlockWithHashMeta[];
|
|
81
97
|
/** Whether the configured allow-list admits a candidate. An empty list admits everyone. */
|
|
82
98
|
protected isAllowed(candidate: SignedHydratedBlockWithHashMeta): boolean;
|
|
83
99
|
/** Publishes what the two gates concluded, swallowing failures. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChainHeadSelector.d.ts","sourceRoot":"","sources":["../../../../src/modules/analyze/ChainHeadSelector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAI9C,OAAO,KAAK,EACV,WAAW,EAAE,aAAa,EAAE,+BAA+B,EAC5D,MAAM,sBAAsB,CAAA;AAK7B,OAAO,KAAK,EACV,mBAAmB,EAAE,aAAa,EAAE,qBAAqB,EAAE,4BAA4B,EACxF,MAAM,gBAAgB,CAAA;AAEvB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,MAAM,WAAW,uBAAwB,SAAQ,oBAAoB;IACnE;;OAEG;IACH,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAA;IAC5B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,WAAW,CAAA;IACpB;;;OAGG;IACH,WAAW,CAAC,EAAE,4BAA4B,CAAA;IAC1C,aAAa,EAAE,aAAa,CAAA;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,wEAAwE;IACxE,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1E;AAOD,qBAAa,iBAAkB,SAAQ,cAAc,CAAC,uBAAuB,CAAC;IAC5E;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,+BAA+B,QAAO;IAEtD,SAAS,CAAC,SAAS,EAAE,aAAa,CAAA;IAClC,SAAS,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAA;IACtC,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC5B,SAAS,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAChC,OAAO,CAAC,mBAAmB,CAAa;gBAE5B,MAAM,EAAE,uBAAuB;
|
|
1
|
+
{"version":3,"file":"ChainHeadSelector.d.ts","sourceRoot":"","sources":["../../../../src/modules/analyze/ChainHeadSelector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAI9C,OAAO,KAAK,EACV,WAAW,EAAE,aAAa,EAAE,+BAA+B,EAC5D,MAAM,sBAAsB,CAAA;AAK7B,OAAO,KAAK,EACV,mBAAmB,EAAE,aAAa,EAAE,qBAAqB,EAAE,4BAA4B,EACxF,MAAM,gBAAgB,CAAA;AAEvB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,MAAM,WAAW,uBAAwB,SAAQ,oBAAoB;IACnE;;OAEG;IACH,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAA;IAC5B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,WAAW,CAAA;IACpB;;;OAGG;IACH,WAAW,CAAC,EAAE,4BAA4B,CAAA;IAC1C;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,aAAa,EAAE,aAAa,CAAA;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,wEAAwE;IACxE,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1E;AAOD,qBAAa,iBAAkB,SAAQ,cAAc,CAAC,uBAAuB,CAAC;IAC5E;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,+BAA+B,QAAO;IAEtD,SAAS,CAAC,SAAS,EAAE,aAAa,CAAA;IAClC,SAAS,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAA;IACtC,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC5B,SAAS,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IACpC,SAAS,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAChC,OAAO,CAAC,mBAAmB,CAAa;gBAE5B,MAAM,EAAE,uBAAuB;IAS3C,SAAS,KAAK,OAAO;;;;;;;MAEpB;IAED,SAAS,KAAK,aAAa,kBAE1B;IAEK,YAAY,IAAI,OAAO,CAAC,+BAA+B,EAAE,CAAC;IAehE;;;;;;;;;;;;;OAaG;cACa,KAAK,CACnB,GAAG,EAAE,+BAA+B,EAAE,EACtC,OAAO,EAAE,+BAA+B,EAAE,GACzC,OAAO,CAAC,+BAA+B,EAAE,CAAC;IAW7C;;;;;;OAMG;cACa,MAAM,CAAC,GAAG,EAAE,+BAA+B,EAAE,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAmB9F;;;;;;;OAOG;IACH,SAAS,CAAC,8BAA8B,CAAC,cAAc,EAAE,+BAA+B,EAAE,GAAG,+BAA+B,EAAE;IAqB9H,2FAA2F;IAC3F,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,+BAA+B,GAAG,OAAO;IAOxE,mEAAmE;cACnD,aAAa,CAAC,WAAW,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAehF;;;;;;;;;OASG;IACH,OAAO,CAAC,2BAA2B;CAoBpC"}
|
package/dist/neutral/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts
CHANGED
|
@@ -15,6 +15,7 @@ export declare class BaseNetworkStakeStepRewardService extends AbstractCreatable
|
|
|
15
15
|
networkStakeStepRewardAddressHistory(_address: Address): Promisable<Record<Address, AttoXL1>>;
|
|
16
16
|
networkStakeStepRewardAddressReward(_context: StepIdentity, _address: Address): Promisable<Record<Address, AttoXL1>>;
|
|
17
17
|
networkStakeStepRewardAddressShare(_context: StepIdentity, _address: Address): Promisable<[bigint, bigint]>;
|
|
18
|
+
networkStakeStepRewardAllocationsForStep(_context: StepIdentity): Promisable<Record<number, AttoXL1>>;
|
|
18
19
|
networkStakeStepRewardClaimedByAddress(_address: Address): Promisable<AttoXL1>;
|
|
19
20
|
networkStakeStepRewardForPosition(_position: number, _range: [number, number]): Promisable<[AttoXL1, AttoXL1]>;
|
|
20
21
|
networkStakeStepRewardForStep(_context: StepIdentity): Promisable<AttoXL1>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseNetworkStakeStepRewardService.d.ts","sourceRoot":"","sources":["../../../../../src/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BaseNetworkStakeStepRewardService.d.ts","sourceRoot":"","sources":["../../../../../src/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,11 @@ interface ProcessPendingBlocksParams {
|
|
|
14
14
|
/** Computes producer standing, for the shadow and enforce postures. */
|
|
15
15
|
eligibility?: ProducerEligibilityEvaluator;
|
|
16
16
|
finalizationRunner: FinalizationRunner;
|
|
17
|
+
/**
|
|
18
|
+
* Minimum epoch spacing (ms) between transaction-less heartbeat blocks the head selector will
|
|
19
|
+
* qualify; transaction-carrying candidates are exempt. Undefined disables the pace check.
|
|
20
|
+
*/
|
|
21
|
+
heartbeatInterval?: number;
|
|
17
22
|
logger?: Logger;
|
|
18
23
|
mempoolViewer: MempoolViewer;
|
|
19
24
|
minCandidates?: number;
|
|
@@ -25,7 +30,7 @@ interface ProcessPendingBlocksParams {
|
|
|
25
30
|
/** Where to publish what both admission gates concluded, in shadow posture. */
|
|
26
31
|
publishAdmissionShadow?: (report: AdmissionShadowReport) => Promise<void>;
|
|
27
32
|
}
|
|
28
|
-
export declare function processPendingBlocks({ blockValidationViewer, blockViewer, context, logger, mempoolViewer, finalizationRunner, allowedProducers, backoffMs, minCandidates, deadLetterQueueRunner, observer, admission, eligibility, publishAdmissionShadow, }: ProcessPendingBlocksParams): Promise<[{
|
|
33
|
+
export declare function processPendingBlocks({ blockValidationViewer, blockViewer, context, logger, mempoolViewer, finalizationRunner, allowedProducers, backoffMs, heartbeatInterval, minCandidates, deadLetterQueueRunner, observer, admission, eligibility, publishAdmissionShadow, }: ProcessPendingBlocksParams): Promise<[{
|
|
29
34
|
schema: "network.xyo.boundwitness" & {
|
|
30
35
|
readonly __schema: true;
|
|
31
36
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processPendingBlocks.d.ts","sourceRoot":"","sources":["../../../../../src/modules/services/implementation/processPendingBlocks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAEtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EACV,WAAW,EAAE,qBAAqB,EAAE,WAAW,EAAE,qBAAqB,EAAE,kBAAkB,EAA6B,aAAa,EACrI,MAAM,sBAAsB,CAAA;AAK7B,OAAO,KAAK,EACV,aAAa,EAAE,qBAAqB,EAAE,4BAA4B,EACnE,MAAM,UAAU,CAAA;AAKjB,UAAU,0BAA0B;IAClC,uFAAuF;IACvF,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAA;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qBAAqB,EAAE,qBAAqB,CAAA;IAC5C,WAAW,EAAE,WAAW,CAAA;IACxB,OAAO,EAAE,WAAW,CAAA;IACpB,qBAAqB,CAAC,EAAE,qBAAqB,CAAA;IAC7C,uEAAuE;IACvE,WAAW,CAAC,EAAE,4BAA4B,CAAA;IAC1C,kBAAkB,EAAE,kBAAkB,CAAA;IACtC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,+EAA+E;IAC/E,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1E;AAgCD,wBAAsB,oBAAoB,CAAC,EACzC,qBAAqB,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE,qBAAqB,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"processPendingBlocks.d.ts","sourceRoot":"","sources":["../../../../../src/modules/services/implementation/processPendingBlocks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAEtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EACV,WAAW,EAAE,qBAAqB,EAAE,WAAW,EAAE,qBAAqB,EAAE,kBAAkB,EAA6B,aAAa,EACrI,MAAM,sBAAsB,CAAA;AAK7B,OAAO,KAAK,EACV,aAAa,EAAE,qBAAqB,EAAE,4BAA4B,EACnE,MAAM,UAAU,CAAA;AAKjB,UAAU,0BAA0B;IAClC,uFAAuF;IACvF,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAA;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qBAAqB,EAAE,qBAAqB,CAAA;IAC5C,WAAW,EAAE,WAAW,CAAA;IACxB,OAAO,EAAE,WAAW,CAAA;IACpB,qBAAqB,CAAC,EAAE,qBAAqB,CAAA;IAC7C,uEAAuE;IACvE,WAAW,CAAC,EAAE,4BAA4B,CAAA;IAC1C,kBAAkB,EAAE,kBAAkB,CAAA;IACtC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,+EAA+E;IAC/E,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1E;AAgCD,wBAAsB,oBAAoB,CAAC,EACzC,qBAAqB,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,SAAS,EAAE,iBAAiB,EAAE,aAAa,EAAE,qBAAqB,EAAE,QAAQ,EACtL,SAAS,EAAE,WAAW,EAAE,sBAAsB,GAC/C,EAAE,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBA4E5B"}
|
|
@@ -13,6 +13,13 @@ interface ExcludedTransactionEntry {
|
|
|
13
13
|
* The default block size for a block
|
|
14
14
|
*/
|
|
15
15
|
export declare const DEFAULT_BLOCK_SIZE = 10;
|
|
16
|
+
/**
|
|
17
|
+
* Default minimum age (ms) of the head before a producer emits a transaction-less heartbeat
|
|
18
|
+
* block. Five minutes keeps a quiet chain visibly alive without accumulating meaningful storage
|
|
19
|
+
* or block-reward drift. Finalizers use the same default as the floor for how fast they will
|
|
20
|
+
* finalize heartbeat blocks.
|
|
21
|
+
*/
|
|
22
|
+
export declare const DEFAULT_HEARTBEAT_INTERVAL = 300000;
|
|
16
23
|
/**
|
|
17
24
|
* The amount of time for which a producer will restake their intent
|
|
18
25
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SimpleBlockRunner.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/services/simple/block/runner/SimpleBlockRunner.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SimpleBlockRunner.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/services/simple/block/runner/SimpleBlockRunner.ts"],"names":[],"mappings":"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"}
|