@typeberry/lib 0.11.0-6310ba4 → 0.11.0-9d838d3
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 -3
- package/packages/jam/config-node/node-config.d.ts +1 -11
- package/packages/jam/config-node/node-config.d.ts.map +1 -1
- package/packages/jam/config-node/node-config.js +3 -25
- package/packages/jam/config-node/node-config.test.js +3 -7
- package/packages/jam/database/states.d.ts +1 -8
- package/packages/jam/database/states.d.ts.map +1 -1
- package/packages/jam/database/value-refs.d.ts +4 -5
- package/packages/jam/database/value-refs.d.ts.map +1 -1
- package/packages/jam/database-fjall/blocks.d.ts +1 -0
- package/packages/jam/database-fjall/blocks.d.ts.map +1 -1
- package/packages/jam/database-fjall/blocks.js +8 -3
- package/packages/jam/database-fjall/hybrid-states.d.ts +10 -4
- package/packages/jam/database-fjall/hybrid-states.d.ts.map +1 -1
- package/packages/jam/database-fjall/hybrid-states.js +22 -6
- package/packages/jam/database-fjall/root.d.ts +2 -0
- package/packages/jam/database-fjall/root.d.ts.map +1 -1
- package/packages/jam/database-fjall/root.js +8 -1
- package/packages/jam/database-fjall/root.test.d.ts +2 -0
- package/packages/jam/database-fjall/root.test.d.ts.map +1 -0
- package/packages/jam/database-fjall/root.test.js +23 -0
- package/packages/jam/database-fjall/states.d.ts +1 -0
- package/packages/jam/database-fjall/states.d.ts.map +1 -1
- package/packages/jam/database-fjall/states.js +6 -3
- package/packages/jam/node/export.d.ts.map +1 -1
- package/packages/jam/node/export.js +8 -17
- package/packages/jam/node/main-fuzz.d.ts.map +1 -1
- package/packages/jam/node/main-fuzz.js +64 -46
- package/packages/jam/node/main-importer.d.ts +6 -11
- package/packages/jam/node/main-importer.d.ts.map +1 -1
- package/packages/jam/node/main-importer.js +14 -28
- package/packages/jam/node/main.d.ts.map +1 -1
- package/packages/jam/node/main.js +6 -16
- package/packages/jam/rpc/test/e2e-server.d.ts.map +1 -1
- package/packages/jam/rpc/test/e2e-server.js +3 -5
- package/packages/jam/rpc/test/e2e.js +1 -1
- package/packages/jam/state-merkleization/index.d.ts +1 -1
- package/packages/jam/state-merkleization/index.js +1 -1
- package/packages/workers/api-node/config.d.ts +14 -46
- package/packages/workers/api-node/config.d.ts.map +1 -1
- package/packages/workers/api-node/config.js +31 -96
- package/packages/workers/api-node/config.test.js +82 -63
- package/packages/jam/database-lmdb/blocks.d.ts +0 -24
- package/packages/jam/database-lmdb/blocks.d.ts.map +0 -1
- package/packages/jam/database-lmdb/blocks.js +0 -82
- package/packages/jam/database-lmdb/hybrid-states.d.ts +0 -56
- package/packages/jam/database-lmdb/hybrid-states.d.ts.map +0 -1
- package/packages/jam/database-lmdb/hybrid-states.js +0 -149
- package/packages/jam/database-lmdb/hybrid-states.test.d.ts +0 -2
- package/packages/jam/database-lmdb/hybrid-states.test.d.ts.map +0 -1
- package/packages/jam/database-lmdb/hybrid-states.test.js +0 -180
- package/packages/jam/database-lmdb/index.d.ts +0 -5
- package/packages/jam/database-lmdb/index.d.ts.map +0 -1
- package/packages/jam/database-lmdb/index.js +0 -4
- package/packages/jam/database-lmdb/root.d.ts +0 -26
- package/packages/jam/database-lmdb/root.d.ts.map +0 -1
- package/packages/jam/database-lmdb/root.js +0 -53
- package/packages/jam/database-lmdb/states.d.ts +0 -76
- package/packages/jam/database-lmdb/states.d.ts.map +0 -1
- package/packages/jam/database-lmdb/states.js +0 -145
- package/packages/jam/database-lmdb/states.test.d.ts +0 -2
- package/packages/jam/database-lmdb/states.test.d.ts.map +0 -1
- package/packages/jam/database-lmdb/states.test.js +0 -202
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@typeberry/lib",
|
|
3
|
-
"version": "0.11.0-
|
|
3
|
+
"version": "0.11.0-9d838d3",
|
|
4
4
|
"description": "Typeberry Library",
|
|
5
5
|
"main": "./bin/lib/index.js",
|
|
6
6
|
"types": "./bin/lib/index.d.ts",
|
|
@@ -214,8 +214,6 @@
|
|
|
214
214
|
"#@typeberry/database/*": "./packages/jam/database/*",
|
|
215
215
|
"#@typeberry/database-fjall": "./packages/jam/database-fjall/index.js",
|
|
216
216
|
"#@typeberry/database-fjall/*": "./packages/jam/database-fjall/*",
|
|
217
|
-
"#@typeberry/database-lmdb": "./packages/jam/database-lmdb/index.js",
|
|
218
|
-
"#@typeberry/database-lmdb/*": "./packages/jam/database-lmdb/*",
|
|
219
217
|
"#@typeberry/executor": "./packages/jam/executor/index.js",
|
|
220
218
|
"#@typeberry/executor/*": "./packages/jam/executor/*",
|
|
221
219
|
"#@typeberry/fuzz-proto": "./packages/jam/fuzz-proto/index.js",
|
|
@@ -20,21 +20,13 @@ export declare enum KnownChainSpec {
|
|
|
20
20
|
/** Full chain spec. */
|
|
21
21
|
Full = "full"
|
|
22
22
|
}
|
|
23
|
-
/** Persistent regular-node database backend. */
|
|
24
|
-
export declare enum RegularStateBackend {
|
|
25
|
-
/** @deprecated lmdb remains available as an explicit fallback, but fjall is the default backend. */
|
|
26
|
-
Lmdb = "lmdb",
|
|
27
|
-
Fjall = "fjall"
|
|
28
|
-
}
|
|
29
23
|
export declare const knownChainSpecFromJson: FromJson<KnownChainSpec>;
|
|
30
|
-
export declare const regularStateBackendFromJson: FromJson<RegularStateBackend>;
|
|
31
24
|
type NodeConfigurationJson = {
|
|
32
25
|
$schema: string;
|
|
33
26
|
version: number;
|
|
34
27
|
flavor: KnownChainSpec;
|
|
35
28
|
chain_spec: JipChainSpec;
|
|
36
29
|
database_base_path?: string;
|
|
37
|
-
state_backend?: RegularStateBackend;
|
|
38
30
|
authorship: AuthorshipOptions;
|
|
39
31
|
rpc?: RpcOptions;
|
|
40
32
|
};
|
|
@@ -45,13 +37,11 @@ export declare class NodeConfiguration {
|
|
|
45
37
|
readonly chainSpec: JipChainSpec;
|
|
46
38
|
/** If database path is not provided, we load an in-memory db. */
|
|
47
39
|
readonly databaseBasePath: string | undefined;
|
|
48
|
-
/** Persistent database backend used when `databaseBasePath` is set. */
|
|
49
|
-
readonly stateBackend: RegularStateBackend;
|
|
50
40
|
readonly authorship: AuthorshipOptions;
|
|
51
41
|
/** Optional RPC server configuration. When present, an in-process RPC server is started. */
|
|
52
42
|
readonly rpc: RpcOptions | undefined;
|
|
53
43
|
static fromJson: import("@typeberry/json-parser").FromJsonWithParser<unknown, NodeConfiguration>;
|
|
54
|
-
static new({ $schema, version, flavor, chain_spec, database_base_path,
|
|
44
|
+
static new({ $schema, version, flavor, chain_spec, database_base_path, authorship, rpc }: NodeConfigurationJson): NodeConfiguration;
|
|
55
45
|
private constructor();
|
|
56
46
|
}
|
|
57
47
|
export declare function loadConfig(config: string[], withRelPath: (p: string) => string): NodeConfiguration;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-config.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/config-node/node-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,KAAK,QAAQ,EAAuB,MAAM,wBAAwB,CAAC;AAG5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAItC,+DAA+D;AAC/D,eAAO,MAAM,eAAe,QAAQ,CAAC;AACrC,eAAO,MAAM,eAAe,aAAa,CAAC;AAE1C,2BAA2B;AAC3B,eAAO,MAAM,cAAc,YAAY,CAAC;AAExC,eAAO,MAAM,aAAa;;;;CAIzB,CAAC;AAEF,0BAA0B;AAC1B,oBAAY,cAAc;IACxB,uBAAuB;IACvB,IAAI,SAAS;IACb,uBAAuB;IACvB,IAAI,SAAS;CACd;AAED,
|
|
1
|
+
{"version":3,"file":"node-config.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/config-node/node-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,KAAK,QAAQ,EAAuB,MAAM,wBAAwB,CAAC;AAG5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAItC,+DAA+D;AAC/D,eAAO,MAAM,eAAe,QAAQ,CAAC;AACrC,eAAO,MAAM,eAAe,aAAa,CAAC;AAE1C,2BAA2B;AAC3B,eAAO,MAAM,cAAc,YAAY,CAAC;AAExC,eAAO,MAAM,aAAa;;;;CAIzB,CAAC;AAEF,0BAA0B;AAC1B,oBAAY,cAAc;IACxB,uBAAuB;IACvB,IAAI,SAAS;IACb,uBAAuB;IACvB,IAAI,SAAS;CACd;AAED,eAAO,MAAM,sBAAsB,EAS7B,QAAQ,CAAC,cAAc,CAAC,CAAC;AAE/B,KAAK,qBAAqB,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,YAAY,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,GAAG,CAAC,EAAE,UAAU,CAAC;CAClB,CAAC;AAEF,qBAAa,iBAAiB;aA8BV,OAAO,EAAE,MAAM;aACf,OAAO,EAAE,MAAM;aACf,MAAM,EAAE,cAAc;aACtB,SAAS,EAAE,YAAY;IACvC,iEAAiE;aACjD,gBAAgB,EAAE,MAAM,GAAG,SAAS;aACpC,UAAU,EAAE,iBAAiB;IAC7C,4FAA4F;aAC5E,GAAG,EAAE,UAAU,GAAG,SAAS;IArC7C,MAAM,CAAC,QAAQ,kFAWb;IAEF,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,qBAAqB;IAe/G,OAAO;CAWR;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,iBAAiB,CAuDlG"}
|
|
@@ -27,13 +27,6 @@ export var KnownChainSpec;
|
|
|
27
27
|
/** Full chain spec. */
|
|
28
28
|
KnownChainSpec["Full"] = "full";
|
|
29
29
|
})(KnownChainSpec || (KnownChainSpec = {}));
|
|
30
|
-
/** Persistent regular-node database backend. */
|
|
31
|
-
export var RegularStateBackend;
|
|
32
|
-
(function (RegularStateBackend) {
|
|
33
|
-
/** @deprecated lmdb remains available as an explicit fallback, but fjall is the default backend. */
|
|
34
|
-
RegularStateBackend["Lmdb"] = "lmdb";
|
|
35
|
-
RegularStateBackend["Fjall"] = "fjall";
|
|
36
|
-
})(RegularStateBackend || (RegularStateBackend = {}));
|
|
37
30
|
export const knownChainSpecFromJson = json.fromString((input, ctx) => {
|
|
38
31
|
switch (input) {
|
|
39
32
|
case KnownChainSpec.Tiny:
|
|
@@ -44,23 +37,12 @@ export const knownChainSpecFromJson = json.fromString((input, ctx) => {
|
|
|
44
37
|
throw Error(`unknown network flavor: ${input} at ${ctx}`);
|
|
45
38
|
}
|
|
46
39
|
});
|
|
47
|
-
export const regularStateBackendFromJson = json.fromString((input, ctx) => {
|
|
48
|
-
switch (input) {
|
|
49
|
-
case RegularStateBackend.Lmdb:
|
|
50
|
-
return RegularStateBackend.Lmdb;
|
|
51
|
-
case RegularStateBackend.Fjall:
|
|
52
|
-
return RegularStateBackend.Fjall;
|
|
53
|
-
default:
|
|
54
|
-
throw Error(`unknown state backend: ${input} at ${ctx}`);
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
40
|
export class NodeConfiguration {
|
|
58
41
|
$schema;
|
|
59
42
|
version;
|
|
60
43
|
flavor;
|
|
61
44
|
chainSpec;
|
|
62
45
|
databaseBasePath;
|
|
63
|
-
stateBackend;
|
|
64
46
|
authorship;
|
|
65
47
|
rpc;
|
|
66
48
|
static fromJson = json.object({
|
|
@@ -69,21 +51,18 @@ export class NodeConfiguration {
|
|
|
69
51
|
flavor: knownChainSpecFromJson,
|
|
70
52
|
chain_spec: JipChainSpec.fromJson,
|
|
71
53
|
database_base_path: json.optional("string"),
|
|
72
|
-
state_backend: json.optional(regularStateBackendFromJson),
|
|
73
54
|
authorship: AuthorshipOptions.fromJson,
|
|
74
55
|
rpc: json.optional(RpcOptions.fromJson),
|
|
75
56
|
}, NodeConfiguration.new);
|
|
76
|
-
static new({ $schema, version, flavor, chain_spec, database_base_path,
|
|
57
|
+
static new({ $schema, version, flavor, chain_spec, database_base_path, authorship, rpc }) {
|
|
77
58
|
if (version !== 1) {
|
|
78
59
|
throw new Error("Only version=1 config is supported.");
|
|
79
60
|
}
|
|
80
|
-
return new NodeConfiguration($schema, version, flavor, chain_spec, database_base_path ?? undefined,
|
|
61
|
+
return new NodeConfiguration($schema, version, flavor, chain_spec, database_base_path ?? undefined, authorship, rpc ?? undefined);
|
|
81
62
|
}
|
|
82
63
|
constructor($schema, version, flavor, chainSpec,
|
|
83
64
|
/** If database path is not provided, we load an in-memory db. */
|
|
84
|
-
databaseBasePath,
|
|
85
|
-
/** Persistent database backend used when `databaseBasePath` is set. */
|
|
86
|
-
stateBackend, authorship,
|
|
65
|
+
databaseBasePath, authorship,
|
|
87
66
|
/** Optional RPC server configuration. When present, an in-process RPC server is started. */
|
|
88
67
|
rpc) {
|
|
89
68
|
this.$schema = $schema;
|
|
@@ -91,7 +70,6 @@ export class NodeConfiguration {
|
|
|
91
70
|
this.flavor = flavor;
|
|
92
71
|
this.chainSpec = chainSpec;
|
|
93
72
|
this.databaseBasePath = databaseBasePath;
|
|
94
|
-
this.stateBackend = stateBackend;
|
|
95
73
|
this.authorship = authorship;
|
|
96
74
|
this.rpc = rpc;
|
|
97
75
|
}
|
|
@@ -5,7 +5,7 @@ import { configs } from "#@typeberry/configs";
|
|
|
5
5
|
import polkajamConfig from "#@typeberry/configs/typeberry-polkajam-dev.json" with { type: "json" };
|
|
6
6
|
import { parseFromJson } from "#@typeberry/json-parser";
|
|
7
7
|
import { workspacePathFix } from "#@typeberry/utils";
|
|
8
|
-
import { KnownChainSpec, loadConfig, NodeConfiguration
|
|
8
|
+
import { KnownChainSpec, loadConfig, NodeConfiguration } from "./node-config.js";
|
|
9
9
|
import { RpcOptions } from "./rpc.js";
|
|
10
10
|
const withRelPath = workspacePathFix(`${import.meta.dirname}/../..`);
|
|
11
11
|
const NODE_CONFIG_TEST = {
|
|
@@ -41,9 +41,6 @@ describe("Importing Node Configuration", () => {
|
|
|
41
41
|
it("should read the database base path", () => {
|
|
42
42
|
assert.deepStrictEqual(config.databaseBasePath, "/tmp/jam-node-db");
|
|
43
43
|
});
|
|
44
|
-
it("defaults to the fjall state backend", () => {
|
|
45
|
-
assert.deepStrictEqual(config.stateBackend, RegularStateBackend.Fjall);
|
|
46
|
-
});
|
|
47
44
|
it("defaults to no rpc config", () => {
|
|
48
45
|
assert.deepStrictEqual(config.rpc, undefined);
|
|
49
46
|
});
|
|
@@ -51,9 +48,8 @@ describe("Importing Node Configuration", () => {
|
|
|
51
48
|
const withRpc = parseFromJson({ ...NODE_CONFIG_TEST, rpc: { port: 9999 } }, NodeConfiguration.fromJson);
|
|
52
49
|
assert.deepStrictEqual(withRpc.rpc, RpcOptions.new({ port: 9999 }));
|
|
53
50
|
});
|
|
54
|
-
it("should
|
|
55
|
-
|
|
56
|
-
assert.deepStrictEqual(lmdbConfig.stateBackend, RegularStateBackend.Lmdb);
|
|
51
|
+
it("should reject unknown config keys", () => {
|
|
52
|
+
assert.throws(() => parseFromJson({ ...NODE_CONFIG_TEST, state_backend: "fjall" }, NodeConfiguration.fromJson));
|
|
57
53
|
});
|
|
58
54
|
it("should read the chain spec", () => {
|
|
59
55
|
assert.deepStrictEqual(config.chainSpec.id, "testnet");
|
|
@@ -14,14 +14,7 @@ export interface InitStatesDb<T = State> {
|
|
|
14
14
|
/** Insert a pre-defined initial state directly into the database. */
|
|
15
15
|
insertInitialState(headerHash: HeaderHash, initialState: T): Promise<Result<OK, StateUpdateError>>;
|
|
16
16
|
}
|
|
17
|
-
/**
|
|
18
|
-
* Interface for accessing states stored in the database.
|
|
19
|
-
*
|
|
20
|
-
* NOTE that the design of this interface is heavily influenced
|
|
21
|
-
* by the LMDB implementation, so that we can implement it efficiently.
|
|
22
|
-
*
|
|
23
|
-
* See the documentation there for more detailed reasoning.
|
|
24
|
-
*/
|
|
17
|
+
/** Interface for accessing states stored in the database. */
|
|
25
18
|
export interface StatesDb<T extends State = State> {
|
|
26
19
|
/** Compute a state root for given state. */
|
|
27
20
|
getStateRoot(state: T): Promise<StateRootHash>;
|
|
@@ -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
|
|
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,6DAA6D;AAC7D,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;;;;;;;;OAQG;IACH,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAE7C,4EAA4E;IAC5E,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAErC;;;;;OAKG;IACH,eAAe,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC;IAElC,6CAA6C;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,qBAAa,cAAe,YAAW,QAAQ,CAAC,aAAa,CAAC;IAQxC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPzC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAmE;IACtF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAE3C,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS;IAI1B,OAAO;IAID,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,eAAe,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI;IAI7C,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAI9B,KAAK;CACZ"}
|
|
@@ -10,10 +10,9 @@ export interface ValueDelta {
|
|
|
10
10
|
/**
|
|
11
11
|
* Synchronous, read-only view of the persisted refcounting state.
|
|
12
12
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* (LMDB transactions, fjall inserts + persist).
|
|
13
|
+
* fjall offers synchronous reads, so reads can go straight to the backing
|
|
14
|
+
* store. All writes go through `ValueRefsUpdate` batches instead, since
|
|
15
|
+
* persistent backends can only write asynchronously (fjall inserts + persist).
|
|
17
16
|
*/
|
|
18
17
|
export interface ValueRefsReader {
|
|
19
18
|
/** How many leaves of the finalized-tip state reference the value. Missing keys read as `0`. */
|
|
@@ -28,7 +27,7 @@ export interface ValueRefsReader {
|
|
|
28
27
|
*
|
|
29
28
|
* The backend is responsible for applying the batch using its own write
|
|
30
29
|
* primitive - ideally atomically with the state write that triggered it
|
|
31
|
-
* (one
|
|
30
|
+
* (one fjall persist).
|
|
32
31
|
*
|
|
33
32
|
* Counts are absolute values rather than increments, so applying the same
|
|
34
33
|
* update more than once (e.g. on crash-replay) is harmless.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"value-refs.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database/value-refs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,0EAA0E;AAC1E,MAAM,WAAW,UAAU;IACzB,sEAAsE;IACtE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,sEAAsE;IACtE,OAAO,EAAE,SAAS,EAAE,CAAC;CACtB;AAED
|
|
1
|
+
{"version":3,"file":"value-refs.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database/value-refs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,0EAA0E;AAC1E,MAAM,WAAW,UAAU;IACzB,sEAAsE;IACtE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,sEAAsE;IACtE,OAAO,EAAE,SAAS,EAAE,CAAC;CACtB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,gGAAgG;IAChG,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3C,iGAAiG;IACjG,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;IACzC,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;CACtD;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,eAAe;IAC9B,kFAAkF;IAClF,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC;IACvC,gFAAgF;IAChF,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC;IACrC,oDAAoD;IACpD,SAAS,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC;IACtC,uDAAuD;IACvD,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,kFAAkF;IAClF,YAAY,EAAE,SAAS,EAAE,CAAC;CAC3B;AAED,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAQ9D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,eAAe;IAEpD,yEAAyE;IACzE,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,eAAe;IAQjD;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,eAAe;IAYhE;;;;;OAKG;IACH,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,eAAe;IAoBvD;;;;;;;OAOG;IACH,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,eAAe;CAYxD;AA0ED;;;;;;GAMG;AACH,qBAAa,sBAAuB,YAAW,eAAe;IAC5D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2D;IACrF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2D;IACnF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgE;IAEvF,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAI1C,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAIxC,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS;IAIpD,KAAK,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;CAUrC"}
|
|
@@ -12,6 +12,7 @@ export declare class FjallBlocks implements BlocksDb {
|
|
|
12
12
|
private readonly postStateRoots;
|
|
13
13
|
static open(chainSpec: ChainSpec, root: FjallRoot): Promise<FjallBlocks>;
|
|
14
14
|
private constructor();
|
|
15
|
+
private pendingPrune;
|
|
15
16
|
setPostStateRoot(hash: HeaderHash, postStateRoot: StateRootHash): Promise<void>;
|
|
16
17
|
getPostStateRoot(hash: HeaderHash): StateRootHash | null;
|
|
17
18
|
insertBlock(block: WithHash<HeaderHash, BlockView>): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-fjall/blocks.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,aAAa,EAElB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAuB,KAAK,SAAS,EAAgC,MAAM,WAAW,CAAC;AAK9F,kCAAkC;AAClC,qBAAa,WAAY,YAAW,QAAQ;IAWxC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc;WAdpB,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;IAS9E,OAAO;
|
|
1
|
+
{"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-fjall/blocks.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,aAAa,EAElB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAuB,KAAK,SAAS,EAAgC,MAAM,WAAW,CAAC;AAK9F,kCAAkC;AAClC,qBAAa,WAAY,YAAW,QAAQ;IAWxC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc;WAdpB,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;IAS9E,OAAO;IAQP,OAAO,CAAC,YAAY,CAAuC;IAErD,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrF,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI;IAQlD,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlE,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxD,iBAAiB,IAAI,UAAU;IAQ/B,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI;IAQ9C,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI;IAQpD,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAY5B,KAAK;CAGZ"}
|
|
@@ -28,6 +28,7 @@ export class FjallBlocks {
|
|
|
28
28
|
this.extrinsics = extrinsics;
|
|
29
29
|
this.postStateRoots = postStateRoots;
|
|
30
30
|
}
|
|
31
|
+
pendingPrune = Promise.resolve();
|
|
31
32
|
async setPostStateRoot(hash, postStateRoot) {
|
|
32
33
|
await writable(this.postStateRoots, this.root).insert(hash.raw, postStateRoot.raw);
|
|
33
34
|
}
|
|
@@ -70,13 +71,17 @@ export class FjallBlocks {
|
|
|
70
71
|
return Decoder.decodeObject(Extrinsic.Codec.View, data, this.chainSpec);
|
|
71
72
|
}
|
|
72
73
|
markUnused(hash) {
|
|
73
|
-
|
|
74
|
+
this.pendingPrune = this.pendingPrune
|
|
75
|
+
.then(() => Promise.all([
|
|
74
76
|
writable(this.headers, this.root).remove(hash.raw),
|
|
75
77
|
writable(this.extrinsics, this.root).remove(hash.raw),
|
|
76
78
|
writable(this.postStateRoots, this.root).remove(hash.raw),
|
|
77
|
-
])
|
|
79
|
+
]))
|
|
80
|
+
.catch((e) => logger.warn `Failed to prune block ${hash}: ${e}`);
|
|
81
|
+
}
|
|
82
|
+
async close() {
|
|
83
|
+
await this.pendingPrune;
|
|
78
84
|
}
|
|
79
|
-
async close() { }
|
|
80
85
|
}
|
|
81
86
|
function writable(partition, root) {
|
|
82
87
|
if (root.readOnly) {
|
|
@@ -5,13 +5,13 @@ import type { Blake2b } from "#@typeberry/hash";
|
|
|
5
5
|
import type { ServicesUpdate, State } from "#@typeberry/state";
|
|
6
6
|
import { SerializedState, type StateEntries } from "#@typeberry/state-merkleization";
|
|
7
7
|
import { OK, Result } from "#@typeberry/utils";
|
|
8
|
-
import { type FjallRootOptions, type Partition } from "./root.js";
|
|
8
|
+
import { FjallRoot, type FjallRootOptions, type Partition } from "./root.js";
|
|
9
9
|
/**
|
|
10
10
|
* One open fjall keyspace together with its content-addressed `values`
|
|
11
11
|
* partition.
|
|
12
12
|
*
|
|
13
|
-
* Opening the keyspace is the slow part, so the fuzz target
|
|
14
|
-
* per run and
|
|
13
|
+
* Opening the keyspace is the slow part, so the fuzz target can open one root
|
|
14
|
+
* per run and reuse it for every reset (see `HybridSerializedStates.fromRoot`).
|
|
15
15
|
* The values partition is immutable - the key is the hash of the value - so it
|
|
16
16
|
* is fine that values pile up across resets, the unreferenced ones just sit
|
|
17
17
|
* there unused.
|
|
@@ -20,9 +20,13 @@ export declare class FjallValuesSession {
|
|
|
20
20
|
private readonly root;
|
|
21
21
|
/** Shared content-addressed values partition, reused across resets. */
|
|
22
22
|
readonly values: Partition;
|
|
23
|
+
/** Whether close() should release the underlying keyspace. */
|
|
24
|
+
private readonly ownsRoot;
|
|
23
25
|
private constructor();
|
|
24
26
|
/** Open (or create) the keyspace at `dbPath` and its `values` partition. */
|
|
25
27
|
static open(dbPath: string, options?: FjallRootOptions): Promise<FjallValuesSession>;
|
|
28
|
+
/** Wrap an already-open keyspace and open its `values` partition. */
|
|
29
|
+
static fromRoot(root: FjallRoot): Promise<FjallValuesSession>;
|
|
26
30
|
/** Flush the journal to disk (a no-op for ephemeral keyspaces). */
|
|
27
31
|
persist(): Promise<void>;
|
|
28
32
|
/** Size of the keyspace directory on disk, in bytes. */
|
|
@@ -44,7 +48,7 @@ export declare class FjallValuesSession {
|
|
|
44
48
|
* decided by in-memory refcounting (`ValueRefs`) driven by the importer's
|
|
45
49
|
* finality signal. Counts are not persisted: this db cannot resume from disk
|
|
46
50
|
* anyway (the leaf sets live in memory), so values left over by a previous run
|
|
47
|
-
* are never collected. An instance backed by a shared
|
|
51
|
+
* are never collected. An instance backed by a shared keyspace (fuzz reset
|
|
48
52
|
* reuse) only ever prunes values it inserted itself, since its refcounts start
|
|
49
53
|
* empty - values left behind by earlier resets stay untouched.
|
|
50
54
|
*/
|
|
@@ -61,6 +65,8 @@ export declare class HybridSerializedStates implements StatesDb<SerializedState<
|
|
|
61
65
|
ephemeral?: boolean;
|
|
62
66
|
cacheSizeBytes?: number;
|
|
63
67
|
}): Promise<HybridSerializedStates>;
|
|
68
|
+
/** Create a db over an already-open keyspace owned by the caller. */
|
|
69
|
+
static fromRoot(spec: ChainSpec, blake2b: Blake2b, root: FjallRoot): Promise<HybridSerializedStates>;
|
|
64
70
|
/**
|
|
65
71
|
* Wrap an already-open `FjallValuesSession` and reuse its keyspace.
|
|
66
72
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybrid-states.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-fjall/hybrid-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,EACL,KAAK,YAAY,EAEjB,MAAM,EACN,KAAK,QAAQ,EACb,gBAAgB,EAKjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EACL,eAAe,EACf,KAAK,YAAY,EAGlB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,
|
|
1
|
+
{"version":3,"file":"hybrid-states.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-fjall/hybrid-states.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,8 +10,8 @@ const logger = Logger.new(import.meta.filename, "db");
|
|
|
10
10
|
* One open fjall keyspace together with its content-addressed `values`
|
|
11
11
|
* partition.
|
|
12
12
|
*
|
|
13
|
-
* Opening the keyspace is the slow part, so the fuzz target
|
|
14
|
-
* per run and
|
|
13
|
+
* Opening the keyspace is the slow part, so the fuzz target can open one root
|
|
14
|
+
* per run and reuse it for every reset (see `HybridSerializedStates.fromRoot`).
|
|
15
15
|
* The values partition is immutable - the key is the hash of the value - so it
|
|
16
16
|
* is fine that values pile up across resets, the unreferenced ones just sit
|
|
17
17
|
* there unused.
|
|
@@ -19,11 +19,15 @@ const logger = Logger.new(import.meta.filename, "db");
|
|
|
19
19
|
export class FjallValuesSession {
|
|
20
20
|
root;
|
|
21
21
|
values;
|
|
22
|
+
ownsRoot;
|
|
22
23
|
constructor(root,
|
|
23
24
|
/** Shared content-addressed values partition, reused across resets. */
|
|
24
|
-
values
|
|
25
|
+
values,
|
|
26
|
+
/** Whether close() should release the underlying keyspace. */
|
|
27
|
+
ownsRoot) {
|
|
25
28
|
this.root = root;
|
|
26
29
|
this.values = values;
|
|
30
|
+
this.ownsRoot = ownsRoot;
|
|
27
31
|
}
|
|
28
32
|
/** Open (or create) the keyspace at `dbPath` and its `values` partition. */
|
|
29
33
|
static async open(dbPath, options = {}) {
|
|
@@ -33,13 +37,18 @@ export class FjallValuesSession {
|
|
|
33
37
|
const root = await FjallRoot.open(dbPath, options);
|
|
34
38
|
try {
|
|
35
39
|
const values = await root.writablePartition("values");
|
|
36
|
-
return new FjallValuesSession(root, values);
|
|
40
|
+
return new FjallValuesSession(root, values, true);
|
|
37
41
|
}
|
|
38
42
|
catch (e) {
|
|
39
43
|
await root.close();
|
|
40
44
|
throw e;
|
|
41
45
|
}
|
|
42
46
|
}
|
|
47
|
+
/** Wrap an already-open keyspace and open its `values` partition. */
|
|
48
|
+
static async fromRoot(root) {
|
|
49
|
+
const values = await root.writablePartition("values");
|
|
50
|
+
return new FjallValuesSession(root, values, false);
|
|
51
|
+
}
|
|
43
52
|
/** Flush the journal to disk (a no-op for ephemeral keyspaces). */
|
|
44
53
|
async persist() {
|
|
45
54
|
await this.root.persist();
|
|
@@ -50,7 +59,9 @@ export class FjallValuesSession {
|
|
|
50
59
|
}
|
|
51
60
|
/** Release the keyspace handle (skips the sync-all fsync when ephemeral). */
|
|
52
61
|
async close() {
|
|
53
|
-
|
|
62
|
+
if (this.ownsRoot) {
|
|
63
|
+
await this.root.close();
|
|
64
|
+
}
|
|
54
65
|
}
|
|
55
66
|
}
|
|
56
67
|
/**
|
|
@@ -67,7 +78,7 @@ export class FjallValuesSession {
|
|
|
67
78
|
* decided by in-memory refcounting (`ValueRefs`) driven by the importer's
|
|
68
79
|
* finality signal. Counts are not persisted: this db cannot resume from disk
|
|
69
80
|
* anyway (the leaf sets live in memory), so values left over by a previous run
|
|
70
|
-
* are never collected. An instance backed by a shared
|
|
81
|
+
* are never collected. An instance backed by a shared keyspace (fuzz reset
|
|
71
82
|
* reuse) only ever prunes values it inserted itself, since its refcounts start
|
|
72
83
|
* empty - values left behind by earlier resets stay untouched.
|
|
73
84
|
*/
|
|
@@ -81,6 +92,11 @@ export class HybridSerializedStates {
|
|
|
81
92
|
// This instance owns the session it just opened, so its `close()` closes it.
|
|
82
93
|
return new HybridSerializedStates(spec, blake2b, session, true);
|
|
83
94
|
}
|
|
95
|
+
/** Create a db over an already-open keyspace owned by the caller. */
|
|
96
|
+
static async fromRoot(spec, blake2b, root) {
|
|
97
|
+
const session = await FjallValuesSession.fromRoot(root);
|
|
98
|
+
return new HybridSerializedStates(spec, blake2b, session, true);
|
|
99
|
+
}
|
|
84
100
|
/**
|
|
85
101
|
* Wrap an already-open `FjallValuesSession` and reuse its keyspace.
|
|
86
102
|
*
|
|
@@ -43,6 +43,8 @@ export declare class FjallRoot {
|
|
|
43
43
|
partition(name: string): Promise<FjallPartition>;
|
|
44
44
|
/** Open a writable partition, failing early when this root is read-only. */
|
|
45
45
|
writablePartition(name: string): Promise<Partition>;
|
|
46
|
+
/** Delete a writable partition and all of its data. */
|
|
47
|
+
deletePartition(name: string): Promise<void>;
|
|
46
48
|
/**
|
|
47
49
|
* Flush the journal to disk so prior writes survive a crash.
|
|
48
50
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-fjall/root.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,SAAS,EAEd,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AAIzB,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;AAC7C,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,iBAAiB,CAAC;AAE3D;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,GAAG,IAAI,CAKpE;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,iEAAiE;IACjE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;;;;GAMG;AACH,qBAAa,SAAS;IAElB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,+EAA+E;IAC/E,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ1B,OAAO;IAOP,2DAA2D;WAC9C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,SAAS,CAAC;IAWrF,sEAAsE;IACtE,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,wDAAwD;IAClD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAItD,4EAA4E;IACtE,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAOzD;;;;;OAKG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAU9B;;;;;;OAMG;IACH,WAAW,IAAI,MAAM,GAAG,IAAI;IAQ5B,oFAAoF;IAC9E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|
|
1
|
+
{"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-fjall/root.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,SAAS,EAEd,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AAIzB,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;AAC7C,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,iBAAiB,CAAC;AAE3D;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,GAAG,IAAI,CAKpE;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,iEAAiE;IACjE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;;;;GAMG;AACH,qBAAa,SAAS;IAElB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,+EAA+E;IAC/E,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ1B,OAAO;IAOP,2DAA2D;WAC9C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,SAAS,CAAC;IAWrF,sEAAsE;IACtE,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,wDAAwD;IAClD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAItD,4EAA4E;IACtE,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAOzD,uDAAuD;IACjD,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlD;;;;;OAKG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAU9B;;;;;;OAMG;IACH,WAAW,IAAI,MAAM,GAAG,IAAI;IAQ5B,oFAAoF;IAC9E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|
|
@@ -31,7 +31,7 @@ export class FjallRoot {
|
|
|
31
31
|
}
|
|
32
32
|
/** Open (or create) a fjall keyspace at the given path. */
|
|
33
33
|
static async open(dbPath, options = {}) {
|
|
34
|
-
// fjall-js
|
|
34
|
+
// fjall-js shares one engine per path. Readers must use the read-only
|
|
35
35
|
// wrapper surface; durability is driven explicitly through persist().
|
|
36
36
|
const config = {
|
|
37
37
|
path: dbPath,
|
|
@@ -55,6 +55,13 @@ export class FjallRoot {
|
|
|
55
55
|
}
|
|
56
56
|
return (await this.keyspace.partition(name));
|
|
57
57
|
}
|
|
58
|
+
/** Delete a writable partition and all of its data. */
|
|
59
|
+
async deletePartition(name) {
|
|
60
|
+
if (this.readOnly) {
|
|
61
|
+
throw new Error(`Cannot delete fjall partition '${name}' from a read-only keyspace.`);
|
|
62
|
+
}
|
|
63
|
+
await this.keyspace.deletePartition(name);
|
|
64
|
+
}
|
|
58
65
|
/**
|
|
59
66
|
* Flush the journal to disk so prior writes survive a crash.
|
|
60
67
|
*
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root.test.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-fjall/root.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import { describe, it } from "node:test";
|
|
4
|
+
import { FjallRoot } from "./root.js";
|
|
5
|
+
const key = Buffer.from("key");
|
|
6
|
+
const value = Buffer.from("value");
|
|
7
|
+
describe("FjallRoot", () => {
|
|
8
|
+
it("deletes a partition and recreates it empty", async () => {
|
|
9
|
+
const dbPath = fs.mkdtempSync("typeberry-fjall-root-");
|
|
10
|
+
const root = await FjallRoot.open(dbPath, { ephemeral: true });
|
|
11
|
+
try {
|
|
12
|
+
const first = await root.writablePartition("scratch");
|
|
13
|
+
await first.insert(key, value);
|
|
14
|
+
await root.deletePartition("scratch");
|
|
15
|
+
const second = await root.writablePartition("scratch");
|
|
16
|
+
assert.strictEqual(second.get(key), null);
|
|
17
|
+
}
|
|
18
|
+
finally {
|
|
19
|
+
await root.close();
|
|
20
|
+
fs.rmSync(dbPath, { recursive: true, force: true });
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -16,6 +16,7 @@ export declare class FjallStates implements StatesDb<SerializedState<LeafDb>>, I
|
|
|
16
16
|
private readonly values;
|
|
17
17
|
static open(spec: ChainSpec, blake2b: Blake2b, root: FjallRoot): Promise<FjallStates>;
|
|
18
18
|
private readonly valuesDb;
|
|
19
|
+
private pendingPrune;
|
|
19
20
|
private constructor();
|
|
20
21
|
insertInitialState(headerHash: HeaderHash, entries: StateEntries): Promise<Result<OK, StateUpdateError>>;
|
|
21
22
|
updateAndSetState(headerHash: HeaderHash, state: SerializedState<LeafDb>, update: Partial<State & ServicesUpdate>): Promise<Result<OK, StateUpdateError>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"states.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-fjall/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,EACL,KAAK,YAAY,EACjB,MAAM,EACN,KAAK,QAAQ,EACb,gBAAgB,EAGjB,MAAM,qBAAqB,CAAC;AAC7B,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;AAE/G,OAAO,EAAE,EAAE,EAAE,MAAM,EAAkB,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAuB,KAAK,SAAS,EAAgC,MAAM,WAAW,CAAC;AAI9F,0DAA0D;AAC1D,qBAAa,WAAY,YAAW,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"states.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-fjall/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,EACL,KAAK,YAAY,EACjB,MAAM,EACN,KAAK,QAAQ,EACb,gBAAgB,EAGjB,MAAM,qBAAqB,CAAC;AAC7B,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;AAE/G,OAAO,EAAE,EAAE,EAAE,MAAM,EAAkB,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAuB,KAAK,SAAS,EAAgC,MAAM,WAAW,CAAC;AAI9F,0DAA0D;AAC1D,qBAAa,WAAY,YAAW,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC;IAU7F,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;WAbZ,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;IAK3F,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,YAAY,CAAuC;IAE3D,OAAO;IAUD,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAQxG,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;IAUlC,YAAY,CAAC,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAI1E,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI;IAahE,eAAe,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI;IAK7C,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAMxC,eAAe,IAAI,MAAM,GAAG,IAAI;IAI1B,KAAK;YAIG,eAAe;IAyB7B,OAAO,CAAC,SAAS;CAOlB"}
|
|
@@ -19,6 +19,7 @@ export class FjallStates {
|
|
|
19
19
|
return new FjallStates(spec, blake2b, root, states, values);
|
|
20
20
|
}
|
|
21
21
|
valuesDb;
|
|
22
|
+
pendingPrune = Promise.resolve();
|
|
22
23
|
constructor(spec, blake2b, root, states, values) {
|
|
23
24
|
this.spec = spec;
|
|
24
25
|
this.blake2b = blake2b;
|
|
@@ -58,14 +59,16 @@ export class FjallStates {
|
|
|
58
59
|
// would need counts persisted (and crash-consistent) alongside the values.
|
|
59
60
|
}
|
|
60
61
|
markUnused(headerHash) {
|
|
61
|
-
|
|
62
|
-
.remove(headerHash.raw)
|
|
62
|
+
this.pendingPrune = this.pendingPrune
|
|
63
|
+
.then(() => writable(this.states, this.root).remove(headerHash.raw))
|
|
63
64
|
.catch((e) => logger.warn `Failed to prune state ${headerHash}: ${e}`);
|
|
64
65
|
}
|
|
65
66
|
diskSizeInBytes() {
|
|
66
67
|
return this.root.sizeInBytes();
|
|
67
68
|
}
|
|
68
|
-
async close() {
|
|
69
|
+
async close() {
|
|
70
|
+
await this.pendingPrune;
|
|
71
|
+
}
|
|
69
72
|
async updateAndCommit(headerHash, leafs, data) {
|
|
70
73
|
const { values } = updateLeafs(leafs, this.blake2b, data);
|
|
71
74
|
const stateLeafs = BytesBlob.blobFromParts(leafs.array.map((x) => x.node.raw));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/node/export.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/node/export.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,wBAAsB,YAAY,CAAC,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,iBA2F9G"}
|
|
@@ -3,10 +3,9 @@ import path from "node:path";
|
|
|
3
3
|
import { Block as BlockCodec } from "#@typeberry/block";
|
|
4
4
|
import { Bytes } from "#@typeberry/bytes";
|
|
5
5
|
import { Encoder } from "#@typeberry/codec";
|
|
6
|
-
import { RegularStateBackend } from "#@typeberry/config-node";
|
|
7
6
|
import { Blake2b, HASH_SIZE } from "#@typeberry/hash";
|
|
8
7
|
import { Logger } from "#@typeberry/logger";
|
|
9
|
-
import { FjallWorkerConfig
|
|
8
|
+
import { FjallWorkerConfig } from "#@typeberry/workers-api-node";
|
|
10
9
|
import { getChainSpec, getDatabasePath } from "./common.js";
|
|
11
10
|
export async function exportBlocks(jamNodeConfig, output, withRelPath) {
|
|
12
11
|
const logger = Logger.new(import.meta.filename, "export");
|
|
@@ -30,21 +29,13 @@ export async function exportBlocks(jamNodeConfig, output, withRelPath) {
|
|
|
30
29
|
const blake2b = await Blake2b.createHasher();
|
|
31
30
|
const chainSpec = getChainSpec(jamNodeConfig.node.flavor);
|
|
32
31
|
const { dbPath } = getDatabasePath(blake2b, jamNodeConfig.nodeName, jamNodeConfig.node.chainSpec.genesisHeader, withRelPath(jamNodeConfig.node.databaseBasePath));
|
|
33
|
-
const config =
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
})
|
|
41
|
-
: LmdbWorkerConfig.new({
|
|
42
|
-
nodeName: jamNodeConfig.nodeName,
|
|
43
|
-
chainSpec,
|
|
44
|
-
blake2b,
|
|
45
|
-
dbPath,
|
|
46
|
-
workerParams: undefined,
|
|
47
|
-
});
|
|
32
|
+
const config = FjallWorkerConfig.new({
|
|
33
|
+
nodeName: jamNodeConfig.nodeName,
|
|
34
|
+
chainSpec,
|
|
35
|
+
blake2b,
|
|
36
|
+
dbPath,
|
|
37
|
+
workerParams: undefined,
|
|
38
|
+
});
|
|
48
39
|
const rootDb = await config.openDatabase();
|
|
49
40
|
const blocks = rootDb.getBlocksDb();
|
|
50
41
|
logger.info `📖 Gathering blocks...`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main-fuzz.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/node/main-fuzz.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,WAAW,EAAmB,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAIrD,OAAO,EAAE,KAAK,MAAM,EAAoC,MAAM,kBAAkB,CAAC;AAGjF,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;
|
|
1
|
+
{"version":3,"file":"main-fuzz.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/node/main-fuzz.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,WAAW,EAAmB,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAIrD,OAAO,EAAE,KAAK,MAAM,EAAoC,MAAM,kBAAkB,CAAC;AAGjF,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;AAoBF;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CASpF;AAED,iFAAiF;AACjF,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D;AAED,wBAAgB,cAAc;;;;EAM7B;AAED,wBAAsB,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CA+MrH"}
|