@typeberry/lib 0.7.2 → 0.7.3-ffe481c
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 +1 -1
- package/packages/core/numbers/index.d.ts.map +1 -1
- package/packages/core/numbers/index.js +2 -1
- package/packages/core/numbers/index.test.js +19 -1
- package/packages/core/pvm-interpreter/memory/memory-utils.d.ts.map +1 -1
- package/packages/core/pvm-interpreter/memory/memory-utils.js +2 -1
- package/packages/core/pvm-interpreter/memory/memory-utils.test.js +12 -0
- package/packages/core/shuffling/shuffling.js +1 -1
- package/packages/core/utils/debug.d.ts +11 -0
- package/packages/core/utils/debug.d.ts.map +1 -1
- package/packages/core/utils/debug.js +40 -0
- package/packages/core/utils/debug.test.js +22 -1
- package/packages/jam/transition/accumulate/accumulate-utils.js +1 -1
- package/packages/workers/importer/importer.d.ts +1 -0
- package/packages/workers/importer/importer.d.ts.map +1 -1
- package/packages/workers/importer/importer.js +5 -1
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/core/numbers/index.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,CAAC,MAAM,wBAAwB,EAAE,OAAO,MAAM,CAAC;AAE7D,MAAM,MAAM,uBAAuB,CAAC,KAAK,SAAS,MAAM,IAAI;IAC1D,QAAQ,CAAC,CAAC,wBAAwB,CAAC,EAAE,KAAK,CAAC;CAC5C,CAAC;AAKF,MAAM,MAAM,eAAe,CAAC,KAAK,SAAS,MAAM,IAAI,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;AAE5F,4DAA4D;AAC5D,MAAM,MAAM,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;AACpC,eAAO,MAAM,YAAY,MAAO,CAAC;AACjC,6DAA6D;AAC7D,MAAM,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;AACrC,eAAO,MAAM,aAAa,QAAS,CAAC;AACpC,2DAA2D;AAC3D,MAAM,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;AACrC,eAAO,MAAM,aAAa,aAAc,CAAC;AACzC,2DAA2D;AAC3D,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,uBAAuB,CAAC,CAAC,CAAC,CAAC;AACtD,eAAO,MAAM,aAAa,wBAAyB,CAAC;AAEpD,+CAA+C;AAC/C,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,KAAG,EAGnC,CAAC;AACF,kDAAkD;AAClD,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,KAAG,CAAC,IAAI,EAA8B,CAAC;AAErE,gDAAgD;AAChD,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,KAAG,GAGpC,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,KAAG,CAAC,IAAI,GAAgC,CAAC;AAExE,gDAAgD;AAChD,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,KAAG,GAGpC,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,KAAG,CAAC,IAAI,GAAsC,CAAC;AAE9E,gDAAgD;AAChD,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,GAAG,MAAM,KAAG,GAI7C,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,KAAG,CAAC,IAAI,GAAgC,CAAC;AAExE,0CAA0C;AAC1C,eAAO,MAAM,YAAY,GAAI,kBAAkB;IAAE,KAAK,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,GAAG,CAAA;CAAE,KAAG,GAG3E,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,YAAY,GAAI,GAAG,GAAG,KAAG;IAAE,KAAK,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,GAAG,CAAA;CAS7D,CAAC;AAEF,qCAAqC;AACrC,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI;IACtB,uCAAuC;IACvC,QAAQ,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,KAAK,EAAE,CAAC,CAAC;CACV,CAAC;AAEF;;;GAGG;AACH,wBAAgB,MAAM,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE;;;EAWtC;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE;;;EAWtC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,GAAG,UAAU,CAEnD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,GAAG,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/core/numbers/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -86,7 +86,8 @@ export function u32AsLeBytes(value) {
|
|
|
86
86
|
*/
|
|
87
87
|
export function leBytesAsU32(uint8Array) {
|
|
88
88
|
check `${uint8Array.length === 4} Input must be a Uint8Array of length 4`;
|
|
89
|
-
|
|
89
|
+
// >>> 0 is needed to avoid changing sign of the number (the `<< 24` produces a signed int32)
|
|
90
|
+
return asTypedNumber((uint8Array[0] | (uint8Array[1] << 8) | (uint8Array[2] << 16) | (uint8Array[3] << 24)) >>> 0);
|
|
90
91
|
}
|
|
91
92
|
/** Get the smallest value between U64 a and values given as input parameters. */
|
|
92
93
|
export const minU64 = (a, ...values) => values.reduce((min, value) => (value > min ? min : value), a);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, it } from "node:test";
|
|
3
|
-
import { maxU64, minU64, sumU32, sumU64, tryAsU32, tryAsU64, u32AsLeBytes } from "./index.js";
|
|
3
|
+
import { leBytesAsU32, maxU64, minU64, sumU32, sumU64, tryAsU32, tryAsU64, u32AsLeBytes } from "./index.js";
|
|
4
4
|
describe("sumU32", () => {
|
|
5
5
|
it("should sum and handle overflow", () => {
|
|
6
6
|
const res1 = sumU32(tryAsU32(3), tryAsU32(5), tryAsU32(10));
|
|
@@ -40,6 +40,24 @@ describe("u32AsLittleEndian", () => {
|
|
|
40
40
|
});
|
|
41
41
|
}
|
|
42
42
|
});
|
|
43
|
+
describe("leBytesAsU32", () => {
|
|
44
|
+
const createTestCase = (bytes, expectedResult) => ({
|
|
45
|
+
bytes: new Uint8Array(bytes),
|
|
46
|
+
expectedResult,
|
|
47
|
+
});
|
|
48
|
+
const testCases = [
|
|
49
|
+
createTestCase([5, 0, 0, 0], 5),
|
|
50
|
+
createTestCase([0xff, 0xff, 0xff, 0x7f], 2147483647),
|
|
51
|
+
createTestCase([0, 0, 0, 0x80], 2147483648),
|
|
52
|
+
createTestCase([0xff, 0xff, 0xff, 0xff], 2 ** 32 - 1),
|
|
53
|
+
];
|
|
54
|
+
for (const { bytes, expectedResult } of testCases) {
|
|
55
|
+
it(`should decode ${bytes} as ${expectedResult}`, () => {
|
|
56
|
+
const result = leBytesAsU32(bytes);
|
|
57
|
+
assert.strictEqual(result, expectedResult);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
});
|
|
43
61
|
describe("tryAsU32", () => {
|
|
44
62
|
it("should cast numbers", () => {
|
|
45
63
|
const v = 1234;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-utils.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/pvm-interpreter/memory/memory-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAoB,MAAM,mBAAmB,CAAC;AACvF,OAAO,EAAE,KAAK,UAAU,EAAmB,MAAM,uBAAuB,CAAC;AAEzE,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,UAE7C;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,wEAE7D;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"memory-utils.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/pvm-interpreter/memory/memory-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAoB,MAAM,mBAAmB,CAAC;AACvF,OAAO,EAAE,KAAK,UAAU,EAAmB,MAAM,uBAAuB,CAAC;AAEzE,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,UAE7C;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,wEAE7D;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,kEAGrD;AAED,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,UAAU,kEAGrE"}
|
|
@@ -8,7 +8,8 @@ export function getPageNumber(address) {
|
|
|
8
8
|
return tryAsPageNumber(address >>> PAGE_SIZE_SHIFT);
|
|
9
9
|
}
|
|
10
10
|
export function getStartPageIndex(address) {
|
|
11
|
-
|
|
11
|
+
// >>> 0 is needed to avoid changing sign of the number
|
|
12
|
+
return tryAsMemoryIndex(((address >>> PAGE_SIZE_SHIFT) << PAGE_SIZE_SHIFT) >>> 0);
|
|
12
13
|
}
|
|
13
14
|
export function getStartPageIndexFromPageNumber(pageNumber) {
|
|
14
15
|
// >>> 0 is needed to avoid changing sign of the number
|
|
@@ -53,6 +53,18 @@ describe("memory-utils", () => {
|
|
|
53
53
|
const startPageIndex = getStartPageIndex(address);
|
|
54
54
|
assert.strictEqual(startPageIndex, expectedAddress);
|
|
55
55
|
});
|
|
56
|
+
it("should return a non-negative index for an address with bit 31 set", () => {
|
|
57
|
+
const address = tryAsMemoryIndex(0x8e64_e123);
|
|
58
|
+
const expectedAddress = 0x8e64_e000;
|
|
59
|
+
const startPageIndex = getStartPageIndex(address);
|
|
60
|
+
assert.strictEqual(startPageIndex, expectedAddress);
|
|
61
|
+
});
|
|
62
|
+
it("should return start index of the last page", () => {
|
|
63
|
+
const address = tryAsMemoryIndex(MAX_MEMORY_INDEX);
|
|
64
|
+
const expectedAddress = MAX_MEMORY_INDEX - PAGE_SIZE + 1;
|
|
65
|
+
const startPageIndex = getStartPageIndex(address);
|
|
66
|
+
assert.strictEqual(startPageIndex, expectedAddress);
|
|
67
|
+
});
|
|
56
68
|
});
|
|
57
69
|
describe("getStartPageIndexFromPageNumber", () => {
|
|
58
70
|
it("should return a correct start index for page 0", () => {
|
|
@@ -31,7 +31,7 @@ function hashToNumberSequence(blake2b, entropy, length) {
|
|
|
31
31
|
const newHash = blake2b.hashBytes(randomBytes);
|
|
32
32
|
const numberStartIndex = (4 * i) % 32;
|
|
33
33
|
const numberEndIndex = numberStartIndex + 4;
|
|
34
|
-
const number = leBytesAsU32(newHash.raw.subarray(numberStartIndex, numberEndIndex))
|
|
34
|
+
const number = leBytesAsU32(newHash.raw.subarray(numberStartIndex, numberEndIndex));
|
|
35
35
|
result[i] = number;
|
|
36
36
|
}
|
|
37
37
|
return result;
|
|
@@ -41,6 +41,17 @@ export declare function assertEmpty<T extends Record<string, never>>(value: T):
|
|
|
41
41
|
export declare function inspect<T>(val: T): string;
|
|
42
42
|
/** Utility function to measure time taken for some operation [ms]. */
|
|
43
43
|
export declare function measure(id: string): () => string;
|
|
44
|
+
/**
|
|
45
|
+
* Format current process memory usage as a human readable string.
|
|
46
|
+
*
|
|
47
|
+
* Returns an empty string in the browser where `process.memoryUsage` is unavailable.
|
|
48
|
+
*
|
|
49
|
+
* `arrayBuffers` should allow tracking WASM memory, since every instance backs its
|
|
50
|
+
* memory with `ArrayBuffer`.
|
|
51
|
+
*/
|
|
52
|
+
export declare function memoryUsage(): string;
|
|
53
|
+
/** Create a stateful memory usage reporter. */
|
|
54
|
+
export declare function memoryTracker(): () => string;
|
|
44
55
|
/** A class that adds `toString` method that prints all properties of an object. */
|
|
45
56
|
export declare abstract class WithDebug {
|
|
46
57
|
toString(): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../../../../packages/core/utils/debug.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,YAExB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,GAAG,cAA6F,CAAC;AAE9G;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CACnB,OAAO,EAAE,oBAAoB,EAC7B,SAAS,EAAE,OAAO,EAClB,GAAG,IAAI,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,SAAS,IAAI,IAAI,CAO3B;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAE/C;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,QAKpE;AAED,6BAA6B;AAC7B,wBAAgB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAEzC;AAkED,sEAAsE;AACtE,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,gBAGjC;AAED,mFAAmF;AACnF,8BAAsB,SAAS;IAC7B,QAAQ;CAGT;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;;EAMpC"}
|
|
1
|
+
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../../../../packages/core/utils/debug.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,YAExB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,GAAG,cAA6F,CAAC;AAE9G;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CACnB,OAAO,EAAE,oBAAoB,EAC7B,SAAS,EAAE,OAAO,EAClB,GAAG,IAAI,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,SAAS,IAAI,IAAI,CAO3B;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAE/C;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,QAKpE;AAED,6BAA6B;AAC7B,wBAAgB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAEzC;AAkED,sEAAsE;AACtE,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,gBAGjC;AAcD;;;;;;;GAOG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAMpC;AAED,+CAA+C;AAC/C,wBAAgB,aAAa,IAAI,MAAM,MAAM,CAc5C;AAED,mFAAmF;AACnF,8BAAsB,SAAS;IAC7B,QAAQ;CAGT;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;;EAMpC"}
|
|
@@ -113,6 +113,46 @@ export function measure(id) {
|
|
|
113
113
|
const start = now();
|
|
114
114
|
return () => `${id} took ${(now() - start).toFixed(2)}ms`;
|
|
115
115
|
}
|
|
116
|
+
const BYTES_IN_MB = 1024 * 1024;
|
|
117
|
+
const toMb = (bytes) => (bytes / BYTES_IN_MB).toFixed(1);
|
|
118
|
+
const signedMb = (bytes) => `${bytes >= 0 ? "+" : "-"}${toMb(bytes)}`;
|
|
119
|
+
/** Raw process memory usage, or `null` in environments without `process` (e.g. browser). */
|
|
120
|
+
function rawMemoryUsage() {
|
|
121
|
+
if (isBrowser() || typeof process.memoryUsage !== "function") {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
return process.memoryUsage();
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Format current process memory usage as a human readable string.
|
|
128
|
+
*
|
|
129
|
+
* Returns an empty string in the browser where `process.memoryUsage` is unavailable.
|
|
130
|
+
*
|
|
131
|
+
* `arrayBuffers` should allow tracking WASM memory, since every instance backs its
|
|
132
|
+
* memory with `ArrayBuffer`.
|
|
133
|
+
*/
|
|
134
|
+
export function memoryUsage() {
|
|
135
|
+
const m = rawMemoryUsage();
|
|
136
|
+
if (m === null) {
|
|
137
|
+
return "";
|
|
138
|
+
}
|
|
139
|
+
return `rss=${toMb(m.rss)}MB heap=${toMb(m.heapUsed)}/${toMb(m.heapTotal)}MB external=${toMb(m.external)}MB arrayBuffers=${toMb(m.arrayBuffers)}MB`;
|
|
140
|
+
}
|
|
141
|
+
/** Create a stateful memory usage reporter. */
|
|
142
|
+
export function memoryTracker() {
|
|
143
|
+
let prev = null;
|
|
144
|
+
return () => {
|
|
145
|
+
const m = rawMemoryUsage();
|
|
146
|
+
if (m === null) {
|
|
147
|
+
return "";
|
|
148
|
+
}
|
|
149
|
+
const delta = prev === null
|
|
150
|
+
? ""
|
|
151
|
+
: ` (Δrss=${signedMb(m.rss - prev.rss)}MB ΔarrayBuffers=${signedMb(m.arrayBuffers - prev.arrayBuffers)}MB)`;
|
|
152
|
+
prev = m;
|
|
153
|
+
return `${memoryUsage()}${delta}`;
|
|
154
|
+
};
|
|
155
|
+
}
|
|
116
156
|
/** A class that adds `toString` method that prints all properties of an object. */
|
|
117
157
|
export class WithDebug {
|
|
118
158
|
toString() {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, it } from "node:test";
|
|
3
|
-
import { check, inspect, lazyInspect } from "./debug.js";
|
|
3
|
+
import { check, inspect, lazyInspect, memoryTracker, memoryUsage } from "./debug.js";
|
|
4
4
|
describe("utils::check", () => {
|
|
5
5
|
it("should do nothing if condition is met", () => {
|
|
6
6
|
check `${true} I shall not fail!`;
|
|
@@ -23,3 +23,24 @@ describe("utils::lazyInspect", () => {
|
|
|
23
23
|
assert.strictEqual(lazyInspectedMap, expected);
|
|
24
24
|
});
|
|
25
25
|
});
|
|
26
|
+
describe("utils::memoryUsage", () => {
|
|
27
|
+
it("should report all memory fields", () => {
|
|
28
|
+
const usage = memoryUsage();
|
|
29
|
+
for (const field of ["rss=", "heap=", "external=", "arrayBuffers="]) {
|
|
30
|
+
assert.ok(usage.includes(field), `expected "${field}" in "${usage}"`);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
describe("utils::memoryTracker", () => {
|
|
35
|
+
it("should not include a delta on the first call", () => {
|
|
36
|
+
const tracker = memoryTracker();
|
|
37
|
+
assert.ok(!tracker().includes("Δrss"));
|
|
38
|
+
});
|
|
39
|
+
it("should include a delta on subsequent calls", () => {
|
|
40
|
+
const tracker = memoryTracker();
|
|
41
|
+
tracker();
|
|
42
|
+
const second = tracker();
|
|
43
|
+
assert.ok(second.includes("Δrss="), `expected delta in "${second}"`);
|
|
44
|
+
assert.ok(second.includes("ΔarrayBuffers="), `expected delta in "${second}"`);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
@@ -42,7 +42,7 @@ export function generateNextServiceId({ serviceId, entropy, timeslot }, chainSpe
|
|
|
42
42
|
timeslot,
|
|
43
43
|
}, chainSpec);
|
|
44
44
|
const result = blake2b.hashBytes(encoded).raw.subarray(0, 4);
|
|
45
|
-
const number = leBytesAsU32(result)
|
|
45
|
+
const number = leBytesAsU32(result);
|
|
46
46
|
const mod = 2 ** 32 - MIN_PUBLIC_SERVICE_INDEX - 2 ** 8;
|
|
47
47
|
return tryAsServiceId((number % mod) + MIN_PUBLIC_SERVICE_INDEX);
|
|
48
48
|
}
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"importer.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/importer/importer.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { tryAsTimeSlot } from "#@typeberry/block";
|
|
|
2
2
|
import { WithHash } from "#@typeberry/hash";
|
|
3
3
|
import { BlockVerifier, BlockVerifierError } from "#@typeberry/transition/block-verifier.js";
|
|
4
4
|
import { DbHeaderChain, OnChain } from "#@typeberry/transition/chain-stf.js";
|
|
5
|
-
import { measure, now, Result, resultToString } from "#@typeberry/utils";
|
|
5
|
+
import { measure, memoryTracker, now, Result, resultToString, } from "#@typeberry/utils";
|
|
6
6
|
import * as metrics from "./metrics.js";
|
|
7
7
|
export var ImporterErrorKind;
|
|
8
8
|
(function (ImporterErrorKind) {
|
|
@@ -19,6 +19,7 @@ export class Importer {
|
|
|
19
19
|
// Hash of the block that we have the posterior state for in `state`.
|
|
20
20
|
currentHash;
|
|
21
21
|
metrics;
|
|
22
|
+
memory = memoryTracker();
|
|
22
23
|
hasher;
|
|
23
24
|
logger;
|
|
24
25
|
blocks;
|
|
@@ -81,6 +82,9 @@ export class Importer {
|
|
|
81
82
|
const startTime = now();
|
|
82
83
|
const maybeBestHeader = await this.importBlockInternal(block);
|
|
83
84
|
const duration = now() - startTime;
|
|
85
|
+
if (timeSlot % 100 === 0) {
|
|
86
|
+
this.logger.info `📊 mem #${timeSlot}: ${this.memory()}`;
|
|
87
|
+
}
|
|
84
88
|
if (maybeBestHeader.isOk) {
|
|
85
89
|
const bestHeader = maybeBestHeader.ok;
|
|
86
90
|
this.logger.info `🧊 Best block: #${timeSlot} (${bestHeader.hash})`;
|