@typeberry/lib 0.5.8 → 0.5.9-5f4bdf7
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/pvm-host-calls/host-calls-executor.js +3 -3
- package/packages/core/utils/debug.d.ts.map +1 -1
- package/packages/core/utils/debug.js +14 -3
- package/packages/jam/database/serialized-states-db.d.ts +1 -0
- package/packages/jam/database/serialized-states-db.d.ts.map +1 -1
- package/packages/jam/database/serialized-states-db.js +3 -0
- package/packages/jam/database/states.d.ts +3 -0
- package/packages/jam/database/states.d.ts.map +1 -1
- package/packages/jam/database/states.js +3 -0
- package/packages/jam/database-lmdb/states.d.ts +1 -0
- package/packages/jam/database-lmdb/states.d.ts.map +1 -1
- package/packages/jam/database-lmdb/states.js +3 -0
- package/packages/jam/in-core/externalities/refine.d.ts +16 -2
- package/packages/jam/in-core/externalities/refine.d.ts.map +1 -1
- package/packages/jam/in-core/externalities/refine.js +20 -5
- package/packages/jam/in-core/externalities/refine.test.d.ts +2 -0
- package/packages/jam/in-core/externalities/refine.test.d.ts.map +1 -0
- package/packages/jam/in-core/externalities/refine.test.js +99 -0
- package/packages/jam/in-core/in-core.d.ts.map +1 -1
- package/packages/jam/in-core/in-core.js +8 -3
- package/packages/jam/node/main-fuzz.d.ts.map +1 -1
- package/packages/jam/node/main-fuzz.js +4 -1
- package/packages/jam/node/main-importer.d.ts +1 -0
- package/packages/jam/node/main-importer.d.ts.map +1 -1
- package/packages/jam/node/main-importer.js +8 -7
- package/packages/jam/node/main.d.ts.map +1 -1
- package/packages/jam/node/main.js +1 -0
- package/packages/workers/block-authorship/main.d.ts.map +1 -1
- package/packages/workers/block-authorship/main.js +26 -0
- package/packages/workers/importer/finality.d.ts +32 -0
- package/packages/workers/importer/finality.d.ts.map +1 -0
- package/packages/workers/importer/finality.js +105 -0
- package/packages/workers/importer/finality.test.d.ts +2 -0
- package/packages/workers/importer/finality.test.d.ts.map +1 -0
- package/packages/workers/importer/finality.test.js +369 -0
- package/packages/workers/importer/importer.d.ts +2 -0
- package/packages/workers/importer/importer.d.ts.map +1 -1
- package/packages/workers/importer/importer.js +8 -0
- package/packages/workers/importer/main.d.ts.map +1 -1
- package/packages/workers/importer/main.js +7 -1
- package/packages/workers/importer/protocol.d.ts +7 -3
- package/packages/workers/importer/protocol.d.ts.map +1 -1
- package/packages/workers/importer/protocol.js +9 -4
package/package.json
CHANGED
|
@@ -52,7 +52,7 @@ export class HostCallsExecutor {
|
|
|
52
52
|
this.ioTracer?.logPanic(pvmInstance.getExitParam() ?? 0, pc, gas, registers);
|
|
53
53
|
return { consumedGas, status: ReturnStatus.PANIC };
|
|
54
54
|
}
|
|
55
|
-
async execute(pvmInstance) {
|
|
55
|
+
async execute(pvmInstance, initialPc) {
|
|
56
56
|
const ioTracker = this.ioTracer?.tracker() ?? null;
|
|
57
57
|
const registers = new HostCallRegisters(pvmInstance.registers.getAllEncoded());
|
|
58
58
|
registers.ioTracker = ioTracker;
|
|
@@ -60,7 +60,7 @@ export class HostCallsExecutor {
|
|
|
60
60
|
memory.ioTracker = ioTracker;
|
|
61
61
|
const gas = pvmInstance.gas;
|
|
62
62
|
// log start of execution (note the PVM initialisation should be logged already)
|
|
63
|
-
this.ioTracer?.logStart(
|
|
63
|
+
this.ioTracer?.logStart(initialPc, pvmInstance.gas.get(), registers);
|
|
64
64
|
for (;;) {
|
|
65
65
|
// execute program as much as we can
|
|
66
66
|
pvmInstance.runProgram();
|
|
@@ -120,7 +120,7 @@ export class HostCallsExecutor {
|
|
|
120
120
|
pvmInstance.resetJam(program, args, initialPc, initialGas);
|
|
121
121
|
try {
|
|
122
122
|
this.ioTracer?.logProgram(program, args);
|
|
123
|
-
return await this.execute(pvmInstance);
|
|
123
|
+
return await this.execute(pvmInstance, initialPc);
|
|
124
124
|
}
|
|
125
125
|
finally {
|
|
126
126
|
this.pvmInstanceManager.releaseInstance(pvmInstance);
|
|
@@ -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,
|
|
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"}
|
|
@@ -55,6 +55,12 @@ export function assertEmpty(value) {
|
|
|
55
55
|
}
|
|
56
56
|
/** Debug print an object. */
|
|
57
57
|
export function inspect(val) {
|
|
58
|
+
return inspectInternal(val, new WeakSet());
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Internal implementation of inspect with circular reference detection.
|
|
62
|
+
*/
|
|
63
|
+
function inspectInternal(val, seen) {
|
|
58
64
|
const nest = (v) => v
|
|
59
65
|
.split("\n")
|
|
60
66
|
.map((x) => ` ${x}`)
|
|
@@ -67,10 +73,10 @@ export function inspect(val) {
|
|
|
67
73
|
return "<undefined>";
|
|
68
74
|
}
|
|
69
75
|
if (Array.isArray(val)) {
|
|
70
|
-
return `[${val.map((x) =>
|
|
76
|
+
return `[${val.map((x) => inspectInternal(x, seen))}]`;
|
|
71
77
|
}
|
|
72
78
|
if (val instanceof Map) {
|
|
73
|
-
return
|
|
79
|
+
return inspectInternal(Array.from(val.entries()), seen);
|
|
74
80
|
}
|
|
75
81
|
if (typeof val === "number") {
|
|
76
82
|
return `${val} (0x${val.toString(16)})`;
|
|
@@ -78,6 +84,11 @@ export function inspect(val) {
|
|
|
78
84
|
if (typeof val !== "object") {
|
|
79
85
|
return `${val}`;
|
|
80
86
|
}
|
|
87
|
+
// Check for circular references
|
|
88
|
+
if (seen.has(val)) {
|
|
89
|
+
return "<circular>";
|
|
90
|
+
}
|
|
91
|
+
seen.add(val);
|
|
81
92
|
if ("toString" in val &&
|
|
82
93
|
Object.prototype.toString !== val.toString &&
|
|
83
94
|
WithDebug.prototype.toString !== val.toString) {
|
|
@@ -90,7 +101,7 @@ export function inspect(val) {
|
|
|
90
101
|
for (const k of keys) {
|
|
91
102
|
if (typeof k === "string") {
|
|
92
103
|
v += oneLine ? "" : "\n ";
|
|
93
|
-
v += `${k}: ${nest(
|
|
104
|
+
v += `${k}: ${nest(inspectInternal(val[k], seen))}`;
|
|
94
105
|
v += oneLine ? "," : "";
|
|
95
106
|
}
|
|
96
107
|
}
|
|
@@ -27,6 +27,7 @@ export declare class InMemorySerializedStates implements StatesDb<SerializedStat
|
|
|
27
27
|
getStateRoot(state: SerializedState<LeafDb>): Promise<StateRootHash>;
|
|
28
28
|
updateAndSetState(header: HeaderHash, state: SerializedState<LeafDb>, update: Partial<State & ServicesUpdate>): Promise<Result<OK, StateUpdateError>>;
|
|
29
29
|
getState(header: HeaderHash): SerializedState<LeafDb> | null;
|
|
30
|
+
markUnused(header: HeaderHash): void;
|
|
30
31
|
close(): Promise<void>;
|
|
31
32
|
}
|
|
32
33
|
//# sourceMappingURL=serialized-states-db.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialized-states-db.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database/serialized-states-db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGlE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EACL,eAAe,EACf,KAAK,YAAY,EAGlB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE5E,qCAAqC;AACrC,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;AAEhG,sCAAsC;AACtC,qBAAa,wBAAyB,YAAW,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC;IAc1G,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAd1B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAyE;IAC5F,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8D;WAE1E,GAAG,CAAC,EAAE,SAAS,EAAE,EAAE;QAAE,SAAS,EAAE,SAAS,CAAA;KAAE;IAKxD,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;QAAE,SAAS,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE;IAIpF,OAAO;IAKD,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAiBxG,YAAY,CAAC,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAIpE,iBAAiB,CACrB,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,EAC9B,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAsBxC,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"serialized-states-db.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database/serialized-states-db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGlE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EACL,eAAe,EACf,KAAK,YAAY,EAGlB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE5E,qCAAqC;AACrC,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;AAEhG,sCAAsC;AACtC,qBAAa,wBAAyB,YAAW,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC;IAc1G,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAd1B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAyE;IAC5F,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8D;WAE1E,GAAG,CAAC,EAAE,SAAS,EAAE,EAAE;QAAE,SAAS,EAAE,SAAS,CAAA;KAAE;IAKxD,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;QAAE,SAAS,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE;IAIpF,OAAO;IAKD,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAiBxG,YAAY,CAAC,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAIpE,iBAAiB,CACrB,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,EAC9B,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAsBxC,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI;IAkB5D,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAI9B,KAAK;CACZ"}
|
|
@@ -33,6 +33,8 @@ export interface StatesDb<T extends State = State> {
|
|
|
33
33
|
updateAndSetState(header: HeaderHash, state: T, update: Partial<State & ServicesUpdate>): Promise<Result<OK, StateUpdateError>>;
|
|
34
34
|
/** Retrieve posterior state of given header. */
|
|
35
35
|
getState(header: HeaderHash): T | null;
|
|
36
|
+
/** Mark state as no longer needed. Backend may remove it asynchronously. */
|
|
37
|
+
markUnused(header: HeaderHash): void;
|
|
36
38
|
/** Close the database and free resources. */
|
|
37
39
|
close(): Promise<void>;
|
|
38
40
|
}
|
|
@@ -46,6 +48,7 @@ export declare class InMemoryStates implements StatesDb<InMemoryState> {
|
|
|
46
48
|
/** Insert a full state into the database. */
|
|
47
49
|
insertInitialState(headerHash: HeaderHash, state: InMemoryState): Promise<Result<OK, StateUpdateError>>;
|
|
48
50
|
getState(headerHash: HeaderHash): InMemoryState | null;
|
|
51
|
+
markUnused(header: HeaderHash): void;
|
|
49
52
|
close(): Promise<void>;
|
|
50
53
|
}
|
|
51
54
|
//# sourceMappingURL=states.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"states.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database/states.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAElE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,KAAK,KAAK,EAAe,MAAM,kBAAkB,CAAC;AAE/F,OAAO,EAAe,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE3D,0DAA0D;AAC1D,oBAAY,gBAAgB;IAC1B,oDAAoD;IACpD,QAAQ,IAAI;IACZ,iDAAiD;IACjD,MAAM,IAAI;CACX;AAED,wFAAwF;AACxF,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,KAAK;IACrC,qEAAqE;IACrE,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;CACpG;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK;IAC/C,4CAA4C;IAC5C,YAAY,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAE/C;;;;OAIG;IACH,iBAAiB,CACf,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEzC,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC;IAEvC,6CAA6C;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,qBAAa,cAAe,YAAW,QAAQ,CAAC,aAAa,CAAC;IAIhD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAmE;IACtF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;gBAEd,IAAI,EAAE,SAAS;IAItC,iBAAiB,CACrB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAgBlC,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAKhE,6CAA6C;IACvC,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAM7G,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"states.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database/states.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAElE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,KAAK,KAAK,EAAe,MAAM,kBAAkB,CAAC;AAE/F,OAAO,EAAe,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE3D,0DAA0D;AAC1D,oBAAY,gBAAgB;IAC1B,oDAAoD;IACpD,QAAQ,IAAI;IACZ,iDAAiD;IACjD,MAAM,IAAI;CACX;AAED,wFAAwF;AACxF,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,KAAK;IACrC,qEAAqE;IACrE,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;CACpG;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK;IAC/C,4CAA4C;IAC5C,YAAY,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAE/C;;;;OAIG;IACH,iBAAiB,CACf,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEzC,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC;IAEvC,4EAA4E;IAC5E,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAErC,6CAA6C;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,qBAAa,cAAe,YAAW,QAAQ,CAAC,aAAa,CAAC;IAIhD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAmE;IACtF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;gBAEd,IAAI,EAAE,SAAS;IAItC,iBAAiB,CACrB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAgBlC,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAKhE,6CAA6C;IACvC,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAM7G,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI;IAStD,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAI9B,KAAK;CACZ"}
|
|
@@ -67,6 +67,7 @@ export declare class LmdbStates implements StatesDb<SerializedState<LeafDb>>, In
|
|
|
67
67
|
updateAndSetState(headerHash: HeaderHash, state: SerializedState<LeafDb>, update: Partial<State & ServicesUpdate>): Promise<Result<OK, StateUpdateError>>;
|
|
68
68
|
getStateRoot(state: SerializedState<LeafDb>): Promise<StateRootHash>;
|
|
69
69
|
getState(root: HeaderHash): SerializedState<LeafDb> | null;
|
|
70
|
+
markUnused(header: HeaderHash): void;
|
|
70
71
|
close(): Promise<void>;
|
|
71
72
|
}
|
|
72
73
|
//# sourceMappingURL=states.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"states.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-lmdb/states.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGlE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,EAAE,KAAK,QAAQ,EAAE,gBAAgB,EAAe,MAAM,qBAAqB,CAAC;AAC9G,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,iBAAiB,CAAC;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAgD,MAAM,gCAAgC,CAAC;AAG/G,OAAO,EAAE,EAAE,EAAE,MAAM,EAAkB,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAS,MAAM,WAAW,CAAC;AAGjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,qBAAa,UAAW,YAAW,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC;IAK5F,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IANvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;gBAGZ,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,QAAQ;IAM3B,kBAAkB,CACtB,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,YAAY,GAC5B,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;YAQ1B,eAAe;IA0BvB,iBAAiB,CACrB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,EAC9B,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAWlC,YAAY,CAAC,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAI1E,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"states.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-lmdb/states.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGlE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,EAAE,KAAK,QAAQ,EAAE,gBAAgB,EAAe,MAAM,qBAAqB,CAAC;AAC9G,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,iBAAiB,CAAC;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAgD,MAAM,gCAAgC,CAAC;AAG/G,OAAO,EAAE,EAAE,EAAE,MAAM,EAAkB,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAS,MAAM,WAAW,CAAC;AAGjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,qBAAa,UAAW,YAAW,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC;IAK5F,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IANvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;gBAGZ,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,QAAQ;IAM3B,kBAAkB,CACtB,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,YAAY,GAC5B,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;YAQ1B,eAAe;IA0BvB,iBAAiB,CACrB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,EAC9B,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAWlC,YAAY,CAAC,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAI1E,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI;IAsB1D,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAI9B,KAAK;CAGZ"}
|
|
@@ -125,6 +125,9 @@ export class LmdbStates {
|
|
|
125
125
|
}
|
|
126
126
|
return SerializedState.new(this.spec, this.blake2b, leafDbResult.ok);
|
|
127
127
|
}
|
|
128
|
+
markUnused(header) {
|
|
129
|
+
this.states.remove(header.raw);
|
|
130
|
+
}
|
|
128
131
|
async close() {
|
|
129
132
|
await Promise.all([this.states.close(), this.values.close()]);
|
|
130
133
|
}
|
|
@@ -6,9 +6,23 @@ import type { U64 } from "#@typeberry/numbers";
|
|
|
6
6
|
import type { HostCallMemory, HostCallRegisters } from "#@typeberry/pvm-host-calls";
|
|
7
7
|
import type { BigGas } from "#@typeberry/pvm-interface";
|
|
8
8
|
import type { ProgramDecoderError } from "#@typeberry/pvm-interpreter";
|
|
9
|
+
import type { State } from "#@typeberry/state";
|
|
9
10
|
import type { OK, Result } from "#@typeberry/utils";
|
|
11
|
+
/**
|
|
12
|
+
* Parameters required to create a RefineExternalitiesImpl.
|
|
13
|
+
*/
|
|
14
|
+
export type RefineExternalitiesParams = {
|
|
15
|
+
/** The service currently being refined. */
|
|
16
|
+
currentServiceId: ServiceId;
|
|
17
|
+
/** State at the lookup anchor block, used for historical preimage lookups. */
|
|
18
|
+
lookupState: State;
|
|
19
|
+
};
|
|
10
20
|
export declare class RefineExternalitiesImpl implements RefineExternalities {
|
|
11
|
-
|
|
21
|
+
/** Service being refined (used as default for historicalLookup). */
|
|
22
|
+
private readonly currentServiceId;
|
|
23
|
+
/** State at the lookup anchor for preimage lookups. */
|
|
24
|
+
private readonly lookupState;
|
|
25
|
+
static create(params: RefineExternalitiesParams): RefineExternalitiesImpl;
|
|
12
26
|
private constructor();
|
|
13
27
|
machineExpunge(_machineIndex: MachineId): Promise<Result<ProgramCounter, NoMachineError>>;
|
|
14
28
|
machinePages(_machineIndex: MachineId, _pageStart: U64, _pageCount: U64, _requestType: MemoryOperation | null): Promise<Result<OK, PagesError>>;
|
|
@@ -19,6 +33,6 @@ export declare class RefineExternalitiesImpl implements RefineExternalities {
|
|
|
19
33
|
machineInit(_code: BytesBlob, _programCounter: ProgramCounter): Promise<Result<MachineId, ProgramDecoderError>>;
|
|
20
34
|
machineInvoke(_machineIndex: MachineId, _gas: BigGas, _registers: HostCallRegisters): Promise<Result<MachineResult, NoMachineError>>;
|
|
21
35
|
exportSegment(_segment: Segment): Result<SegmentIndex, SegmentExportError>;
|
|
22
|
-
historicalLookup(
|
|
36
|
+
historicalLookup(serviceId: ServiceId | null, hash: Blake2bHash): Promise<BytesBlob | null>;
|
|
23
37
|
}
|
|
24
38
|
//# sourceMappingURL=refine.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refine.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/in-core/externalities/refine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EACV,SAAS,EACT,aAAa,EACb,eAAe,EACf,cAAc,EACd,UAAU,EACV,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACd,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEnD,qBAAa,uBAAwB,YAAW,mBAAmB;IACjE,MAAM,CAAC,MAAM;
|
|
1
|
+
{"version":3,"file":"refine.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/in-core/externalities/refine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
export class RefineExternalitiesImpl {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
/** Service being refined (used as default for historicalLookup). */
|
|
3
|
+
currentServiceId;
|
|
4
|
+
/** State at the lookup anchor for preimage lookups. */
|
|
5
|
+
lookupState;
|
|
6
|
+
static create(params) {
|
|
7
|
+
return new RefineExternalitiesImpl(params);
|
|
8
|
+
}
|
|
9
|
+
constructor(params) {
|
|
10
|
+
this.currentServiceId = params.currentServiceId;
|
|
11
|
+
this.lookupState = params.lookupState;
|
|
4
12
|
}
|
|
5
|
-
constructor() { }
|
|
6
13
|
machineExpunge(_machineIndex) {
|
|
7
14
|
throw new Error("Method not implemented.");
|
|
8
15
|
}
|
|
@@ -30,7 +37,15 @@ export class RefineExternalitiesImpl {
|
|
|
30
37
|
exportSegment(_segment) {
|
|
31
38
|
throw new Error("Method not implemented.");
|
|
32
39
|
}
|
|
33
|
-
historicalLookup(
|
|
34
|
-
|
|
40
|
+
historicalLookup(serviceId, hash) {
|
|
41
|
+
// https://graypaper.fluffylabs.dev/#/ab2cdbd/33d70133f901?v=0.7.2
|
|
42
|
+
const sid = serviceId ?? this.currentServiceId;
|
|
43
|
+
const service = this.lookupState.getService(sid);
|
|
44
|
+
// https://graypaper.fluffylabs.dev/#/ab2cdbd/334802334802?v=0.7.2
|
|
45
|
+
if (service === null) {
|
|
46
|
+
return Promise.resolve(null);
|
|
47
|
+
}
|
|
48
|
+
// https://graypaper.fluffylabs.dev/#/ab2cdbd/334f02334f02?v=0.7.2
|
|
49
|
+
return Promise.resolve(service.getPreimage(hash.asOpaque()));
|
|
35
50
|
}
|
|
36
51
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refine.test.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/in-core/externalities/refine.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { describe, it } from "node:test";
|
|
3
|
+
import { 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 { tryAsU32, tryAsU64 } from "#@typeberry/numbers";
|
|
9
|
+
import { InMemoryService, InMemoryState, PreimageItem, ServiceAccountInfo } from "#@typeberry/state";
|
|
10
|
+
import { RefineExternalitiesImpl } from "./refine.js";
|
|
11
|
+
/**
|
|
12
|
+
* Create a mock State that has specified services with preimages.
|
|
13
|
+
*/
|
|
14
|
+
function createMockState(services) {
|
|
15
|
+
const serviceMap = new Map();
|
|
16
|
+
for (const svc of services) {
|
|
17
|
+
const preimages = HashDictionary.new();
|
|
18
|
+
for (const p of svc.preimages ?? []) {
|
|
19
|
+
const hash = Bytes.parseBytes(p.hash, HASH_SIZE).asOpaque();
|
|
20
|
+
const item = PreimageItem.create({
|
|
21
|
+
hash,
|
|
22
|
+
blob: BytesBlob.parseBlob(p.blob),
|
|
23
|
+
});
|
|
24
|
+
preimages.set(hash, item);
|
|
25
|
+
}
|
|
26
|
+
const serviceId = tryAsServiceId(svc.id);
|
|
27
|
+
serviceMap.set(serviceId, new InMemoryService(serviceId, {
|
|
28
|
+
info: ServiceAccountInfo.create({
|
|
29
|
+
codeHash: Bytes.zero(HASH_SIZE).asOpaque(),
|
|
30
|
+
balance: tryAsU64(1000000000n),
|
|
31
|
+
accumulateMinGas: tryAsServiceGas(100),
|
|
32
|
+
onTransferMinGas: tryAsServiceGas(100),
|
|
33
|
+
storageUtilisationBytes: tryAsU64(0),
|
|
34
|
+
storageUtilisationCount: tryAsU32(0),
|
|
35
|
+
gratisStorage: tryAsU64(0),
|
|
36
|
+
created: tryAsTimeSlot(0),
|
|
37
|
+
lastAccumulation: tryAsTimeSlot(0),
|
|
38
|
+
parentService: tryAsServiceId(0),
|
|
39
|
+
}),
|
|
40
|
+
preimages,
|
|
41
|
+
lookupHistory: HashDictionary.new(),
|
|
42
|
+
storage: new Map(),
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
return InMemoryState.partial(tinyChainSpec, { services: serviceMap });
|
|
46
|
+
}
|
|
47
|
+
function createExt(overrides = {}) {
|
|
48
|
+
const defaultState = createMockState([]);
|
|
49
|
+
return RefineExternalitiesImpl.create({
|
|
50
|
+
currentServiceId: tryAsServiceId(42),
|
|
51
|
+
lookupState: overrides.lookupState ?? defaultState,
|
|
52
|
+
...overrides,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
describe("RefineExternalitiesImpl", () => {
|
|
56
|
+
describe("historicalLookup", () => {
|
|
57
|
+
const PREIMAGE_HASH = "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
|
|
58
|
+
const PREIMAGE_DATA = "0xdeadbeef";
|
|
59
|
+
it("should return preimage data for existing service and hash", async () => {
|
|
60
|
+
const lookupState = createMockState([{ id: 42, preimages: [{ hash: PREIMAGE_HASH, blob: PREIMAGE_DATA }] }]);
|
|
61
|
+
const ext = createExt({ lookupState });
|
|
62
|
+
const hash = Bytes.parseBytes(PREIMAGE_HASH, HASH_SIZE).asOpaque();
|
|
63
|
+
const result = await ext.historicalLookup(tryAsServiceId(42), hash);
|
|
64
|
+
assert.strictEqual(result?.toString(), BytesBlob.parseBlob(PREIMAGE_DATA).toString());
|
|
65
|
+
});
|
|
66
|
+
it("should use currentServiceId when serviceId is null", async () => {
|
|
67
|
+
const lookupState = createMockState([{ id: 42, preimages: [{ hash: PREIMAGE_HASH, blob: PREIMAGE_DATA }] }]);
|
|
68
|
+
const ext = createExt({ lookupState });
|
|
69
|
+
const hash = Bytes.parseBytes(PREIMAGE_HASH, HASH_SIZE).asOpaque();
|
|
70
|
+
const result = await ext.historicalLookup(null, hash);
|
|
71
|
+
assert.notStrictEqual(result, null);
|
|
72
|
+
});
|
|
73
|
+
it("should return null for non-existent service", async () => {
|
|
74
|
+
const ext = createExt();
|
|
75
|
+
const hash = Bytes.parseBytes(PREIMAGE_HASH, HASH_SIZE).asOpaque();
|
|
76
|
+
const result = await ext.historicalLookup(tryAsServiceId(999), hash);
|
|
77
|
+
assert.strictEqual(result, null);
|
|
78
|
+
});
|
|
79
|
+
it("should return null for non-existent preimage hash", async () => {
|
|
80
|
+
const lookupState = createMockState([{ id: 42 }]);
|
|
81
|
+
const ext = createExt({ lookupState });
|
|
82
|
+
const hash = Bytes.parseBytes(PREIMAGE_HASH, HASH_SIZE).asOpaque();
|
|
83
|
+
const result = await ext.historicalLookup(tryAsServiceId(42), hash);
|
|
84
|
+
assert.strictEqual(result, null);
|
|
85
|
+
});
|
|
86
|
+
it("should look up from the correct service when multiple exist", async () => {
|
|
87
|
+
const lookupState = createMockState([
|
|
88
|
+
{ id: 1, preimages: [{ hash: PREIMAGE_HASH, blob: "0x01" }] },
|
|
89
|
+
{ id: 2, preimages: [{ hash: PREIMAGE_HASH, blob: "0x02" }] },
|
|
90
|
+
]);
|
|
91
|
+
const ext = createExt({ lookupState });
|
|
92
|
+
const hash = Bytes.parseBytes(PREIMAGE_HASH, HASH_SIZE).asOpaque();
|
|
93
|
+
const r1 = await ext.historicalLookup(tryAsServiceId(1), hash);
|
|
94
|
+
const r2 = await ext.historicalLookup(tryAsServiceId(2), hash);
|
|
95
|
+
assert.strictEqual(r1?.raw[0], 0x01);
|
|
96
|
+
assert.strictEqual(r2?.raw[0], 0x02);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
});
|
|
@@ -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;
|
|
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;IAqE7C,OAAO,CAAC,oBAAoB;YAuDd,gBAAgB;YAkBhB,UAAU;IAmGxB,iBAAiB,CAAC,UAAU,EAAE,WAAW,CAAC,UAAU,CAAC;IAiBrD,OAAO,CAAC,cAAc;IAyCtB,OAAO,CAAC,yBAAyB;CAyBlC"}
|
|
@@ -105,7 +105,7 @@ export class InCore {
|
|
|
105
105
|
const refineResults = [];
|
|
106
106
|
for (const [idx, item] of items.entries()) {
|
|
107
107
|
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));
|
|
108
|
+
refineResults.push(await this.refineItem(state, lookupState, idx, item, imports, extrinsics, core, workPackageHash));
|
|
109
109
|
}
|
|
110
110
|
// amalgamate the work report now
|
|
111
111
|
return Result.ok(this.amalgamateWorkReport(asKnownSize(refineResults), authResult.ok, workPackageHash, context, core));
|
|
@@ -164,7 +164,7 @@ export class InCore {
|
|
|
164
164
|
authorizationOutput,
|
|
165
165
|
});
|
|
166
166
|
}
|
|
167
|
-
async refineItem(state, idx, item, allImports, allExtrinsics, coreIndex, workPackageHash) {
|
|
167
|
+
async refineItem(state, lookupState, idx, item, allImports, allExtrinsics, coreIndex, workPackageHash) {
|
|
168
168
|
const payloadHash = this.blake2b.hashBytes(item.payload);
|
|
169
169
|
const baseResult = {
|
|
170
170
|
serviceId: item.service,
|
|
@@ -202,6 +202,8 @@ export class InCore {
|
|
|
202
202
|
payload: item.payload,
|
|
203
203
|
imports: allImports,
|
|
204
204
|
extrinsics: allExtrinsics,
|
|
205
|
+
currentServiceId: item.service,
|
|
206
|
+
lookupState,
|
|
205
207
|
});
|
|
206
208
|
const executor = await PvmExecutor.createRefineExecutor(item.service, code, externalities, this.pvmBackend);
|
|
207
209
|
const args = Encoder.encodeObject(ARGS_CODEC, {
|
|
@@ -285,7 +287,10 @@ export class InCore {
|
|
|
285
287
|
entropy: undefined,
|
|
286
288
|
...args,
|
|
287
289
|
}, this.chainSpec);
|
|
288
|
-
const refine = RefineExternalitiesImpl.create(
|
|
290
|
+
const refine = RefineExternalitiesImpl.create({
|
|
291
|
+
currentServiceId: args.currentServiceId,
|
|
292
|
+
lookupState: args.lookupState,
|
|
293
|
+
});
|
|
289
294
|
return {
|
|
290
295
|
fetchExternalities,
|
|
291
296
|
refine,
|
|
@@ -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,
|
|
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,uBAuExF"}
|
|
@@ -66,7 +66,10 @@ export async function mainFuzz(fuzzConfig, withRelPath) {
|
|
|
66
66
|
},
|
|
67
67
|
ancestry,
|
|
68
68
|
network: null,
|
|
69
|
-
}, withRelPath, {
|
|
69
|
+
}, withRelPath, {
|
|
70
|
+
initGenesisFromAncestry: fuzzConfig.initGenesisFromAncestry,
|
|
71
|
+
dummyFinalityDepth: 10_000,
|
|
72
|
+
});
|
|
70
73
|
runningNode = newNode;
|
|
71
74
|
return await newNode.getBestStateRootHash();
|
|
72
75
|
},
|
|
@@ -2,6 +2,7 @@ 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;
|
|
5
6
|
};
|
|
6
7
|
export declare function mainImporter(config: JamConfig, withRelPath: (v: string) => string, options?: ImporterOptions): Promise<NodeApi>;
|
|
7
8
|
//# 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":"
|
|
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;CAC7B,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"}
|
|
@@ -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,23 @@ 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
|
+
});
|
|
21
26
|
const workerConfig = config.node.databaseBasePath === undefined
|
|
22
27
|
? InMemWorkerConfig.new({
|
|
23
28
|
nodeName,
|
|
24
29
|
chainSpec,
|
|
25
30
|
blake2b,
|
|
26
|
-
workerParams
|
|
27
|
-
pvm: config.pvmBackend,
|
|
28
|
-
},
|
|
31
|
+
workerParams,
|
|
29
32
|
})
|
|
30
33
|
: LmdbWorkerConfig.new({
|
|
31
34
|
nodeName,
|
|
32
35
|
chainSpec,
|
|
33
36
|
blake2b,
|
|
34
37
|
dbPath,
|
|
35
|
-
workerParams
|
|
36
|
-
pvm: config.pvmBackend,
|
|
37
|
-
},
|
|
38
|
+
workerParams,
|
|
38
39
|
});
|
|
39
40
|
// Initialize the database with genesis state and block if there isn't one.
|
|
40
41
|
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,
|
|
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,CAwKlB"}
|
|
@@ -34,6 +34,7 @@ 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),
|
|
37
38
|
}),
|
|
38
39
|
};
|
|
39
40
|
const importerConfig = isInMemory
|
|
@@ -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":"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"}
|