@typeberry/lib 0.8.4-2e4ce67 → 0.8.4-70b1490
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/package.json +5 -3
- package/packages/configs/index.d.ts +30 -1
- package/packages/configs/index.d.ts.map +1 -1
- package/packages/configs/index.js +4 -2
- package/packages/configs/typeberry-dev-full.json +29 -0
- package/packages/core/bytes/bytes.d.ts +1 -0
- package/packages/core/bytes/bytes.d.ts.map +1 -1
- package/packages/core/bytes/bytes.js +8 -0
- package/packages/core/utils/debug.d.ts +4 -2
- package/packages/core/utils/debug.d.ts.map +1 -1
- package/packages/core/utils/debug.js +18 -13
- package/packages/core/utils/debug.test.js +12 -6
- package/packages/jam/config-node/node-config.d.ts +2 -1
- package/packages/jam/config-node/node-config.d.ts.map +1 -1
- package/packages/jam/config-node/node-config.js +8 -3
- package/packages/jam/config-node/node-config.test.js +3 -3
- package/packages/jam/database-fjall/hybrid-states.d.ts +45 -0
- package/packages/jam/database-fjall/hybrid-states.d.ts.map +1 -0
- package/packages/jam/database-fjall/hybrid-states.js +113 -0
- package/packages/jam/database-fjall/hybrid-states.test.d.ts +2 -0
- package/packages/jam/database-fjall/hybrid-states.test.d.ts.map +1 -0
- package/packages/jam/database-fjall/hybrid-states.test.js +83 -0
- package/packages/jam/database-fjall/index.d.ts +3 -0
- package/packages/jam/database-fjall/index.d.ts.map +1 -0
- package/packages/jam/database-fjall/index.js +2 -0
- package/packages/jam/database-fjall/root.d.ts +52 -0
- package/packages/jam/database-fjall/root.d.ts.map +1 -0
- package/packages/jam/database-fjall/root.js +85 -0
- package/packages/jam/jamnp-s/tasks/ticket-distribution.d.ts +18 -10
- package/packages/jam/jamnp-s/tasks/ticket-distribution.d.ts.map +1 -1
- package/packages/jam/jamnp-s/tasks/ticket-distribution.js +44 -68
- package/packages/jam/jamnp-s/tasks/ticket-distribution.test.js +30 -8
- package/packages/jam/node/main-fuzz.d.ts.map +1 -1
- package/packages/jam/node/main-fuzz.js +16 -1
- package/packages/jam/node/main-importer.d.ts +6 -3
- package/packages/jam/node/main-importer.d.ts.map +1 -1
- package/packages/jam/node/main-importer.js +3 -2
- package/packages/jam/safrole/bandersnatch-vrf.d.ts +22 -2
- package/packages/jam/safrole/bandersnatch-vrf.d.ts.map +1 -1
- package/packages/jam/safrole/bandersnatch-vrf.js +54 -20
- package/packages/jam/safrole/bandersnatch-vrf.test.js +3 -2
- package/packages/jam/safrole/bandersnatch-wasm.d.ts +10 -0
- package/packages/jam/safrole/bandersnatch-wasm.d.ts.map +1 -1
- package/packages/jam/safrole/bandersnatch-wasm.js +12 -0
- package/packages/jam/ticket-pool/index.d.ts +4 -0
- package/packages/jam/ticket-pool/index.d.ts.map +1 -0
- package/packages/jam/ticket-pool/index.js +3 -0
- package/packages/jam/ticket-pool/pending-ticket-pool.d.ts +30 -0
- package/packages/jam/ticket-pool/pending-ticket-pool.d.ts.map +1 -0
- package/packages/jam/ticket-pool/pending-ticket-pool.js +56 -0
- package/packages/jam/ticket-pool/pending-ticket-pool.test.d.ts +2 -0
- package/packages/jam/ticket-pool/pending-ticket-pool.test.d.ts.map +1 -0
- package/packages/jam/ticket-pool/pending-ticket-pool.test.js +67 -0
- package/packages/jam/ticket-pool/ticket-validator.d.ts +47 -0
- package/packages/jam/ticket-pool/ticket-validator.d.ts.map +1 -0
- package/packages/jam/ticket-pool/ticket-validator.js +34 -0
- package/packages/jam/ticket-pool/ticket-validator.test.d.ts +2 -0
- package/packages/jam/ticket-pool/ticket-validator.test.d.ts.map +1 -0
- package/packages/jam/ticket-pool/ticket-validator.test.js +35 -0
- package/packages/jam/ticket-pool/verified-ticket-pool.d.ts +26 -0
- package/packages/jam/ticket-pool/verified-ticket-pool.d.ts.map +1 -0
- package/packages/jam/ticket-pool/verified-ticket-pool.js +41 -0
- package/packages/jam/ticket-pool/verified-ticket-pool.test.d.ts +2 -0
- package/packages/jam/ticket-pool/verified-ticket-pool.test.d.ts.map +1 -0
- package/packages/jam/ticket-pool/verified-ticket-pool.test.js +54 -0
- package/packages/workers/api-node/config.d.ts +12 -5
- package/packages/workers/api-node/config.d.ts.map +1 -1
- package/packages/workers/api-node/config.js +20 -17
- package/packages/workers/api-node/config.test.js +38 -1
- package/packages/workers/block-authorship/{generator.d.ts → block-generator.d.ts} +5 -5
- package/packages/workers/block-authorship/block-generator.d.ts.map +1 -0
- package/packages/workers/block-authorship/{generator.js → block-generator.js} +3 -3
- package/packages/workers/block-authorship/block-generator.test.d.ts +2 -0
- package/packages/workers/block-authorship/block-generator.test.d.ts.map +1 -0
- package/packages/workers/block-authorship/{generator.test.js → block-generator.test.js} +8 -8
- package/packages/workers/block-authorship/epoch-authoring-slots.d.ts +35 -0
- package/packages/workers/block-authorship/epoch-authoring-slots.d.ts.map +1 -0
- package/packages/workers/block-authorship/epoch-authoring-slots.js +86 -0
- package/packages/workers/block-authorship/epoch-tracker.d.ts +29 -0
- package/packages/workers/block-authorship/epoch-tracker.d.ts.map +1 -0
- package/packages/workers/block-authorship/epoch-tracker.js +80 -0
- package/packages/workers/block-authorship/index.d.ts.map +1 -1
- package/packages/workers/block-authorship/index.js +1 -1
- package/packages/workers/block-authorship/main.d.ts +3 -0
- package/packages/workers/block-authorship/main.d.ts.map +1 -1
- package/packages/workers/block-authorship/main.js +197 -317
- package/packages/workers/block-authorship/ticket-generator/bootstrap-main.d.ts +2 -0
- package/packages/workers/block-authorship/ticket-generator/bootstrap-main.d.ts.map +1 -0
- package/packages/workers/block-authorship/ticket-generator/bootstrap-main.js +23 -0
- package/packages/workers/block-authorship/ticket-generator/index.d.ts +16 -0
- package/packages/workers/block-authorship/ticket-generator/index.d.ts.map +1 -0
- package/packages/workers/block-authorship/ticket-generator/index.js +62 -0
- package/packages/workers/block-authorship/ticket-generator/protocol.d.ts +50 -0
- package/packages/workers/block-authorship/ticket-generator/protocol.d.ts.map +1 -0
- package/packages/workers/block-authorship/ticket-generator/protocol.js +54 -0
- package/packages/workers/block-authorship/{ticket-generator.d.ts → ticket-generator/ticket-generator.d.ts} +4 -0
- package/packages/workers/block-authorship/ticket-generator/ticket-generator.d.ts.map +1 -0
- package/packages/workers/block-authorship/{ticket-generator.js → ticket-generator/ticket-generator.js} +19 -9
- package/packages/workers/block-authorship/ticket-generator/ticket-generator.test.d.ts.map +1 -0
- package/packages/workers/block-authorship/{ticket-generator.test.js → ticket-generator/ticket-generator.test.js} +13 -9
- package/packages/workers/block-authorship/ticket-generator/worker-pool.d.ts +36 -0
- package/packages/workers/block-authorship/ticket-generator/worker-pool.d.ts.map +1 -0
- package/packages/workers/block-authorship/ticket-generator/worker-pool.js +111 -0
- package/packages/workers/block-authorship/ticket-validator.d.ts +31 -0
- package/packages/workers/block-authorship/ticket-validator.d.ts.map +1 -0
- package/packages/workers/block-authorship/ticket-validator.js +59 -0
- package/packages/workers/comms-authorship-network/protocol.d.ts +14 -4
- package/packages/workers/comms-authorship-network/protocol.d.ts.map +1 -1
- package/packages/workers/comms-authorship-network/protocol.js +12 -6
- package/packages/workers/comms-authorship-network/tickets-message.d.ts +0 -14
- package/packages/workers/comms-authorship-network/tickets-message.d.ts.map +1 -1
- package/packages/workers/comms-authorship-network/tickets-message.js +0 -17
- package/packages/workers/importer/importer.d.ts +2 -2
- package/packages/workers/importer/importer.d.ts.map +1 -1
- package/packages/workers/importer/importer.js +5 -5
- package/packages/workers/importer/stats.d.ts +1 -3
- package/packages/workers/importer/stats.d.ts.map +1 -1
- package/packages/workers/importer/stats.js +12 -12
- package/packages/workers/jam-network/main.d.ts.map +1 -1
- package/packages/workers/jam-network/main.js +25 -4
- package/packages/workers/block-authorship/generator.d.ts.map +0 -1
- package/packages/workers/block-authorship/generator.test.d.ts +0 -2
- package/packages/workers/block-authorship/generator.test.d.ts.map +0 -1
- package/packages/workers/block-authorship/ticket-generator.d.ts.map +0 -1
- package/packages/workers/block-authorship/ticket-generator.test.d.ts.map +0 -1
- /package/packages/configs/{typeberry-dev.json → typeberry-dev-tiny.json} +0 -0
- /package/packages/workers/block-authorship/{ticket-generator.test.d.ts → ticket-generator/ticket-generator.test.d.ts} +0 -0
|
@@ -17,20 +17,3 @@ export class TicketsMessage extends WithDebug {
|
|
|
17
17
|
this.tickets = tickets;
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
-
/** Single-ticket message sent from jam-network to block-authorship (one ticket per peer relay). */
|
|
21
|
-
export class ReceivedTicketMessage extends WithDebug {
|
|
22
|
-
epochIndex;
|
|
23
|
-
ticket;
|
|
24
|
-
static Codec = codec.Class(ReceivedTicketMessage, {
|
|
25
|
-
epochIndex: codec.u32.asOpaque(),
|
|
26
|
-
ticket: SignedTicket.Codec,
|
|
27
|
-
});
|
|
28
|
-
static create({ epochIndex, ticket }) {
|
|
29
|
-
return new ReceivedTicketMessage(epochIndex, ticket);
|
|
30
|
-
}
|
|
31
|
-
constructor(epochIndex, ticket) {
|
|
32
|
-
super();
|
|
33
|
-
this.epochIndex = epochIndex;
|
|
34
|
-
this.ticket = ticket;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
@@ -21,7 +21,7 @@ export type ImporterOptions = {
|
|
|
21
21
|
finalizer?: Finalizer;
|
|
22
22
|
pruneBlocks?: boolean;
|
|
23
23
|
};
|
|
24
|
-
/** Construction arguments for
|
|
24
|
+
/** Construction arguments for `Importer`. */
|
|
25
25
|
export type ImporterArgs = {
|
|
26
26
|
spec: ChainSpec;
|
|
27
27
|
pvm: PvmBackend;
|
|
@@ -45,7 +45,7 @@ export declare class Importer {
|
|
|
45
45
|
private readonly options;
|
|
46
46
|
private readonly events;
|
|
47
47
|
/**
|
|
48
|
-
* Build an
|
|
48
|
+
* Build an `Importer` connected to the best state loaded from `states`.
|
|
49
49
|
*
|
|
50
50
|
* Throws if the best state cannot be loaded — callers are expected to treat that
|
|
51
51
|
* as a programmer error (the DB should be initialized before reaching here).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"importer.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/importer/importer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAiB,MAAM,kBAAkB,CAAC;AACvH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACxF,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAiB,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC5F,OAAO,EAA0B,KAAK,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAC3F,OAAO,EAA6B,MAAM,EAAkB,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACvG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAE,KAAK,sBAAsB,EAAiB,MAAM,YAAY,CAAC;AAExE,oBAAY,iBAAiB;IAC3B,QAAQ,IAAI;IACZ,GAAG,IAAI;IACP,MAAM,IAAI;CACX;AAED,MAAM,MAAM,aAAa,GACrB,WAAW,CAAC,iBAAiB,CAAC,QAAQ,EAAE,kBAAkB,CAAC,GAC3D,WAAW,CAAC,iBAAiB,CAAC,GAAG,EAAE,QAAQ,CAAC,GAC5C,WAAW,CAAC,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;AAO5D,MAAM,MAAM,eAAe,GAAG;IAC5B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,
|
|
1
|
+
{"version":3,"file":"importer.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/importer/importer.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,7 +33,7 @@ export class Importer {
|
|
|
33
33
|
options;
|
|
34
34
|
events;
|
|
35
35
|
/**
|
|
36
|
-
* Build an
|
|
36
|
+
* Build an `Importer` connected to the best state loaded from `states`.
|
|
37
37
|
*
|
|
38
38
|
* Throws if the best state cannot be loaded — callers are expected to treat that
|
|
39
39
|
* as a programmer error (the DB should be initialized before reaching here).
|
|
@@ -52,7 +52,7 @@ export class Importer {
|
|
|
52
52
|
this.blocks = args.blocks;
|
|
53
53
|
this.states = args.states;
|
|
54
54
|
this.options = args.options ?? {};
|
|
55
|
-
this.events = args.events ?? ImporterStats.new(
|
|
55
|
+
this.events = args.events ?? ImporterStats.new(() => this.states.diskSizeInBytes?.() ?? null);
|
|
56
56
|
this.metrics = metrics.createMetrics();
|
|
57
57
|
this.verifier = BlockVerifier.new(args.hasher, args.blocks);
|
|
58
58
|
this.stf = OnChain.assemble({
|
|
@@ -98,12 +98,12 @@ export class Importer {
|
|
|
98
98
|
// eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
|
|
99
99
|
if (maybeBestHeader?.isOk) {
|
|
100
100
|
const bestHeader = maybeBestHeader.ok;
|
|
101
|
-
this.logger.info `🧊 Best
|
|
101
|
+
this.logger.info `🧊 Best: #${timeSlot} (${bestHeader.hash.toStringTruncated()})`;
|
|
102
102
|
this.metrics.recordBlockImportComplete(duration, true);
|
|
103
103
|
}
|
|
104
104
|
else {
|
|
105
105
|
this.logger
|
|
106
|
-
.log `❌ Rejected
|
|
106
|
+
.log `❌ Rejected #${timeSlot}: ${maybeBestHeader !== null ? resultToString(maybeBestHeader) : "exception"}`;
|
|
107
107
|
this.metrics.recordBlockImportComplete(duration, false);
|
|
108
108
|
}
|
|
109
109
|
}
|
|
@@ -176,7 +176,7 @@ export class Importer {
|
|
|
176
176
|
if (finality !== null) {
|
|
177
177
|
const pruneBlocks = this.options.pruneBlocks ?? false;
|
|
178
178
|
this.logger
|
|
179
|
-
.info `🦭 Finalized
|
|
179
|
+
.info `🦭 Finalized: ${finality.finalizedHash.toStringTruncated()} (${finality.prunableStateHashes.length} to prune, blocks: ${pruneBlocks})`;
|
|
180
180
|
for (const hash of finality.prunableStateHashes) {
|
|
181
181
|
this.states.markUnused(hash);
|
|
182
182
|
if (pruneBlocks) {
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { HeaderHash, TimeSlot } from "#@typeberry/block";
|
|
2
2
|
import type { LeafDb } from "#@typeberry/database";
|
|
3
|
-
import type { Logger } from "#@typeberry/logger";
|
|
4
3
|
import type { SerializedState } from "#@typeberry/state-merkleization";
|
|
5
4
|
/** Reports the current on-disk database size in bytes, or `null` when unknown. */
|
|
6
5
|
export type DbSizeProvider = () => number | null;
|
|
@@ -17,7 +16,6 @@ export interface ImporterEventsListener {
|
|
|
17
16
|
onStart(currentBestHeaderHash: HeaderHash, currentBestState: SerializedState<LeafDb>): void;
|
|
18
17
|
}
|
|
19
18
|
export declare class ImporterStats implements ImporterEventsListener {
|
|
20
|
-
private readonly logger;
|
|
21
19
|
/** Reports the current on-disk database size in bytes, or `null` if unknown. */
|
|
22
20
|
private readonly dbSizeInBytes;
|
|
23
21
|
/** How often we are going to print the stats (i.e. every `maxBlocks` blocks) */
|
|
@@ -30,7 +28,7 @@ export declare class ImporterStats implements ImporterEventsListener {
|
|
|
30
28
|
private totalTime;
|
|
31
29
|
private totalBlocksPrev;
|
|
32
30
|
private totalBlocks;
|
|
33
|
-
static new(
|
|
31
|
+
static new(dbSizeInBytes?: DbSizeProvider): ImporterStats;
|
|
34
32
|
private constructor();
|
|
35
33
|
onStart(currentBestHeaderHash: HeaderHash, currentBestState: SerializedState<LeafDb>): void;
|
|
36
34
|
onBlockImportingStarted(timeSlot: TimeSlot): (isOk: boolean) => number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/importer/stats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/importer/stats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAKtE,kFAAkF;AAClF,MAAM,MAAM,cAAc,GAAG,MAAM,MAAM,GAAG,IAAI,CAAC;AAWjD,6CAA6C;AAC7C,MAAM,WAAW,sBAAsB;IACrC;;;;;OAKG;IACH,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC;IAEvE,qCAAqC;IACrC,OAAO,CAAC,qBAAqB,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;CAC7F;AAED,qBAAa,aAAc,YAAW,sBAAsB;IAaxD,gFAAgF;IAChF,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,gFAAgF;IAChF,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,uFAAuF;IACvF,OAAO,CAAC,QAAQ,CAAC,SAAS;IAjB5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiD;IACxE,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,WAAW,CAAK;IAExB,MAAM,CAAC,GAAG,CAAC,aAAa,GAAE,cAA2B;IAIrD,OAAO;IASP,OAAO,CAAC,qBAAqB,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,CAAC,MAAM,CAAC;IAIpF,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,IAGhC,MAAM,OAAO;CAiCxB"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { Level, Logger } from "#@typeberry/logger";
|
|
1
2
|
import { memoryTracker, now } from "#@typeberry/utils";
|
|
3
|
+
const logger = Logger.new(import.meta.filename, "stats");
|
|
2
4
|
/** Format a database size for the stats line, e.g. ` db=12.34GB`. Empty when unknown. */
|
|
3
5
|
function formatDbSize(bytes) {
|
|
4
6
|
if (bytes === null) {
|
|
@@ -8,50 +10,48 @@ function formatDbSize(bytes) {
|
|
|
8
10
|
return mb >= 1024 ? ` db=${(mb / 1024).toFixed(2)}GB` : ` db=${mb.toFixed(1)}MB`;
|
|
9
11
|
}
|
|
10
12
|
export class ImporterStats {
|
|
11
|
-
logger;
|
|
12
13
|
dbSizeInBytes;
|
|
13
14
|
maxBlocks;
|
|
14
15
|
maxTimeMs;
|
|
15
|
-
memory = memoryTracker();
|
|
16
|
+
memory = memoryTracker(logger.getLevel() < Level.INFO);
|
|
16
17
|
showDiskStats = true;
|
|
17
18
|
totalTimePrev = 0;
|
|
18
19
|
totalTime = 0;
|
|
19
20
|
totalBlocksPrev = 0;
|
|
20
21
|
totalBlocks = 0;
|
|
21
|
-
static new(
|
|
22
|
-
return new ImporterStats(
|
|
22
|
+
static new(dbSizeInBytes = () => null) {
|
|
23
|
+
return new ImporterStats(dbSizeInBytes);
|
|
23
24
|
}
|
|
24
|
-
constructor(
|
|
25
|
+
constructor(
|
|
25
26
|
/** Reports the current on-disk database size in bytes, or `null` if unknown. */
|
|
26
27
|
dbSizeInBytes = () => null,
|
|
27
28
|
/** How often we are going to print the stats (i.e. every `maxBlocks` blocks) */
|
|
28
29
|
maxBlocks = 100,
|
|
29
30
|
/** Alternatively print stats when we reach `${maxTimeMs}` of total block execution. */
|
|
30
31
|
maxTimeMs = 5000) {
|
|
31
|
-
this.logger = logger;
|
|
32
32
|
this.dbSizeInBytes = dbSizeInBytes;
|
|
33
33
|
this.maxBlocks = maxBlocks;
|
|
34
34
|
this.maxTimeMs = maxTimeMs;
|
|
35
35
|
}
|
|
36
36
|
onStart(currentBestHeaderHash, currentBestState) {
|
|
37
|
-
|
|
37
|
+
logger.info `😎 Best time slot: ${currentBestState.timeslot} (header hash: ${currentBestHeaderHash})`;
|
|
38
38
|
}
|
|
39
39
|
onBlockImportingStarted(timeSlot) {
|
|
40
40
|
const start = now();
|
|
41
41
|
return (isOk) => {
|
|
42
42
|
const duration = now() - start;
|
|
43
43
|
const label = isOk ? "import" : "reject";
|
|
44
|
-
|
|
44
|
+
logger.log `⏱️ ${label} #${timeSlot} took ${duration.toFixed(2)}ms`;
|
|
45
45
|
this.totalTime += duration;
|
|
46
46
|
this.totalBlocks += 1;
|
|
47
47
|
if (this.totalBlocks >= this.maxBlocks || this.totalTime >= this.maxTimeMs) {
|
|
48
48
|
// disk data (every second output)
|
|
49
49
|
if (this.showDiskStats) {
|
|
50
|
-
|
|
50
|
+
logger.info `💾 disk at #${timeSlot}: ${formatDbSize(this.dbSizeInBytes())}`;
|
|
51
51
|
}
|
|
52
52
|
this.showDiskStats = !this.showDiskStats;
|
|
53
|
-
// memory
|
|
54
|
-
|
|
53
|
+
// memory (memoryTracker's toString() is stateful — log it once)
|
|
54
|
+
logger.info `📊 mem at #${timeSlot}: ${this.memory}`;
|
|
55
55
|
// compute block statistics (rolling window of last two rounds)
|
|
56
56
|
const importedBlocks = this.totalBlocks + this.totalBlocksPrev;
|
|
57
57
|
const importTime = this.totalTime + this.totalTimePrev;
|
|
@@ -61,7 +61,7 @@ export class ImporterStats {
|
|
|
61
61
|
this.totalTimePrev = this.totalTime;
|
|
62
62
|
this.totalBlocks = 0;
|
|
63
63
|
this.totalTime = 0;
|
|
64
|
-
|
|
64
|
+
logger.info ` ⏱️ speed at #${timeSlot}: ${blocksPerSecond.toFixed(2)}bps`;
|
|
65
65
|
}
|
|
66
66
|
return duration;
|
|
67
67
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/jam-network/main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/jam-network/main.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAQ3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAI1E;;;;;;GAMG;AACH,wBAAsB,IAAI,CACxB,MAAM,EAAE,YAAY,CAAC,gBAAgB,CAAC,EACtC,KAAK,EAAE,kBAAkB,EACzB,eAAe,EAAE,eAAe,iBAgFjC"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
+
import { Bytes } from "#@typeberry/bytes";
|
|
1
2
|
import { parseBootnode } from "#@typeberry/config-node";
|
|
2
3
|
import { ed25519, initWasm } from "#@typeberry/crypto";
|
|
4
|
+
import { HASH_SIZE } from "#@typeberry/hash";
|
|
3
5
|
import { setup } from "#@typeberry/jamnp-s";
|
|
4
6
|
import { Logger } from "#@typeberry/logger";
|
|
7
|
+
import { ValidationError } from "#@typeberry/ticket-pool";
|
|
8
|
+
import { Result } from "#@typeberry/utils";
|
|
5
9
|
const logger = Logger.new(import.meta.filename, "net");
|
|
6
10
|
/**
|
|
7
11
|
* JAM networking worker.
|
|
@@ -38,11 +42,28 @@ export async function main(config, comms, authorshipComms) {
|
|
|
38
42
|
network.ticketTask.addTicket(epochIndex, ticket);
|
|
39
43
|
}
|
|
40
44
|
});
|
|
41
|
-
//
|
|
42
|
-
//
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
// Authorship pushes the authoritative ticket pool on epoch boundaries; networking
|
|
46
|
+
// replaces its redistribution pool wholesale so the two sides cannot drift.
|
|
47
|
+
authorshipComms.setOnReplaceTicketPool(async ({ epochIndex, tickets }) => {
|
|
48
|
+
logger.log `Replacing redistribution pool from block-authorship for epoch ${epochIndex} (${tickets.length} tickets)`;
|
|
49
|
+
network.ticketTask.replacePool(epochIndex, tickets);
|
|
45
50
|
});
|
|
51
|
+
// Validator that hands a received ticket to block-authorship over IPC and waits
|
|
52
|
+
// for an accept/reject decision. The wire protocol stays a simple bool; the
|
|
53
|
+
// computed id stays inside authorship (it owns the verified pool).
|
|
54
|
+
const ipcValidator = {
|
|
55
|
+
validate: async (epochIndex, tickets) => {
|
|
56
|
+
const ok = await authorshipComms.sendReceivedTickets({ epochIndex, tickets });
|
|
57
|
+
if (!ok) {
|
|
58
|
+
return Result.error(ValidationError.InvalidProof, () => "authorship rejected the ticket");
|
|
59
|
+
}
|
|
60
|
+
return Result.ok(tickets.map((ticket) => ({
|
|
61
|
+
ticket,
|
|
62
|
+
id: Bytes.zero(HASH_SIZE).asOpaque(),
|
|
63
|
+
})));
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
network.ticketTask.setTicketValidator(ipcValidator);
|
|
46
67
|
await network.network.start();
|
|
47
68
|
// stop the network when the worker is finishing.
|
|
48
69
|
await waitForFinish;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/block-authorship/generator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,KAAK,WAAW,EAIhB,KAAK,QAAQ,EACb,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,2BAA2B,CAAC;AAEtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAS,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAoC,KAAK,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAClG,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAIvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAGhF,OAAO,EAAqB,KAAK,MAAM,EAAU,MAAM,kBAAkB,CAAC;AAM1E;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAEvD,oDAAoD;AACpD,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,EAAE,gBAAgB,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,QAAQ,CAAC;CAClB,CAAC;AAEF,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IAEnE,SAAgB,SAAS,EAAE,SAAS,CAAC;IACrC,SAAgB,YAAY,EAAE,gBAAgB,CAAC;IAC/C,SAAgB,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC;IAClD,SAAgB,OAAO,EAAE,OAAO,CAAC;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAElC,wDAAwD;IACxD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa;IAI9B,OAAO;IAUP,OAAO,CAAC,qBAAqB;IAYvB,aAAa,CACjB,cAAc,EAAE,cAAc,EAC9B,kBAAkB,EAAE,sBAAsB,EAC1C,WAAW,EAAE,cAAc,EAC3B,QAAQ,EAAE,QAAQ,EAClB,cAAc,GAAE;QAAE,MAAM,EAAE,YAAY,CAAC;QAAC,EAAE,EAAE,WAAW,CAAA;KAAE,EAAO,GAC/D,OAAO,CAAC,SAAS,CAAC;IAKrB;;;;;;;;;OASG;YACW,cAAc;IAiB5B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,uBAAuB;IA4BzB,SAAS,CACb,cAAc,EAAE,cAAc,EAC9B,kBAAkB,EAAE,sBAAsB,EAC1C,WAAW,EAAE,cAAc,EAC3B,QAAQ,EAAE,QAAQ,EAClB,cAAc,GAAE;QAAE,MAAM,EAAE,YAAY,CAAC;QAAC,EAAE,EAAE,WAAW,CAAA;KAAE,EAAO;CAqGnE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generator.test.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/block-authorship/generator.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ticket-generator.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/block-authorship/ticket-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAGjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAI1C,oBAAY,oBAAoB;IAC9B,sBAAsB,2BAA2B;IACjD,kBAAkB,uBAAuB;CAC1C;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,MAAM,EAAE,eAAe,CAAC;CACzB,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,gBAAgB,EAC9B,QAAQ,EAAE,eAAe,EAAE,EAC3B,aAAa,EAAE,YAAY,EAAE,EAC7B,OAAO,EAAE,WAAW,EACpB,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAkCvD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ticket-generator.test.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/block-authorship/ticket-generator.test.ts"],"names":[],"mappings":""}
|
|
File without changes
|