@typeberry/lib 0.5.8 → 0.5.9-115148

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.
Files changed (69) hide show
  1. package/package.json +1 -1
  2. package/packages/core/pvm-host-calls/host-calls-executor.js +3 -3
  3. package/packages/core/utils/debug.d.ts.map +1 -1
  4. package/packages/core/utils/debug.js +14 -3
  5. package/packages/jam/block/work-item-segment.d.ts +23 -6
  6. package/packages/jam/block/work-item-segment.d.ts.map +1 -1
  7. package/packages/jam/block/work-item-segment.js +24 -7
  8. package/packages/jam/block/work-item.d.ts +3 -3
  9. package/packages/jam/block/work-item.d.ts.map +1 -1
  10. package/packages/jam/block/work-item.js +7 -3
  11. package/packages/jam/block/work-package.d.ts +1 -1
  12. package/packages/jam/database/blocks.d.ts +3 -0
  13. package/packages/jam/database/blocks.d.ts.map +1 -1
  14. package/packages/jam/database/blocks.js +5 -0
  15. package/packages/jam/database/serialized-states-db.d.ts +1 -0
  16. package/packages/jam/database/serialized-states-db.d.ts.map +1 -1
  17. package/packages/jam/database/serialized-states-db.js +3 -0
  18. package/packages/jam/database/states.d.ts +3 -0
  19. package/packages/jam/database/states.d.ts.map +1 -1
  20. package/packages/jam/database/states.js +3 -0
  21. package/packages/jam/database-lmdb/blocks.d.ts +1 -0
  22. package/packages/jam/database-lmdb/blocks.d.ts.map +1 -1
  23. package/packages/jam/database-lmdb/blocks.js +5 -0
  24. package/packages/jam/database-lmdb/states.d.ts +1 -0
  25. package/packages/jam/database-lmdb/states.d.ts.map +1 -1
  26. package/packages/jam/database-lmdb/states.js +3 -0
  27. package/packages/jam/in-core/externalities/refine.d.ts +27 -6
  28. package/packages/jam/in-core/externalities/refine.d.ts.map +1 -1
  29. package/packages/jam/in-core/externalities/refine.js +40 -7
  30. package/packages/jam/in-core/externalities/refine.test.d.ts +2 -0
  31. package/packages/jam/in-core/externalities/refine.test.d.ts.map +1 -0
  32. package/packages/jam/in-core/externalities/refine.test.js +163 -0
  33. package/packages/jam/in-core/in-core.d.ts +1 -1
  34. package/packages/jam/in-core/in-core.d.ts.map +1 -1
  35. package/packages/jam/in-core/in-core.js +14 -5
  36. package/packages/jam/jam-host-calls/externalities/refine-externalities.d.ts +2 -0
  37. package/packages/jam/jam-host-calls/externalities/refine-externalities.d.ts.map +1 -1
  38. package/packages/jam/jam-host-calls/externalities/refine-externalities.test.d.ts +2 -0
  39. package/packages/jam/jam-host-calls/externalities/refine-externalities.test.d.ts.map +1 -1
  40. package/packages/jam/jam-host-calls/externalities/refine-externalities.test.js +5 -0
  41. package/packages/jam/jam-host-calls/refine/export.d.ts +1 -1
  42. package/packages/jam/jam-host-calls/refine/export.js +1 -1
  43. package/packages/jam/jam-host-calls/refine/export.test.js +3 -0
  44. package/packages/jam/jam-host-calls/refine/historical-lookup.d.ts +1 -1
  45. package/packages/jam/jam-host-calls/refine/historical-lookup.js +1 -1
  46. package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.d.ts +1 -1
  47. package/packages/jam/node/main-fuzz.d.ts.map +1 -1
  48. package/packages/jam/node/main-fuzz.js +5 -1
  49. package/packages/jam/node/main-importer.d.ts +2 -0
  50. package/packages/jam/node/main-importer.d.ts.map +1 -1
  51. package/packages/jam/node/main-importer.js +9 -7
  52. package/packages/jam/node/main.d.ts.map +1 -1
  53. package/packages/jam/node/main.js +2 -0
  54. package/packages/workers/block-authorship/main.d.ts.map +1 -1
  55. package/packages/workers/block-authorship/main.js +26 -0
  56. package/packages/workers/importer/finality.d.ts +32 -0
  57. package/packages/workers/importer/finality.d.ts.map +1 -0
  58. package/packages/workers/importer/finality.js +105 -0
  59. package/packages/workers/importer/finality.test.d.ts +2 -0
  60. package/packages/workers/importer/finality.test.d.ts.map +1 -0
  61. package/packages/workers/importer/finality.test.js +369 -0
  62. package/packages/workers/importer/importer.d.ts +3 -0
  63. package/packages/workers/importer/importer.d.ts.map +1 -1
  64. package/packages/workers/importer/importer.js +13 -0
  65. package/packages/workers/importer/main.d.ts.map +1 -1
  66. package/packages/workers/importer/main.js +9 -1
  67. package/packages/workers/importer/protocol.d.ts +10 -3
  68. package/packages/workers/importer/protocol.d.ts.map +1 -1
  69. package/packages/workers/importer/protocol.js +14 -4
@@ -0,0 +1,163 @@
1
+ import assert from "node:assert";
2
+ import { describe, it } from "node:test";
3
+ import { MAX_NUMBER_OF_EXPORTS_WP, SEGMENT_BYTES, tryAsServiceGas, tryAsServiceId, tryAsTimeSlot, } from "#@typeberry/block";
4
+ import { Bytes, BytesBlob } from "#@typeberry/bytes";
5
+ import { HashDictionary } from "#@typeberry/collections";
6
+ import { tinyChainSpec } from "#@typeberry/config";
7
+ import { HASH_SIZE } from "#@typeberry/hash";
8
+ import { SegmentExportError } from "#@typeberry/jam-host-calls";
9
+ import { tryAsU32, tryAsU64 } from "#@typeberry/numbers";
10
+ import { InMemoryService, InMemoryState, PreimageItem, ServiceAccountInfo } from "#@typeberry/state";
11
+ import { RefineExternalitiesImpl } from "./refine.js";
12
+ function createSegment(byte = 0xab) {
13
+ return Bytes.fill(SEGMENT_BYTES, byte);
14
+ }
15
+ function createSmallSegment(bytes) {
16
+ const data = new Uint8Array(SEGMENT_BYTES);
17
+ data.set(bytes);
18
+ return Bytes.fromBlob(data, SEGMENT_BYTES);
19
+ }
20
+ /**
21
+ * Create a mock State that has specified services with preimages.
22
+ */
23
+ function createMockState(services) {
24
+ const serviceMap = new Map();
25
+ for (const svc of services) {
26
+ const preimages = HashDictionary.new();
27
+ for (const p of svc.preimages ?? []) {
28
+ const hash = Bytes.parseBytes(p.hash, HASH_SIZE).asOpaque();
29
+ const item = PreimageItem.create({
30
+ hash,
31
+ blob: BytesBlob.parseBlob(p.blob),
32
+ });
33
+ preimages.set(hash, item);
34
+ }
35
+ const serviceId = tryAsServiceId(svc.id);
36
+ serviceMap.set(serviceId, new InMemoryService(serviceId, {
37
+ info: ServiceAccountInfo.create({
38
+ codeHash: Bytes.zero(HASH_SIZE).asOpaque(),
39
+ balance: tryAsU64(1000000000n),
40
+ accumulateMinGas: tryAsServiceGas(100),
41
+ onTransferMinGas: tryAsServiceGas(100),
42
+ storageUtilisationBytes: tryAsU64(0),
43
+ storageUtilisationCount: tryAsU32(0),
44
+ gratisStorage: tryAsU64(0),
45
+ created: tryAsTimeSlot(0),
46
+ lastAccumulation: tryAsTimeSlot(0),
47
+ parentService: tryAsServiceId(0),
48
+ }),
49
+ preimages,
50
+ lookupHistory: HashDictionary.new(),
51
+ storage: new Map(),
52
+ }));
53
+ }
54
+ return InMemoryState.partial(tinyChainSpec, { services: serviceMap });
55
+ }
56
+ function createExt(overrides = {}) {
57
+ const defaultState = createMockState([]);
58
+ return RefineExternalitiesImpl.create({
59
+ currentServiceId: tryAsServiceId(42),
60
+ lookupState: overrides.lookupState ?? defaultState,
61
+ exportOffset: overrides.exportOffset ?? 0,
62
+ ...overrides,
63
+ });
64
+ }
65
+ describe("RefineExternalitiesImpl", () => {
66
+ describe("historicalLookup", () => {
67
+ const PREIMAGE_HASH = "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
68
+ const PREIMAGE_DATA = "0xdeadbeef";
69
+ it("should return preimage data for existing service and hash", async () => {
70
+ const lookupState = createMockState([{ id: 42, preimages: [{ hash: PREIMAGE_HASH, blob: PREIMAGE_DATA }] }]);
71
+ const ext = createExt({ lookupState });
72
+ const hash = Bytes.parseBytes(PREIMAGE_HASH, HASH_SIZE).asOpaque();
73
+ const result = await ext.historicalLookup(tryAsServiceId(42), hash);
74
+ assert.strictEqual(result?.toString(), BytesBlob.parseBlob(PREIMAGE_DATA).toString());
75
+ });
76
+ it("should use currentServiceId when serviceId is null", async () => {
77
+ const lookupState = createMockState([{ id: 42, preimages: [{ hash: PREIMAGE_HASH, blob: PREIMAGE_DATA }] }]);
78
+ const ext = createExt({ lookupState });
79
+ const hash = Bytes.parseBytes(PREIMAGE_HASH, HASH_SIZE).asOpaque();
80
+ const result = await ext.historicalLookup(null, hash);
81
+ assert.notStrictEqual(result, null);
82
+ });
83
+ it("should return null for non-existent service", async () => {
84
+ const ext = createExt();
85
+ const hash = Bytes.parseBytes(PREIMAGE_HASH, HASH_SIZE).asOpaque();
86
+ const result = await ext.historicalLookup(tryAsServiceId(999), hash);
87
+ assert.strictEqual(result, null);
88
+ });
89
+ it("should return null for non-existent preimage hash", async () => {
90
+ const lookupState = createMockState([{ id: 42 }]);
91
+ const ext = createExt({ lookupState });
92
+ const hash = Bytes.parseBytes(PREIMAGE_HASH, HASH_SIZE).asOpaque();
93
+ const result = await ext.historicalLookup(tryAsServiceId(42), hash);
94
+ assert.strictEqual(result, null);
95
+ });
96
+ it("should look up from the correct service when multiple exist", async () => {
97
+ const lookupState = createMockState([
98
+ { id: 1, preimages: [{ hash: PREIMAGE_HASH, blob: "0x01" }] },
99
+ { id: 2, preimages: [{ hash: PREIMAGE_HASH, blob: "0x02" }] },
100
+ ]);
101
+ const ext = createExt({ lookupState });
102
+ const hash = Bytes.parseBytes(PREIMAGE_HASH, HASH_SIZE).asOpaque();
103
+ const r1 = await ext.historicalLookup(tryAsServiceId(1), hash);
104
+ const r2 = await ext.historicalLookup(tryAsServiceId(2), hash);
105
+ assert.strictEqual(r1?.raw[0], 0x01);
106
+ assert.strictEqual(r2?.raw[0], 0x02);
107
+ });
108
+ });
109
+ describe("exportSegment", () => {
110
+ it("should export a segment and return its index", () => {
111
+ const ext = createExt();
112
+ const segment = createSegment(0x01);
113
+ const result = ext.exportSegment(segment);
114
+ assert.strictEqual(result.isOk, true);
115
+ assert.strictEqual(result.ok, 0); // first export at offset 0
116
+ assert.strictEqual(ext.getExportedSegments().length, 1);
117
+ });
118
+ it("should return sequential indices for multiple exports", () => {
119
+ const ext = createExt();
120
+ const r1 = ext.exportSegment(createSegment(0x01));
121
+ const r2 = ext.exportSegment(createSegment(0x02));
122
+ const r3 = ext.exportSegment(createSegment(0x03));
123
+ assert.strictEqual(r1.isOk, true);
124
+ assert.strictEqual(r1.ok, 0);
125
+ assert.strictEqual(r2.isOk, true);
126
+ assert.strictEqual(r2.ok, 1);
127
+ assert.strictEqual(r3.isOk, true);
128
+ assert.strictEqual(r3.ok, 2);
129
+ assert.strictEqual(ext.getExportedSegments().length, 3);
130
+ });
131
+ it("should apply exportOffset to segment indices", () => {
132
+ const ext = createExt({ exportOffset: 100 });
133
+ const result = ext.exportSegment(createSegment());
134
+ assert.strictEqual(result.isOk, true);
135
+ assert.strictEqual(result.ok, 100);
136
+ });
137
+ it("should return SegmentExportError when MAX_NUMBER_OF_EXPORTS_WP exceeded", () => {
138
+ const ext = createExt({ exportOffset: MAX_NUMBER_OF_EXPORTS_WP });
139
+ const result = ext.exportSegment(createSegment());
140
+ assert.strictEqual(result.isError, true);
141
+ assert.strictEqual(result.error, SegmentExportError);
142
+ });
143
+ it("should return SegmentExportError at exactly MAX_NUMBER_OF_EXPORTS_WP - 1 + 1", () => {
144
+ const ext = createExt({ exportOffset: MAX_NUMBER_OF_EXPORTS_WP - 1 });
145
+ // This one should succeed (index = MAX_NUMBER_OF_EXPORTS_WP - 1)
146
+ const r1 = ext.exportSegment(createSegment(0x01));
147
+ assert.strictEqual(r1.isOk, true);
148
+ assert.strictEqual(r1.ok, MAX_NUMBER_OF_EXPORTS_WP - 1);
149
+ // This one should fail
150
+ const r2 = ext.exportSegment(createSegment(0x02));
151
+ assert.strictEqual(r2.isError, true);
152
+ assert.strictEqual(r2.error, SegmentExportError);
153
+ });
154
+ it("should store exact segment data", () => {
155
+ const ext = createExt();
156
+ const segment = createSmallSegment([1, 2, 3, 4, 5]);
157
+ ext.exportSegment(segment);
158
+ const exported = ext.getExportedSegments();
159
+ assert.strictEqual(exported.length, 1);
160
+ assert.deepStrictEqual(exported[0].raw.subarray(0, 5), new Uint8Array([1, 2, 3, 4, 5]));
161
+ });
162
+ });
163
+ });
@@ -16,7 +16,7 @@ export type RefineResult = {
16
16
  };
17
17
  export type RefineItemResult = {
18
18
  result: WorkResult;
19
- exports: Segment[];
19
+ exports: readonly Segment[];
20
20
  };
21
21
  export declare enum RefineError {
22
22
  /** State for context anchor block or lookup anchor is not found in the DB. */
@@ -1 +1 @@
1
- {"version":3,"file":"in-core.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/in-core/in-core.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,UAAU,EAIhB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAY,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAmB,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAsC,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAGjH,OAAO,EAA+B,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAA+D,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACpH,OAAO,EAAE,KAAK,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAKzE,OAAO,EAA4B,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAGpE,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,OAAO,EAAE,CAAC;CACpB,CAAC;AAEF,oBAAY,WAAW;IACrB,8EAA8E;IAC9E,YAAY,IAAI;IAChB,qFAAqF;IACrF,iBAAiB,IAAI;IACrB,wEAAwE;IACxE,uBAAuB,IAAI;IAC3B,2BAA2B;IAC3B,kBAAkB,IAAI;CACvB;AAqBD,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;AAErE,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAgBF,qBAAa,MAAM;aAEC,SAAS,EAAE,SAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAHR,SAAS,EAAE,SAAS,EACnB,MAAM,EAAE,QAAQ,EAChB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,OAAO;IAGnC;;;;;;;;;OASG;IACG,MAAM,CACV,kBAAkB,EAAE,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,EAC1D,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,WAAW,CAAC,eAAe,EAAE,CAAC,EACvC,UAAU,EAAE,WAAW,CAAC,iBAAiB,EAAE,CAAC,GAC3C,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAmE7C,OAAO,CAAC,oBAAoB;YAuDd,gBAAgB;YAkBhB,UAAU;IAgGxB,iBAAiB,CAAC,UAAU,EAAE,WAAW,CAAC,UAAU,CAAC;IAiBrD,OAAO,CAAC,cAAc;IAyCtB,OAAO,CAAC,yBAAyB;CAoBlC"}
1
+ {"version":3,"file":"in-core.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/in-core/in-core.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,UAAU,EAIhB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAY,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAmB,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAsC,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAGjH,OAAO,EAA+B,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAA+D,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACpH,OAAO,EAAE,KAAK,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAKzE,OAAO,EAA4B,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAGpE,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;CAC7B,CAAC;AAEF,oBAAY,WAAW;IACrB,8EAA8E;IAC9E,YAAY,IAAI;IAChB,qFAAqF;IACrF,iBAAiB,IAAI;IACrB,wEAAwE;IACxE,uBAAuB,IAAI;IAC3B,2BAA2B;IAC3B,kBAAkB,IAAI;CACvB;AAqBD,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;AAErE,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAgBF,qBAAa,MAAM;aAEC,SAAS,EAAE,SAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAHR,SAAS,EAAE,SAAS,EACnB,MAAM,EAAE,QAAQ,EAChB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,OAAO;IAGnC;;;;;;;;;OASG;IACG,MAAM,CACV,kBAAkB,EAAE,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,EAC1D,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,WAAW,CAAC,eAAe,EAAE,CAAC,EACvC,UAAU,EAAE,WAAW,CAAC,iBAAiB,EAAE,CAAC,GAC3C,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAgF7C,OAAO,CAAC,oBAAoB;YAuDd,gBAAgB;YAkBhB,UAAU;IAoGxB,iBAAiB,CAAC,UAAU,EAAE,WAAW,CAAC,UAAU,CAAC;IAiBrD,OAAO,CAAC,cAAc;IAyCtB,OAAO,CAAC,yBAAyB;CA2BlC"}
@@ -102,10 +102,13 @@ export class InCore {
102
102
  }
103
103
  logger.log `[core:${core}] Authorized. Proceeding with work items verification. Anchor=${context.anchor}`;
104
104
  // Verify the work items
105
+ let exportOffset = 0;
105
106
  const refineResults = [];
106
107
  for (const [idx, item] of items.entries()) {
107
108
  logger.info `[core:${core}][i:${idx}] Refining item for service ${item.service}.`;
108
- refineResults.push(await this.refineItem(state, idx, item, imports, extrinsics, core, workPackageHash));
109
+ const result = await this.refineItem(state, lookupState, idx, item, imports, extrinsics, core, workPackageHash, exportOffset);
110
+ refineResults.push(result);
111
+ exportOffset += result.exports.length;
109
112
  }
110
113
  // amalgamate the work report now
111
114
  return Result.ok(this.amalgamateWorkReport(asKnownSize(refineResults), authResult.ok, workPackageHash, context, core));
@@ -164,7 +167,7 @@ export class InCore {
164
167
  authorizationOutput,
165
168
  });
166
169
  }
167
- async refineItem(state, idx, item, allImports, allExtrinsics, coreIndex, workPackageHash) {
170
+ async refineItem(state, lookupState, idx, item, allImports, allExtrinsics, coreIndex, workPackageHash, exportOffset) {
168
171
  const payloadHash = this.blake2b.hashBytes(item.payload);
169
172
  const baseResult = {
170
173
  serviceId: item.service,
@@ -202,6 +205,9 @@ export class InCore {
202
205
  payload: item.payload,
203
206
  imports: allImports,
204
207
  extrinsics: allExtrinsics,
208
+ currentServiceId: item.service,
209
+ lookupState,
210
+ exportOffset,
205
211
  });
206
212
  const executor = await PvmExecutor.createRefineExecutor(item.service, code, externalities, this.pvmBackend);
207
213
  const args = Encoder.encodeObject(ARGS_CODEC, {
@@ -212,8 +218,7 @@ export class InCore {
212
218
  packageHash: workPackageHash,
213
219
  });
214
220
  const execResult = await executor.run(args, item.refineGasLimit);
215
- // TODO [ToDr] get exports from externalities
216
- const exports = [];
221
+ const exports = externalities.refine.getExportedSegments();
217
222
  if (exports.length !== item.exportCount) {
218
223
  return {
219
224
  exports,
@@ -285,7 +290,11 @@ export class InCore {
285
290
  entropy: undefined,
286
291
  ...args,
287
292
  }, this.chainSpec);
288
- const refine = RefineExternalitiesImpl.create();
293
+ const refine = RefineExternalitiesImpl.create({
294
+ currentServiceId: args.currentServiceId,
295
+ lookupState: args.lookupState,
296
+ exportOffset: args.exportOffset,
297
+ });
289
298
  return {
290
299
  fetchExternalities,
291
300
  refine,
@@ -82,6 +82,8 @@ export declare const SegmentExportError: unique symbol;
82
82
  export type SegmentExportError = typeof SegmentExportError;
83
83
  /** Host functions external invocations available during refine phase. */
84
84
  export interface RefineExternalities {
85
+ /** Get the segments exported during this work item's refinement. */
86
+ getExportedSegments(): readonly Segment[];
85
87
  /** Forget a previously started nested VM. */
86
88
  machineExpunge(machineIndex: MachineId): Promise<Result<ProgramCounter, NoMachineError>>;
87
89
  /** Set given range of pages as non-accessible and re-initialize them with zeros. */
@@ -1 +1 @@
1
- {"version":3,"file":"refine-externalities.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/jam-host-calls/externalities/refine-externalities.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"refine-externalities.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/jam-host-calls/externalities/refine-externalities.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,8 @@ export declare class TestRefineExt implements RefineExternalities {
20
20
  readonly machineZeroPagesData: MultiMap<Parameters<TestRefineExt["machineZeroPages"]>, Result<OK, ZeroVoidError>>;
21
21
  readonly machinePagesData: MultiMap<Parameters<TestRefineExt["machinePages"]>, Result<OK, PagesError>>;
22
22
  machineInvokeStatus: MachineStatus;
23
+ private readonly exportSegments;
24
+ getExportedSegments(): readonly Segment[];
23
25
  machineExpunge(machineIndex: MachineId): Promise<Result<ProgramCounter, NoMachineError>>;
24
26
  machineVoidPages(machineIndex: MachineId, pageStart: U64, pageCount: U64): Promise<Result<OK, ZeroVoidError>>;
25
27
  machineZeroPages(machineIndex: MachineId, pageStart: U64, pageCount: U64): Promise<Result<OK, ZeroVoidError>>;
@@ -1 +1 @@
1
- {"version":3,"file":"refine-externalities.test.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/jam-host-calls/externalities/refine-externalities.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"refine-externalities.test.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/jam-host-calls/externalities/refine-externalities.test.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,10 @@ export class TestRefineExt {
23
23
  machineZeroPagesData = new MultiMap(3);
24
24
  machinePagesData = new MultiMap(4);
25
25
  machineInvokeStatus = { status: Status.OK };
26
+ exportSegments = [];
27
+ getExportedSegments() {
28
+ return this.exportSegments;
29
+ }
26
30
  machineExpunge(machineIndex) {
27
31
  const val = this.machineExpungeData.get(machineIndex);
28
32
  if (val === undefined) {
@@ -86,6 +90,7 @@ export class TestRefineExt {
86
90
  if (result === undefined) {
87
91
  throw new Error(`Unexpected call to exportSegment with: ${segment}`);
88
92
  }
93
+ this.exportSegments.push(segment);
89
94
  return result;
90
95
  }
91
96
  historicalLookup(serviceId, hash) {
@@ -4,7 +4,7 @@ import type { RefineExternalities } from "../externalities/refine-externalities.
4
4
  /**
5
5
  * Export a segment to be imported by some future `refine` invokation.
6
6
  *
7
- * https://graypaper.fluffylabs.dev/#/7e6ff6a/341d01341d01?v=0.6.7
7
+ * https://graypaper.fluffylabs.dev/#/ab2cdbd/33db0233db02?v=0.7.2
8
8
  */
9
9
  export declare class Export implements HostCallHandler {
10
10
  private readonly refine;
@@ -11,7 +11,7 @@ const IN_OUT_REG = 7;
11
11
  /**
12
12
  * Export a segment to be imported by some future `refine` invokation.
13
13
  *
14
- * https://graypaper.fluffylabs.dev/#/7e6ff6a/341d01341d01?v=0.6.7
14
+ * https://graypaper.fluffylabs.dev/#/ab2cdbd/33db0233db02?v=0.7.2
15
15
  */
16
16
  export class Export {
17
17
  refine;
@@ -47,6 +47,7 @@ describe("HostCalls: Export", () => {
47
47
  // then
48
48
  assert.deepStrictEqual(result, undefined);
49
49
  assert.deepStrictEqual(registers.get(RESULT_REG), 15n);
50
+ assert.strictEqual(refine.getExportedSegments().length, 1);
50
51
  });
51
52
  it("should zero-pad when exported value is small", async () => {
52
53
  const refine = new TestRefineExt();
@@ -63,6 +64,7 @@ describe("HostCalls: Export", () => {
63
64
  // then
64
65
  assert.deepStrictEqual(result, undefined);
65
66
  assert.deepStrictEqual(registers.get(RESULT_REG), 5n);
67
+ assert.strictEqual(refine.getExportedSegments().length, 1);
66
68
  });
67
69
  it("should panic if memory is not readable", async () => {
68
70
  const refine = new TestRefineExt();
@@ -74,6 +76,7 @@ describe("HostCalls: Export", () => {
74
76
  const result = await exp.execute(gas, registers, memory);
75
77
  // then
76
78
  assert.deepStrictEqual(result, PvmExecution.Panic);
79
+ assert.strictEqual(refine.getExportedSegments().length, 0);
77
80
  });
78
81
  it("should fail with FULL if export limit is reached", async () => {
79
82
  const refine = new TestRefineExt();
@@ -4,7 +4,7 @@ import type { RefineExternalities } from "../externalities/refine-externalities.
4
4
  /**
5
5
  * Lookup a historical preimage.
6
6
  *
7
- * https://graypaper.fluffylabs.dev/#/7e6ff6a/343b00343b00?v=0.6.7
7
+ * https://graypaper.fluffylabs.dev/#/ab2cdbd/33c90133c901?v=0.7.2
8
8
  */
9
9
  export declare class HistoricalLookup implements HostCallHandler {
10
10
  private readonly refine;
@@ -10,7 +10,7 @@ const IN_OUT_REG = 7;
10
10
  /**
11
11
  * Lookup a historical preimage.
12
12
  *
13
- * https://graypaper.fluffylabs.dev/#/7e6ff6a/343b00343b00?v=0.6.7
13
+ * https://graypaper.fluffylabs.dev/#/ab2cdbd/33c90133c901?v=0.7.2
14
14
  */
15
15
  export class HistoricalLookup {
16
16
  refine;
@@ -38,7 +38,7 @@ export declare class CoreWorkPackage extends WithDebug {
38
38
  accumulateGasLimit: import("@typeberry/codec").Descriptor<bigint & import("@typeberry/numbers").WithBytesRepresentation<8> & import("@typeberry/utils").WithOpaque<"ServiceGas[u64]">, import("@typeberry/bytes").Bytes<8>>;
39
39
  exportCount: import("@typeberry/codec").Descriptor<import("@typeberry/numbers").U16, import("@typeberry/bytes").Bytes<2>>;
40
40
  payload: import("@typeberry/codec").Descriptor<BytesBlob, BytesBlob>;
41
- importSegments: import("@typeberry/codec").Descriptor<readonly import("@typeberry/block").ImportSpec[] & import("@typeberry/utils").WithOpaque<"Less than 2048">, import("@typeberry/codec").SequenceView<import("@typeberry/block").ImportSpec, import("@typeberry/codec").ViewOf<import("@typeberry/block").ImportSpec, {
41
+ importSegments: import("@typeberry/codec").Descriptor<readonly import("@typeberry/block").ImportSpec[] & import("@typeberry/utils").WithOpaque<"Less than 3072">, import("@typeberry/codec").SequenceView<import("@typeberry/block").ImportSpec, import("@typeberry/codec").ViewOf<import("@typeberry/block").ImportSpec, {
42
42
  treeRoot: import("@typeberry/codec").Descriptor<import("@typeberry/bytes").Bytes<32>, import("@typeberry/bytes").Bytes<32>>;
43
43
  index: import("@typeberry/codec").Descriptor<number & import("@typeberry/numbers").WithBytesRepresentation<2> & import("@typeberry/utils").WithOpaque<"Segment Index [U16]">, import("@typeberry/bytes").Bytes<2>>;
44
44
  }>>>;
@@ -1 +1 @@
1
- {"version":3,"file":"main-fuzz.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/node/main-fuzz.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,WAAW,EAAmB,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAMrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIjD,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,WAAW,CAAC;IACrB,aAAa,EAAE,SAAS,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,uBAAuB,EAAE,OAAO,CAAC;CAClC,CAAC;AAIF,wBAAgB,cAAc;;;;EAM7B;AAED,wBAAsB,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,uBAoExF"}
1
+ {"version":3,"file":"main-fuzz.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/node/main-fuzz.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,WAAW,EAAmB,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAMrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIjD,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,WAAW,CAAC;IACrB,aAAa,EAAE,SAAS,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,uBAAuB,EAAE,OAAO,CAAC;CAClC,CAAC;AAIF,wBAAgB,cAAc;;;;EAM7B;AAED,wBAAsB,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,uBAwExF"}
@@ -66,7 +66,11 @@ export async function mainFuzz(fuzzConfig, withRelPath) {
66
66
  },
67
67
  ancestry,
68
68
  network: null,
69
- }, withRelPath, { initGenesisFromAncestry: fuzzConfig.initGenesisFromAncestry });
69
+ }, withRelPath, {
70
+ initGenesisFromAncestry: fuzzConfig.initGenesisFromAncestry,
71
+ dummyFinalityDepth: 10_000,
72
+ pruneBlocks: true,
73
+ });
70
74
  runningNode = newNode;
71
75
  return await newNode.getBestStateRootHash();
72
76
  },
@@ -2,6 +2,8 @@ import type { JamConfig } from "./jam-config.js";
2
2
  import type { NodeApi } from "./main.js";
3
3
  export type ImporterOptions = {
4
4
  initGenesisFromAncestry?: boolean;
5
+ dummyFinalityDepth?: number;
6
+ pruneBlocks?: boolean;
5
7
  };
6
8
  export declare function mainImporter(config: JamConfig, withRelPath: (v: string) => string, options?: ImporterOptions): Promise<NodeApi>;
7
9
  //# sourceMappingURL=main-importer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"main-importer.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/node/main-importer.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,MAAM,MAAM,eAAe,GAAG;IAC5B,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC,CAAC;AAEF,wBAAsB,YAAY,CAChC,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAClC,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,OAAO,CAAC,CA+ElB"}
1
+ {"version":3,"file":"main-importer.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/node/main-importer.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,MAAM,MAAM,eAAe,GAAG;IAC5B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,wBAAsB,YAAY,CAChC,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAClC,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,OAAO,CAAC,CAgFlB"}
@@ -2,7 +2,8 @@ import { Bytes } from "#@typeberry/bytes";
2
2
  import { PvmBackend } from "#@typeberry/config";
3
3
  import { bandersnatch, initWasm } from "#@typeberry/crypto";
4
4
  import { Blake2b, HASH_SIZE } from "#@typeberry/hash";
5
- import { createImporter } from "#@typeberry/importer";
5
+ import { createImporter, ImporterConfig } from "#@typeberry/importer";
6
+ import { tryAsU16 } from "#@typeberry/numbers";
6
7
  import { CURRENT_SUITE, CURRENT_VERSION, Result, resultToString, version } from "#@typeberry/utils";
7
8
  import { InMemWorkerConfig, LmdbWorkerConfig } from "#@typeberry/workers-api-node";
8
9
  import { getChainSpec, getDatabasePath, initializeDatabase, logger } from "./common.js";
@@ -18,23 +19,24 @@ export async function mainImporter(config, withRelPath, options = {}) {
18
19
  const blake2b = await Blake2b.createHasher();
19
20
  const nodeName = config.nodeName;
20
21
  const { dbPath, genesisHeaderHash } = getDatabasePath(blake2b, config.nodeName, config.node.chainSpec.genesisHeader, withRelPath(config.node.databaseBasePath ?? "<in-memory>"));
22
+ const workerParams = ImporterConfig.create({
23
+ pvm: config.pvmBackend,
24
+ dummyFinalityDepth: tryAsU16(options.dummyFinalityDepth ?? 0),
25
+ pruneBlocks: options.pruneBlocks ?? false,
26
+ });
21
27
  const workerConfig = config.node.databaseBasePath === undefined
22
28
  ? InMemWorkerConfig.new({
23
29
  nodeName,
24
30
  chainSpec,
25
31
  blake2b,
26
- workerParams: {
27
- pvm: config.pvmBackend,
28
- },
32
+ workerParams,
29
33
  })
30
34
  : LmdbWorkerConfig.new({
31
35
  nodeName,
32
36
  chainSpec,
33
37
  blake2b,
34
38
  dbPath,
35
- workerParams: {
36
- pvm: config.pvmBackend,
37
- },
39
+ workerParams,
38
40
  });
39
41
  // Initialize the database with genesis state and block if there isn't one.
40
42
  logger.info `🛢️ Opening database at ${dbPath}`;
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/node/main.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAc,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEzF,OAAO,EAAE,KAAK,SAAS,EAAc,MAAM,mBAAmB,CAAC;AAe/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAkC,MAAM,EAAW,MAAM,kBAAkB,CAAC;AAKnF,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,iBAAiB,CAAC;AAWhE,MAAM,MAAM,OAAO,GAAG;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAChE,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;IACtE,oBAAoB,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IAC/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAEF,wBAAsB,IAAI,CACxB,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAClC,SAAS,EAAE,SAAS,GAAG,IAAI,GAC1B,OAAO,CAAC,OAAO,CAAC,CAuKlB"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/node/main.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAc,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEzF,OAAO,EAAE,KAAK,SAAS,EAAc,MAAM,mBAAmB,CAAC;AAe/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAkC,MAAM,EAAW,MAAM,kBAAkB,CAAC;AAKnF,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,iBAAiB,CAAC;AAWhE,MAAM,MAAM,OAAO,GAAG;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAChE,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;IACtE,oBAAoB,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IAC/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAEF,wBAAsB,IAAI,CACxB,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAClC,SAAS,EAAE,SAAS,GAAG,IAAI,GAC1B,OAAO,CAAC,OAAO,CAAC,CAyKlB"}
@@ -34,6 +34,8 @@ export async function main(config, withRelPath, telemetry) {
34
34
  ...baseConfig,
35
35
  workerParams: ImporterConfig.create({
36
36
  pvm: config.pvmBackend,
37
+ dummyFinalityDepth: tryAsU16(config.devValidatorIndex !== null ? 100 : 0),
38
+ pruneBlocks: false,
37
39
  }),
38
40
  };
39
41
  const importerConfig = isInMemory
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/block-authorship/main.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAgB3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAK9E,KAAK,MAAM,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC;AAkBlD,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,iBA4MpG"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/block-authorship/main.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAgB3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAK9E,KAAK,MAAM,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC;AAkBlD,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,iBAgPpG"}
@@ -41,7 +41,15 @@ export async function main(config, comms, networkingComms) {
41
41
  ed25519Secret: secrets.ed25519,
42
42
  ed25519Public: await deriveEd25519PublicKey(secrets.ed25519),
43
43
  })));
44
+ const initialHash = blocks.getBestHeaderHash();
45
+ const initialState = states.getState(initialHash);
44
46
  logger.info `Block authorship validator keys: ${keys.map(({ bandersnatchPublic }, index) => `\n ${index}: ${bandersnatchPublic.toString()}`)}`;
47
+ if (initialState !== null) {
48
+ const initialKeys = await getSealingKeySeries(startTimeSlot % chainSpec.epochLength === 0, startTimeSlot, initialState);
49
+ if (initialKeys.isOk) {
50
+ logEpochBlockCreation(tryAsEpoch(Math.floor(startTimeSlot / chainSpec.epochLength)), initialKeys.ok);
51
+ }
52
+ }
45
53
  function getTime() {
46
54
  const currentTime = process.hrtime.bigint() / 1000000n;
47
55
  const timeFromStart = currentTime - startTime;
@@ -77,6 +85,21 @@ export async function main(config, comms, networkingComms) {
77
85
  const currentEpoch = Math.floor(currentTimeslot / chainSpec.epochLength);
78
86
  return currentEpoch > lastEpoch;
79
87
  }
88
+ function logEpochBlockCreation(epoch, sealingKeySeries) {
89
+ let isCreating = false;
90
+ const epochStart = epoch * chainSpec.epochLength;
91
+ const epochEnd = epochStart + chainSpec.epochLength;
92
+ for (let slot = epochStart; slot < epochEnd; slot++) {
93
+ const key = getKeyForCurrentSlot(sealingKeySeries, keys, tryAsTimeSlot(slot));
94
+ if (key !== null) {
95
+ isCreating = true;
96
+ logger.info `[EPOCH ${epoch}] Validator ${key.bandersnatchPublic.toString()} will author block at slot ${slot}`;
97
+ }
98
+ }
99
+ if (isCreating === false) {
100
+ logger.info `[EPOCH ${epoch}] No blocks to author for this epoch.`;
101
+ }
102
+ }
80
103
  async function getSealingKeySeries(isNewEpoch, timeSlot, state) {
81
104
  if (isNewEpoch) {
82
105
  const safrole = new Safrole(chainSpec, blake2bHasher, state);
@@ -145,6 +168,9 @@ export async function main(config, comms, networkingComms) {
145
168
  if (selingKeySeriesResult.isError) {
146
169
  continue;
147
170
  }
171
+ if (isNewEpoch) {
172
+ logEpochBlockCreation(epoch, selingKeySeriesResult.ok);
173
+ }
148
174
  const key = getKeyForCurrentSlot(selingKeySeriesResult.ok, keys, timeSlot);
149
175
  if (key !== null && currentValidatorData !== undefined) {
150
176
  const validatorIndex = getValidatorIndex(key, currentValidatorData);
@@ -0,0 +1,32 @@
1
+ import type { HeaderHash } from "#@typeberry/block";
2
+ import type { BlocksDb } from "#@typeberry/database";
3
+ /** Result returned when a new block is finalized. */
4
+ export interface FinalityResult {
5
+ /** The newly finalized block hash. */
6
+ finalizedHash: HeaderHash;
7
+ /** Block hashes whose states are no longer needed and can be pruned. */
8
+ prunableStateHashes: HeaderHash[];
9
+ }
10
+ /** An abstraction for deciding which blocks are finalized. */
11
+ export interface Finalizer {
12
+ /** Called after block import. Returns finality info if a new block was finalized, or null. */
13
+ onBlockImported(headerHash: HeaderHash): FinalityResult | null;
14
+ }
15
+ /**
16
+ * A simple finalizer that considers a block finalized when N blocks
17
+ * have been built on top of it.
18
+ *
19
+ * Maintains an array of fork chains starting from the last finalized block.
20
+ * When any chain reaches `depth`, the earliest blocks are finalized and
21
+ * dead forks (branching from before the finalized point) are discarded.
22
+ */
23
+ export declare class DummyFinalizer implements Finalizer {
24
+ private readonly blocks;
25
+ private readonly depth;
26
+ private lastFinalizedHash;
27
+ private unfinalized;
28
+ static create(blocks: BlocksDb, depth: number): DummyFinalizer;
29
+ private constructor();
30
+ onBlockImported(headerHash: HeaderHash): FinalityResult | null;
31
+ }
32
+ //# sourceMappingURL=finality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finality.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/importer/finality.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAKpD,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,aAAa,EAAE,UAAU,CAAC;IAC1B,wEAAwE;IACxE,mBAAmB,EAAE,UAAU,EAAE,CAAC;CACnC;AAED,8DAA8D;AAC9D,MAAM,WAAW,SAAS;IACxB,8FAA8F;IAC9F,eAAe,CAAC,UAAU,EAAE,UAAU,GAAG,cAAc,GAAG,IAAI,CAAC;CAChE;AAKD;;;;;;;GAOG;AACH,qBAAa,cAAe,YAAW,SAAS;IAS5C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IATxB,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,WAAW,CAAe;IAElC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc;IAI9D,OAAO;IAQP,eAAe,CAAC,UAAU,EAAE,UAAU,GAAG,cAAc,GAAG,IAAI;CAyF/D"}