@typeberry/lib 0.8.4 → 0.9.0-3f2c45b
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 +6 -4
- 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 +82 -0
- package/packages/jam/database-fjall/hybrid-states.d.ts.map +1 -0
- package/packages/jam/database-fjall/hybrid-states.js +169 -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 +113 -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 +58 -0
- package/packages/jam/database-fjall/root.d.ts.map +1 -0
- package/packages/jam/database-fjall/root.js +89 -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 +69 -11
- package/packages/jam/node/main-importer.d.ts +13 -3
- package/packages/jam/node/main-importer.d.ts.map +1 -1
- package/packages/jam/node/main-importer.js +5 -3
- package/packages/jam/safrole/bandersnatch-vrf.d.ts +24 -4
- package/packages/jam/safrole/bandersnatch-vrf.d.ts.map +1 -1
- package/packages/jam/safrole/bandersnatch-vrf.js +63 -26
- package/packages/jam/safrole/bandersnatch-vrf.test.js +12 -9
- 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/safrole/safrole.js +5 -5
- package/packages/jam/safrole/safrole.test.js +13 -13
- 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 +21 -6
- package/packages/workers/api-node/config.d.ts.map +1 -1
- package/packages/workers/api-node/config.js +26 -19
- 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 -315
- 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
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { BytesBlob } from "#@typeberry/bytes";
|
|
2
|
+
import { HashDictionary } from "#@typeberry/collections";
|
|
3
|
+
import { deriveBandersnatchPublicKey, deriveEd25519PublicKey } from "#@typeberry/crypto/key-derivation.js";
|
|
4
|
+
import bandersnatchVrf from "#@typeberry/safrole/bandersnatch-vrf.js";
|
|
5
|
+
import { JAM_FALLBACK_SEAL, JAM_TICKET_SEAL } from "#@typeberry/safrole/constants.js";
|
|
6
|
+
import { SafroleSealingKeysKind } from "#@typeberry/state";
|
|
7
|
+
import { asOpaqueType } from "#@typeberry/utils";
|
|
8
|
+
/** A helper class to figure out in which slots in the next epoch we are authoring blocks. */
|
|
9
|
+
export class EpochAuthoringSlots {
|
|
10
|
+
ticketsPerValidator;
|
|
11
|
+
bandersnatch;
|
|
12
|
+
keys;
|
|
13
|
+
static async new(chainSpec, bandersnatch, ownedSecrets) {
|
|
14
|
+
const keys = await derivePublicKeys(ownedSecrets);
|
|
15
|
+
const keysDictionary = new HashDictionary();
|
|
16
|
+
for (const key of keys) {
|
|
17
|
+
keysDictionary.set(key.bandersnatchPublic, key);
|
|
18
|
+
}
|
|
19
|
+
return new EpochAuthoringSlots(chainSpec.ticketsPerValidator, bandersnatch, keysDictionary);
|
|
20
|
+
}
|
|
21
|
+
constructor(ticketsPerValidator, bandersnatch, keys) {
|
|
22
|
+
this.ticketsPerValidator = ticketsPerValidator;
|
|
23
|
+
this.bandersnatch = bandersnatch;
|
|
24
|
+
this.keys = keys;
|
|
25
|
+
}
|
|
26
|
+
getValidatorKeys() {
|
|
27
|
+
return Array.from(this.keys.values());
|
|
28
|
+
}
|
|
29
|
+
getBandersnatchPublicKeys() {
|
|
30
|
+
return Array.from(this.keys.keys());
|
|
31
|
+
}
|
|
32
|
+
async getOurSlotsInKeySeries(sealingKeySeries, entropy) {
|
|
33
|
+
// Fallback (keys) mode. Just find keys that match ours.
|
|
34
|
+
if (sealingKeySeries.kind === SafroleSealingKeysKind.Keys) {
|
|
35
|
+
const sealPayload = getFallbackSealPayload(entropy);
|
|
36
|
+
return sealingKeySeries.keys.map((author) => {
|
|
37
|
+
const key = this.keys.get(author);
|
|
38
|
+
if (key === undefined) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
key,
|
|
43
|
+
sealPayload,
|
|
44
|
+
logId: `key ${key.bandersnatchPublic.toStringTruncated()}`,
|
|
45
|
+
};
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
// Tickets mode. Generate own VrfOutputHash for our tickets (cheap) and check if it matches.
|
|
49
|
+
const ownTickets = await this.getOwnTicketIds(entropy);
|
|
50
|
+
const slots = sealingKeySeries.tickets.map((ticket) => ownTickets.get(ticket.id.asOpaque()) ?? null);
|
|
51
|
+
return slots;
|
|
52
|
+
}
|
|
53
|
+
async getOwnTicketIds(entropy) {
|
|
54
|
+
// generate our own tickets first
|
|
55
|
+
const ownTickets = new HashDictionary();
|
|
56
|
+
for (let attempt = 0; attempt < this.ticketsPerValidator; attempt++) {
|
|
57
|
+
const sealPayload = getTicketSealPayload(entropy, attempt);
|
|
58
|
+
for (const key of this.keys.values()) {
|
|
59
|
+
const result = await bandersnatchVrf.getVrfOutputHash(this.bandersnatch, key.bandersnatchSecret, sealPayload);
|
|
60
|
+
if (result.isOk) {
|
|
61
|
+
const ticketId = result.ok.asOpaque();
|
|
62
|
+
ownTickets.set(ticketId, {
|
|
63
|
+
key,
|
|
64
|
+
sealPayload,
|
|
65
|
+
logId: `ticket ${ticketId} (attempt ${attempt})`,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return ownTickets;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function derivePublicKeys(keys) {
|
|
74
|
+
return Promise.all(keys.map(async (secrets) => ({
|
|
75
|
+
bandersnatchSecret: secrets.bandersnatch,
|
|
76
|
+
bandersnatchPublic: deriveBandersnatchPublicKey(secrets.bandersnatch),
|
|
77
|
+
ed25519Secret: secrets.ed25519,
|
|
78
|
+
ed25519Public: await deriveEd25519PublicKey(secrets.ed25519),
|
|
79
|
+
})));
|
|
80
|
+
}
|
|
81
|
+
function getTicketSealPayload(entropy, attempt) {
|
|
82
|
+
return asOpaqueType(BytesBlob.blobFromParts(JAM_TICKET_SEAL, entropy.raw, new Uint8Array([attempt])));
|
|
83
|
+
}
|
|
84
|
+
function getFallbackSealPayload(entropy) {
|
|
85
|
+
return asOpaqueType(BytesBlob.blobFromParts(JAM_FALLBACK_SEAL, entropy.raw));
|
|
86
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type EntropyHash, type Epoch, type TimeSlot } from "#@typeberry/block";
|
|
2
|
+
import type { ChainSpec } from "#@typeberry/config";
|
|
3
|
+
import type { Blake2b } from "#@typeberry/hash";
|
|
4
|
+
import type { Logger } from "#@typeberry/logger";
|
|
5
|
+
import type { BandernsatchWasm } from "#@typeberry/safrole/bandersnatch-wasm.js";
|
|
6
|
+
import { type SafroleSealingKeys, type State } from "#@typeberry/state";
|
|
7
|
+
import { Result } from "#@typeberry/utils";
|
|
8
|
+
import { EpochAuthoringSlots, type SlotSealData } from "./epoch-authoring-slots.js";
|
|
9
|
+
import type { ValidatorSecrets } from "./protocol.js";
|
|
10
|
+
/** Per-epoch data computed once when entering (or resuming into) an epoch. */
|
|
11
|
+
export type EpochData = {
|
|
12
|
+
epoch: Epoch;
|
|
13
|
+
epochLength: number;
|
|
14
|
+
sealingKeySeries: SafroleSealingKeys;
|
|
15
|
+
entropy: EntropyHash;
|
|
16
|
+
slots: Array<SlotSealData | null>;
|
|
17
|
+
};
|
|
18
|
+
export declare class EpochTracker {
|
|
19
|
+
private readonly chainSpec;
|
|
20
|
+
private readonly blake2bHasher;
|
|
21
|
+
readonly authoring: EpochAuthoringSlots;
|
|
22
|
+
static new(chainSpec: ChainSpec, bandersnatch: BandernsatchWasm, blake2bHasher: Blake2b, keys: readonly ValidatorSecrets[]): Promise<EpochTracker>;
|
|
23
|
+
private constructor();
|
|
24
|
+
isEpochChanged(stateTimeSlot: TimeSlot, newTimeSlot: TimeSlot): boolean;
|
|
25
|
+
getEpochData(logger: Logger, state: State, newTimeSlot: TimeSlot): Promise<Result<EpochData, string>>;
|
|
26
|
+
private getSealingKeySeries;
|
|
27
|
+
private logEpochAuthorshipInfo;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=epoch-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"epoch-tracker.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/block-authorship/epoch-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,KAAK,EAAE,KAAK,QAAQ,EAAc,MAAM,kBAAkB,CAAC;AAC3F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,KAAK,kBAAkB,EAA0B,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,KAAK,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACpF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,8EAA8E;AAC9E,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,kBAAkB,CAAC;IACrC,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;CACnC,CAAC;AAEF,qBAAa,YAAY;IAYrB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,aAAa;aACd,SAAS,EAAE,mBAAmB;WAbnC,GAAG,CACd,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,gBAAgB,EAC9B,aAAa,EAAE,OAAO,EACtB,IAAI,EAAE,SAAS,gBAAgB,EAAE;IAMnC,OAAO;IAMP,cAAc,CAAC,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO;IAOjE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YA+B7F,mBAAmB;IAejC,OAAO,CAAC,sBAAsB;CAe/B"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { tryAsEpoch } from "#@typeberry/block";
|
|
2
|
+
import { Safrole } from "#@typeberry/safrole";
|
|
3
|
+
import { SafroleSealingKeysKind } from "#@typeberry/state";
|
|
4
|
+
import { Result } from "#@typeberry/utils";
|
|
5
|
+
import { EpochAuthoringSlots } from "./epoch-authoring-slots.js";
|
|
6
|
+
export class EpochTracker {
|
|
7
|
+
chainSpec;
|
|
8
|
+
blake2bHasher;
|
|
9
|
+
authoring;
|
|
10
|
+
static async new(chainSpec, bandersnatch, blake2bHasher, keys) {
|
|
11
|
+
const epochSlots = await EpochAuthoringSlots.new(chainSpec, bandersnatch, keys);
|
|
12
|
+
return new EpochTracker(chainSpec, blake2bHasher, epochSlots);
|
|
13
|
+
}
|
|
14
|
+
constructor(chainSpec, blake2bHasher, authoring) {
|
|
15
|
+
this.chainSpec = chainSpec;
|
|
16
|
+
this.blake2bHasher = blake2bHasher;
|
|
17
|
+
this.authoring = authoring;
|
|
18
|
+
}
|
|
19
|
+
isEpochChanged(stateTimeSlot, newTimeSlot) {
|
|
20
|
+
const epochLength = this.chainSpec.epochLength;
|
|
21
|
+
const stateEpoch = Math.floor(stateTimeSlot / epochLength);
|
|
22
|
+
const newEpoch = Math.floor(newTimeSlot / epochLength);
|
|
23
|
+
return newEpoch > stateEpoch;
|
|
24
|
+
}
|
|
25
|
+
async getEpochData(logger, state, newTimeSlot) {
|
|
26
|
+
const sealingKeySeriesResult = await this.getSealingKeySeries(state, newTimeSlot);
|
|
27
|
+
// Propagate the typed failure instead of crashing — `main` decides whether to
|
|
28
|
+
// retry, skip or terminate, and keeps the real error details.
|
|
29
|
+
if (sealingKeySeriesResult.isError) {
|
|
30
|
+
return Result.error(`${sealingKeySeriesResult.error}`, sealingKeySeriesResult.details);
|
|
31
|
+
}
|
|
32
|
+
const epochLength = this.chainSpec.epochLength;
|
|
33
|
+
const sealingKeySeries = sealingKeySeriesResult.ok;
|
|
34
|
+
// On a new epoch, `state.entropy[2]` is the epoch-E entropy (pre-transition);
|
|
35
|
+
// mid-epoch, it has already shifted to `entropy[3]`. Use the same predicate
|
|
36
|
+
// as `getSealingKeySeries` so the entropy and the key series stay consistent
|
|
37
|
+
// even when the first authored block of an epoch isn't exactly at slot E·L.
|
|
38
|
+
const isNewEpoch = this.isEpochChanged(state.timeslot, newTimeSlot);
|
|
39
|
+
const entropy = isNewEpoch ? state.entropy[2] : state.entropy[3];
|
|
40
|
+
const epoch = tryAsEpoch(Math.floor(newTimeSlot / epochLength));
|
|
41
|
+
logger.log `[E${epoch}] is using ${SafroleSealingKeysKind[sealingKeySeries.kind]}`;
|
|
42
|
+
logger.trace `[E${epoch}] ${sealingKeySeries}`;
|
|
43
|
+
const slots = await this.authoring.getOurSlotsInKeySeries(sealingKeySeries, entropy);
|
|
44
|
+
this.logEpochAuthorshipInfo(logger, epoch, slots);
|
|
45
|
+
return Result.ok({
|
|
46
|
+
epoch,
|
|
47
|
+
epochLength,
|
|
48
|
+
sealingKeySeries,
|
|
49
|
+
entropy,
|
|
50
|
+
slots,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
async getSealingKeySeries(state, newTimeSlot) {
|
|
54
|
+
// in case we are not changing epoch, just use the state data
|
|
55
|
+
if (!this.isEpochChanged(state.timeslot, newTimeSlot)) {
|
|
56
|
+
return Result.ok(state.sealingKeySeries);
|
|
57
|
+
}
|
|
58
|
+
// otherwise, pick the new sealing key series already
|
|
59
|
+
const safrole = new Safrole(this.chainSpec, this.blake2bHasher, state);
|
|
60
|
+
return await safrole.getSealingKeySeries({
|
|
61
|
+
entropy: state.entropy[1],
|
|
62
|
+
slot: newTimeSlot,
|
|
63
|
+
punishSet: state.disputesRecords.punishSet,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
logEpochAuthorshipInfo(logger, epoch, slots) {
|
|
67
|
+
let isCreating = false;
|
|
68
|
+
let slot = epoch * this.chainSpec.epochLength;
|
|
69
|
+
for (const sealData of slots) {
|
|
70
|
+
if (sealData !== null) {
|
|
71
|
+
isCreating = true;
|
|
72
|
+
logger.info `[E${epoch}#${slot}] Validator ${sealData.key.bandersnatchPublic.toStringTruncated()} will author using ${sealData.logId}`;
|
|
73
|
+
}
|
|
74
|
+
slot += 1;
|
|
75
|
+
}
|
|
76
|
+
if (isCreating === false) {
|
|
77
|
+
logger.info `[E${epoch}] No blocks to author for this epoch.`;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/block-authorship/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,eAAO,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/block-authorship/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,eAAO,MAAM,MAAM,mBAAyD,CAAC"}
|
|
@@ -2,6 +2,9 @@ import type { NetworkingComms } from "#@typeberry/comms-authorship-network";
|
|
|
2
2
|
import type { WorkerConfig } from "#@typeberry/workers-api";
|
|
3
3
|
import type { BlockAuthorshipConfig, GeneratorInternal } from "./protocol.js";
|
|
4
4
|
type Config = WorkerConfig<BlockAuthorshipConfig>;
|
|
5
|
+
/**
|
|
6
|
+
* The `BlockAuthorship` should create new blocks and send them as signals to the main thread.
|
|
7
|
+
*/
|
|
5
8
|
export declare function main(config: Config, comms: GeneratorInternal, networkingComms: NetworkingComms): Promise<void>;
|
|
6
9
|
export {};
|
|
7
10
|
//# sourceMappingURL=main.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/block-authorship/main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/block-authorship/main.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAS3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAG3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAM9E,KAAK,MAAM,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC;AAElD;;GAEG;AAEH,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,iBAkKpG"}
|