@typeberry/lib 0.10.0 → 0.11.0-829b7ea
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 +3 -5
- package/packages/configs/index.d.ts +9 -0
- package/packages/configs/index.d.ts.map +1 -1
- package/packages/configs/typeberry-default.json +4 -1
- package/packages/configs/typeberry-dev-full.json +3 -0
- package/packages/configs/typeberry-dev-tiny.json +3 -0
- package/packages/jam/config-node/index.d.ts +1 -0
- package/packages/jam/config-node/index.d.ts.map +1 -1
- package/packages/jam/config-node/index.js +1 -0
- package/packages/jam/config-node/node-config.d.ts +5 -11
- package/packages/jam/config-node/node-config.d.ts.map +1 -1
- package/packages/jam/config-node/node-config.js +9 -25
- package/packages/jam/config-node/node-config.test.js +11 -6
- package/packages/jam/config-node/rpc.d.ts +11 -0
- package/packages/jam/config-node/rpc.d.ts.map +1 -0
- package/packages/jam/config-node/rpc.js +16 -0
- 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/node/export.d.ts.map +1 -1
- package/packages/jam/node/export.js +8 -17
- package/packages/jam/node/jam-config.d.ts +5 -1
- package/packages/jam/node/jam-config.d.ts.map +1 -1
- package/packages/jam/node/jam-config.js +6 -2
- package/packages/jam/node/main-fuzz.d.ts.map +1 -1
- package/packages/jam/node/main-fuzz.js +32 -19
- package/packages/jam/node/main-importer.d.ts +2 -6
- package/packages/jam/node/main-importer.d.ts.map +1 -1
- package/packages/jam/node/main-importer.js +13 -28
- package/packages/jam/node/main.d.ts.map +1 -1
- package/packages/jam/node/main.js +6 -16
- package/packages/jam/rpc/index.d.ts +3 -0
- package/packages/jam/rpc/index.d.ts.map +1 -0
- package/packages/jam/rpc/index.js +2 -0
- package/packages/jam/rpc/src/handlers/best-block.d.ts +6 -0
- package/packages/jam/rpc/src/handlers/best-block.d.ts.map +1 -0
- package/packages/jam/rpc/src/handlers/best-block.js +15 -0
- package/packages/jam/rpc/src/handlers/finalized-block.d.ts +6 -0
- package/packages/jam/rpc/src/handlers/finalized-block.d.ts.map +1 -0
- package/packages/jam/rpc/src/handlers/finalized-block.js +7 -0
- package/packages/jam/rpc/src/handlers/list-services.d.ts +6 -0
- package/packages/jam/rpc/src/handlers/list-services.d.ts.map +1 -0
- package/packages/jam/rpc/src/handlers/list-services.js +15 -0
- package/packages/jam/rpc/src/handlers/not-implemented.d.ts +4 -0
- package/packages/jam/rpc/src/handlers/not-implemented.d.ts.map +1 -0
- package/packages/jam/rpc/src/handlers/not-implemented.js +4 -0
- package/packages/jam/rpc/src/handlers/parameters.d.ts +7 -0
- package/packages/jam/rpc/src/handlers/parameters.d.ts.map +1 -0
- package/packages/jam/rpc/src/handlers/parameters.js +53 -0
- package/packages/jam/rpc/src/handlers/parent.d.ts +6 -0
- package/packages/jam/rpc/src/handlers/parent.d.ts.map +1 -0
- package/packages/jam/rpc/src/handlers/parent.js +25 -0
- package/packages/jam/rpc/src/handlers/service-data.d.ts +6 -0
- package/packages/jam/rpc/src/handlers/service-data.d.ts.map +1 -0
- package/packages/jam/rpc/src/handlers/service-data.js +21 -0
- package/packages/jam/rpc/src/handlers/service-preimage.d.ts +6 -0
- package/packages/jam/rpc/src/handlers/service-preimage.d.ts.map +1 -0
- package/packages/jam/rpc/src/handlers/service-preimage.js +23 -0
- package/packages/jam/rpc/src/handlers/service-request.d.ts +6 -0
- package/packages/jam/rpc/src/handlers/service-request.d.ts.map +1 -0
- package/packages/jam/rpc/src/handlers/service-request.js +23 -0
- package/packages/jam/rpc/src/handlers/service-value.d.ts +6 -0
- package/packages/jam/rpc/src/handlers/service-value.d.ts.map +1 -0
- package/packages/jam/rpc/src/handlers/service-value.js +23 -0
- package/packages/jam/rpc/src/handlers/state-root.d.ts +6 -0
- package/packages/jam/rpc/src/handlers/state-root.d.ts.map +1 -0
- package/packages/jam/rpc/src/handlers/state-root.js +14 -0
- package/packages/jam/rpc/src/handlers/statistics.d.ts +6 -0
- package/packages/jam/rpc/src/handlers/statistics.d.ts.map +1 -0
- package/packages/jam/rpc/src/handlers/statistics.js +16 -0
- package/packages/jam/rpc/src/handlers/subscribe-best-block.d.ts +6 -0
- package/packages/jam/rpc/src/handlers/subscribe-best-block.d.ts.map +1 -0
- package/packages/jam/rpc/src/handlers/subscribe-best-block.js +8 -0
- package/packages/jam/rpc/src/handlers/subscribe-finalized-block.d.ts +6 -0
- package/packages/jam/rpc/src/handlers/subscribe-finalized-block.d.ts.map +1 -0
- package/packages/jam/rpc/src/handlers/subscribe-finalized-block.js +8 -0
- package/packages/jam/rpc/src/handlers/subscribe-service-data.d.ts +6 -0
- package/packages/jam/rpc/src/handlers/subscribe-service-data.d.ts.map +1 -0
- package/packages/jam/rpc/src/handlers/subscribe-service-data.js +13 -0
- package/packages/jam/rpc/src/handlers/subscribe-service-preimage.d.ts +6 -0
- package/packages/jam/rpc/src/handlers/subscribe-service-preimage.d.ts.map +1 -0
- package/packages/jam/rpc/src/handlers/subscribe-service-preimage.js +13 -0
- package/packages/jam/rpc/src/handlers/subscribe-service-request.d.ts +6 -0
- package/packages/jam/rpc/src/handlers/subscribe-service-request.d.ts.map +1 -0
- package/packages/jam/rpc/src/handlers/subscribe-service-request.js +13 -0
- package/packages/jam/rpc/src/handlers/subscribe-service-value.d.ts +6 -0
- package/packages/jam/rpc/src/handlers/subscribe-service-value.d.ts.map +1 -0
- package/packages/jam/rpc/src/handlers/subscribe-service-value.js +13 -0
- package/packages/jam/rpc/src/handlers/subscribe-statistics.d.ts +6 -0
- package/packages/jam/rpc/src/handlers/subscribe-statistics.d.ts.map +1 -0
- package/packages/jam/rpc/src/handlers/subscribe-statistics.js +13 -0
- package/packages/jam/rpc/src/handlers/typeberry/refine-work-package.d.ts +8 -0
- package/packages/jam/rpc/src/handlers/typeberry/refine-work-package.d.ts.map +1 -0
- package/packages/jam/rpc/src/handlers/typeberry/refine-work-package.js +68 -0
- package/packages/jam/rpc/src/handlers/unsubscribe.d.ts +4 -0
- package/packages/jam/rpc/src/handlers/unsubscribe.d.ts.map +1 -0
- package/packages/jam/rpc/src/handlers/unsubscribe.js +3 -0
- package/packages/jam/rpc/src/handlers.d.ts +3 -0
- package/packages/jam/rpc/src/handlers.d.ts.map +1 -0
- package/packages/jam/rpc/src/handlers.js +60 -0
- package/packages/jam/rpc/src/server.d.ts +31 -0
- package/packages/jam/rpc/src/server.d.ts.map +1 -0
- package/packages/jam/rpc/src/server.js +179 -0
- package/packages/jam/rpc/src/subscription-manager.d.ts +20 -0
- package/packages/jam/rpc/src/subscription-manager.d.ts.map +1 -0
- package/packages/jam/rpc/src/subscription-manager.js +74 -0
- package/packages/jam/rpc/test/e2e-server.d.ts +3 -0
- package/packages/jam/rpc/test/e2e-server.d.ts.map +1 -0
- package/packages/jam/rpc/test/e2e-server.js +30 -0
- package/packages/jam/rpc/test/e2e-setup.d.ts +2 -0
- package/packages/jam/rpc/test/e2e-setup.d.ts.map +1 -0
- package/packages/jam/rpc/test/e2e-setup.js +126 -0
- package/packages/jam/rpc/test/e2e.d.ts +2 -0
- package/packages/jam/rpc/test/e2e.d.ts.map +1 -0
- package/packages/jam/rpc/test/e2e.js +326 -0
- 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 +6 -40
- package/packages/workers/api-node/config.d.ts.map +1 -1
- package/packages/workers/api-node/config.js +6 -82
- package/packages/workers/api-node/config.test.js +26 -63
- package/packages/workers/importer/main.d.ts +2 -0
- package/packages/workers/importer/main.d.ts.map +1 -1
- package/packages/workers/importer/main.js +1 -1
- 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.
|
|
3
|
+
"version": "0.11.0-829b7ea",
|
|
4
4
|
"description": "Typeberry Library",
|
|
5
5
|
"main": "./bin/lib/index.js",
|
|
6
6
|
"types": "./bin/lib/index.d.ts",
|
|
@@ -152,8 +152,6 @@
|
|
|
152
152
|
"#@typeberry/lib/*": "./bin/lib/*",
|
|
153
153
|
"#@typeberry/pvm": "./bin/pvm/index.js",
|
|
154
154
|
"#@typeberry/pvm/*": "./bin/pvm/*",
|
|
155
|
-
"#@typeberry/rpc": "./bin/rpc/index.js",
|
|
156
|
-
"#@typeberry/rpc/*": "./bin/rpc/*",
|
|
157
155
|
"#@typeberry/test-runner": "./bin/test-runner/index.js",
|
|
158
156
|
"#@typeberry/test-runner/*": "./bin/test-runner/*",
|
|
159
157
|
"#@typeberry/configs": "./packages/configs/index.js",
|
|
@@ -216,8 +214,6 @@
|
|
|
216
214
|
"#@typeberry/database/*": "./packages/jam/database/*",
|
|
217
215
|
"#@typeberry/database-fjall": "./packages/jam/database-fjall/index.js",
|
|
218
216
|
"#@typeberry/database-fjall/*": "./packages/jam/database-fjall/*",
|
|
219
|
-
"#@typeberry/database-lmdb": "./packages/jam/database-lmdb/index.js",
|
|
220
|
-
"#@typeberry/database-lmdb/*": "./packages/jam/database-lmdb/*",
|
|
221
217
|
"#@typeberry/executor": "./packages/jam/executor/index.js",
|
|
222
218
|
"#@typeberry/executor/*": "./packages/jam/executor/*",
|
|
223
219
|
"#@typeberry/fuzz-proto": "./packages/jam/fuzz-proto/index.js",
|
|
@@ -230,6 +226,8 @@
|
|
|
230
226
|
"#@typeberry/jamnp-s/*": "./packages/jam/jamnp-s/*",
|
|
231
227
|
"#@typeberry/node": "./packages/jam/node/index.js",
|
|
232
228
|
"#@typeberry/node/*": "./packages/jam/node/*",
|
|
229
|
+
"#@typeberry/rpc": "./packages/jam/rpc/index.js",
|
|
230
|
+
"#@typeberry/rpc/*": "./packages/jam/rpc/*",
|
|
233
231
|
"#@typeberry/rpc-client": "./packages/jam/rpc-client/index.js",
|
|
234
232
|
"#@typeberry/rpc-client/*": "./packages/jam/rpc-client/*",
|
|
235
233
|
"#@typeberry/rpc-validation": "./packages/jam/rpc-validation/index.js",
|
|
@@ -33,6 +33,9 @@ export declare const configs: {
|
|
|
33
33
|
};
|
|
34
34
|
};
|
|
35
35
|
database_base_path: string;
|
|
36
|
+
rpc: {
|
|
37
|
+
port: number;
|
|
38
|
+
};
|
|
36
39
|
};
|
|
37
40
|
devTiny: {
|
|
38
41
|
$schema: string;
|
|
@@ -67,6 +70,9 @@ export declare const configs: {
|
|
|
67
70
|
ff000000000000000000000000000000000000000000000000000000000000: string;
|
|
68
71
|
};
|
|
69
72
|
};
|
|
73
|
+
rpc: {
|
|
74
|
+
port: number;
|
|
75
|
+
};
|
|
70
76
|
};
|
|
71
77
|
devFull: {
|
|
72
78
|
$schema: string;
|
|
@@ -96,6 +102,9 @@ export declare const configs: {
|
|
|
96
102
|
"10000000000000000000000000000000000000000000000000000000000000": string;
|
|
97
103
|
};
|
|
98
104
|
};
|
|
105
|
+
rpc: {
|
|
106
|
+
port: number;
|
|
107
|
+
};
|
|
99
108
|
};
|
|
100
109
|
};
|
|
101
110
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/configs/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,OAAO
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/configs/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAInB,CAAC"}
|
|
@@ -34,5 +34,8 @@
|
|
|
34
34
|
"ff000000000000000000000000000000000000000000000000000000000000": "00d1b097b4410b3a63446d7c57d093972a9744fcd2d74f4a5e2ec163610e6d6327ffffffffffffffff0a000000000000000a000000000000003418020000000000ffffffffffffffff04000000000000000000000000000000"
|
|
35
35
|
}
|
|
36
36
|
},
|
|
37
|
-
"database_base_path": "./database"
|
|
37
|
+
"database_base_path": "./database",
|
|
38
|
+
"rpc": {
|
|
39
|
+
"port": 19800
|
|
40
|
+
}
|
|
38
41
|
}
|
|
@@ -25,5 +25,8 @@
|
|
|
25
25
|
"0f000000000000000000000000000000000000000000000000000000000000": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
|
26
26
|
"10000000000000000000000000000000000000000000000000000000000000": "00"
|
|
27
27
|
}
|
|
28
|
+
},
|
|
29
|
+
"rpc": {
|
|
30
|
+
"port": 19800
|
|
28
31
|
}
|
|
29
32
|
}
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"10000000000000000000000000000000000000000000000000000000000000": "00",
|
|
31
31
|
"ff000000000000000000000000000000000000000000000000000000000000": "00d1b097b4410b3a63446d7c57d093972a9744fcd2d74f4a5e2ec163610e6d6327ffffffffffffffff0a000000000000000a000000000000003418020000000000ffffffffffffffff04000000000000000000000000000000"
|
|
32
32
|
}
|
|
33
|
+
},
|
|
34
|
+
"rpc": {
|
|
35
|
+
"port": 19800
|
|
33
36
|
}
|
|
34
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/config-node/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/config-node/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { PvmBackend } from "#@typeberry/config";
|
|
|
2
2
|
import { type FromJson } from "#@typeberry/json-parser";
|
|
3
3
|
import { AuthorshipOptions } from "./authorship.js";
|
|
4
4
|
import { JipChainSpec } from "./jip-chain-spec.js";
|
|
5
|
+
import { RpcOptions } from "./rpc.js";
|
|
5
6
|
/** Development config. Will accept unsealed blocks for now. */
|
|
6
7
|
export declare const DEV_TINY_CONFIG = "dev";
|
|
7
8
|
export declare const DEV_FULL_CONFIG = "dev-full";
|
|
@@ -19,22 +20,15 @@ export declare enum KnownChainSpec {
|
|
|
19
20
|
/** Full chain spec. */
|
|
20
21
|
Full = "full"
|
|
21
22
|
}
|
|
22
|
-
/** Persistent regular-node database backend. */
|
|
23
|
-
export declare enum RegularStateBackend {
|
|
24
|
-
/** @deprecated lmdb remains available as an explicit fallback, but fjall is the default backend. */
|
|
25
|
-
Lmdb = "lmdb",
|
|
26
|
-
Fjall = "fjall"
|
|
27
|
-
}
|
|
28
23
|
export declare const knownChainSpecFromJson: FromJson<KnownChainSpec>;
|
|
29
|
-
export declare const regularStateBackendFromJson: FromJson<RegularStateBackend>;
|
|
30
24
|
type NodeConfigurationJson = {
|
|
31
25
|
$schema: string;
|
|
32
26
|
version: number;
|
|
33
27
|
flavor: KnownChainSpec;
|
|
34
28
|
chain_spec: JipChainSpec;
|
|
35
29
|
database_base_path?: string;
|
|
36
|
-
state_backend?: RegularStateBackend;
|
|
37
30
|
authorship: AuthorshipOptions;
|
|
31
|
+
rpc?: RpcOptions;
|
|
38
32
|
};
|
|
39
33
|
export declare class NodeConfiguration {
|
|
40
34
|
readonly $schema: string;
|
|
@@ -43,11 +37,11 @@ export declare class NodeConfiguration {
|
|
|
43
37
|
readonly chainSpec: JipChainSpec;
|
|
44
38
|
/** If database path is not provided, we load an in-memory db. */
|
|
45
39
|
readonly databaseBasePath: string | undefined;
|
|
46
|
-
/** Persistent database backend used when `databaseBasePath` is set. */
|
|
47
|
-
readonly stateBackend: RegularStateBackend;
|
|
48
40
|
readonly authorship: AuthorshipOptions;
|
|
41
|
+
/** Optional RPC server configuration. When present, an in-process RPC server is started. */
|
|
42
|
+
readonly rpc: RpcOptions | undefined;
|
|
49
43
|
static fromJson: import("@typeberry/json-parser").FromJsonWithParser<unknown, NodeConfiguration>;
|
|
50
|
-
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;
|
|
51
45
|
private constructor();
|
|
52
46
|
}
|
|
53
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;
|
|
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"}
|
|
@@ -7,6 +7,7 @@ import { Logger } from "#@typeberry/logger";
|
|
|
7
7
|
import { isBrowser } from "#@typeberry/utils";
|
|
8
8
|
import { AuthorshipOptions } from "./authorship.js";
|
|
9
9
|
import { JipChainSpec } from "./jip-chain-spec.js";
|
|
10
|
+
import { RpcOptions } from "./rpc.js";
|
|
10
11
|
const logger = Logger.new(import.meta.filename, "config");
|
|
11
12
|
/** Development config. Will accept unsealed blocks for now. */
|
|
12
13
|
export const DEV_TINY_CONFIG = "dev";
|
|
@@ -26,13 +27,6 @@ export var KnownChainSpec;
|
|
|
26
27
|
/** Full chain spec. */
|
|
27
28
|
KnownChainSpec["Full"] = "full";
|
|
28
29
|
})(KnownChainSpec || (KnownChainSpec = {}));
|
|
29
|
-
/** Persistent regular-node database backend. */
|
|
30
|
-
export var RegularStateBackend;
|
|
31
|
-
(function (RegularStateBackend) {
|
|
32
|
-
/** @deprecated lmdb remains available as an explicit fallback, but fjall is the default backend. */
|
|
33
|
-
RegularStateBackend["Lmdb"] = "lmdb";
|
|
34
|
-
RegularStateBackend["Fjall"] = "fjall";
|
|
35
|
-
})(RegularStateBackend || (RegularStateBackend = {}));
|
|
36
30
|
export const knownChainSpecFromJson = json.fromString((input, ctx) => {
|
|
37
31
|
switch (input) {
|
|
38
32
|
case KnownChainSpec.Tiny:
|
|
@@ -43,51 +37,41 @@ export const knownChainSpecFromJson = json.fromString((input, ctx) => {
|
|
|
43
37
|
throw Error(`unknown network flavor: ${input} at ${ctx}`);
|
|
44
38
|
}
|
|
45
39
|
});
|
|
46
|
-
export const regularStateBackendFromJson = json.fromString((input, ctx) => {
|
|
47
|
-
switch (input) {
|
|
48
|
-
case RegularStateBackend.Lmdb:
|
|
49
|
-
return RegularStateBackend.Lmdb;
|
|
50
|
-
case RegularStateBackend.Fjall:
|
|
51
|
-
return RegularStateBackend.Fjall;
|
|
52
|
-
default:
|
|
53
|
-
throw Error(`unknown state backend: ${input} at ${ctx}`);
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
40
|
export class NodeConfiguration {
|
|
57
41
|
$schema;
|
|
58
42
|
version;
|
|
59
43
|
flavor;
|
|
60
44
|
chainSpec;
|
|
61
45
|
databaseBasePath;
|
|
62
|
-
stateBackend;
|
|
63
46
|
authorship;
|
|
47
|
+
rpc;
|
|
64
48
|
static fromJson = json.object({
|
|
65
49
|
$schema: "string",
|
|
66
50
|
version: "number",
|
|
67
51
|
flavor: knownChainSpecFromJson,
|
|
68
52
|
chain_spec: JipChainSpec.fromJson,
|
|
69
53
|
database_base_path: json.optional("string"),
|
|
70
|
-
state_backend: json.optional(regularStateBackendFromJson),
|
|
71
54
|
authorship: AuthorshipOptions.fromJson,
|
|
55
|
+
rpc: json.optional(RpcOptions.fromJson),
|
|
72
56
|
}, NodeConfiguration.new);
|
|
73
|
-
static new({ $schema, version, flavor, chain_spec, database_base_path,
|
|
57
|
+
static new({ $schema, version, flavor, chain_spec, database_base_path, authorship, rpc }) {
|
|
74
58
|
if (version !== 1) {
|
|
75
59
|
throw new Error("Only version=1 config is supported.");
|
|
76
60
|
}
|
|
77
|
-
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);
|
|
78
62
|
}
|
|
79
63
|
constructor($schema, version, flavor, chainSpec,
|
|
80
64
|
/** If database path is not provided, we load an in-memory db. */
|
|
81
|
-
databaseBasePath,
|
|
82
|
-
/**
|
|
83
|
-
|
|
65
|
+
databaseBasePath, authorship,
|
|
66
|
+
/** Optional RPC server configuration. When present, an in-process RPC server is started. */
|
|
67
|
+
rpc) {
|
|
84
68
|
this.$schema = $schema;
|
|
85
69
|
this.version = version;
|
|
86
70
|
this.flavor = flavor;
|
|
87
71
|
this.chainSpec = chainSpec;
|
|
88
72
|
this.databaseBasePath = databaseBasePath;
|
|
89
|
-
this.stateBackend = stateBackend;
|
|
90
73
|
this.authorship = authorship;
|
|
74
|
+
this.rpc = rpc;
|
|
91
75
|
}
|
|
92
76
|
}
|
|
93
77
|
export function loadConfig(config, withRelPath) {
|
|
@@ -5,7 +5,8 @@ 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
|
+
import { RpcOptions } from "./rpc.js";
|
|
9
10
|
const withRelPath = workspacePathFix(`${import.meta.dirname}/../..`);
|
|
10
11
|
const NODE_CONFIG_TEST = {
|
|
11
12
|
$schema: "https://typeberry.dev/schemas/config-v1.schema.json",
|
|
@@ -40,12 +41,15 @@ describe("Importing Node Configuration", () => {
|
|
|
40
41
|
it("should read the database base path", () => {
|
|
41
42
|
assert.deepStrictEqual(config.databaseBasePath, "/tmp/jam-node-db");
|
|
42
43
|
});
|
|
43
|
-
it("defaults to
|
|
44
|
-
assert.deepStrictEqual(config.
|
|
44
|
+
it("defaults to no rpc config", () => {
|
|
45
|
+
assert.deepStrictEqual(config.rpc, undefined);
|
|
45
46
|
});
|
|
46
|
-
it("should read
|
|
47
|
-
const
|
|
48
|
-
assert.deepStrictEqual(
|
|
47
|
+
it("should read rpc config when present", () => {
|
|
48
|
+
const withRpc = parseFromJson({ ...NODE_CONFIG_TEST, rpc: { port: 9999 } }, NodeConfiguration.fromJson);
|
|
49
|
+
assert.deepStrictEqual(withRpc.rpc, RpcOptions.new({ port: 9999 }));
|
|
50
|
+
});
|
|
51
|
+
it("should reject unknown config keys", () => {
|
|
52
|
+
assert.throws(() => parseFromJson({ ...NODE_CONFIG_TEST, state_backend: "fjall" }, NodeConfiguration.fromJson));
|
|
49
53
|
});
|
|
50
54
|
it("should read the chain spec", () => {
|
|
51
55
|
assert.deepStrictEqual(config.chainSpec.id, "testnet");
|
|
@@ -74,6 +78,7 @@ describe("loadConfig", () => {
|
|
|
74
78
|
it("should load default config", () => {
|
|
75
79
|
const config = loadConfig(["default"], withRelPath);
|
|
76
80
|
assert.deepStrictEqual(config, parseFromJson(configs.default, NodeConfiguration.fromJson));
|
|
81
|
+
assert.deepStrictEqual(config.rpc, RpcOptions.new({ port: 19800 }));
|
|
77
82
|
});
|
|
78
83
|
it("should load dev config", () => {
|
|
79
84
|
const config = loadConfig(["dev"], withRelPath);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** RPC server options. */
|
|
2
|
+
export declare class RpcOptions {
|
|
3
|
+
/** Port for the JSON-RPC WebSocket server. */
|
|
4
|
+
readonly port: number;
|
|
5
|
+
static fromJson: import("@typeberry/json-parser").FromJsonWithParser<unknown, RpcOptions>;
|
|
6
|
+
static new({ port }: {
|
|
7
|
+
port: number;
|
|
8
|
+
}): RpcOptions;
|
|
9
|
+
private constructor();
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/config-node/rpc.ts"],"names":[],"mappings":"AAGA,0BAA0B;AAC1B,qBAAa,UAAU;IAanB,8CAA8C;aAC9B,IAAI,EAAE,MAAM;IAb9B,MAAM,CAAC,QAAQ,2EAKb;IAEF,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE;IAIrC,OAAO;CAIR"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { json } from "#@typeberry/json-parser";
|
|
2
|
+
/** RPC server options. */
|
|
3
|
+
export class RpcOptions {
|
|
4
|
+
port;
|
|
5
|
+
static fromJson = json.object({
|
|
6
|
+
port: "number",
|
|
7
|
+
}, RpcOptions.new);
|
|
8
|
+
static new({ port }) {
|
|
9
|
+
return new RpcOptions(port);
|
|
10
|
+
}
|
|
11
|
+
constructor(
|
|
12
|
+
/** Port for the JSON-RPC WebSocket server. */
|
|
13
|
+
port) {
|
|
14
|
+
this.port = port;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -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"}
|
|
@@ -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...`;
|
|
@@ -26,11 +26,13 @@ export declare class JamConfig {
|
|
|
26
26
|
readonly dev: DevConfig | null;
|
|
27
27
|
/** Networking options. */
|
|
28
28
|
readonly network: NetworkConfig | null;
|
|
29
|
+
/** RPC WebSocket port. When set, an in-process RPC server is started. */
|
|
30
|
+
readonly rpcPort: number | null;
|
|
29
31
|
/** Optional pre-genesis ancestry information. */
|
|
30
32
|
readonly ancestry: [HeaderHash, TimeSlot][];
|
|
31
33
|
/** Validator index for dev mode authorship. Use "all" to author as all validators. */
|
|
32
34
|
readonly devValidatorIndex: U16 | "all" | null;
|
|
33
|
-
static new({ isAuthoring, isFastForward, nodeName, nodeConfig, pvmBackend, devConfig, networkConfig, ancestry, devValidatorIndex, }: {
|
|
35
|
+
static new({ isAuthoring, isFastForward, nodeName, nodeConfig, pvmBackend, devConfig, networkConfig, rpcPort, ancestry, devValidatorIndex, }: {
|
|
34
36
|
isAuthoring?: boolean;
|
|
35
37
|
isFastForward?: boolean;
|
|
36
38
|
nodeName: string;
|
|
@@ -38,6 +40,8 @@ export declare class JamConfig {
|
|
|
38
40
|
pvmBackend: PvmBackend;
|
|
39
41
|
devConfig?: DevConfig | null;
|
|
40
42
|
networkConfig?: NetworkConfig | null;
|
|
43
|
+
/** RPC WebSocket port. When set, an in-process RPC server is started. */
|
|
44
|
+
rpcPort?: number | null;
|
|
41
45
|
ancestry?: [HeaderHash, TimeSlot][];
|
|
42
46
|
/** Validator index for dev mode authorship. Use "all" to author as all validators. */
|
|
43
47
|
devValidatorIndex?: U16 | "all" | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jam-config.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/node/jam-config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,QAAQ,EAGb,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AACtF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAE9C,eAAO,MAAM,kBAAkB;;;;CAI9B,CAAC;AAEF;;GAEG;AACH,qBAAa,SAAS;
|
|
1
|
+
{"version":3,"file":"jam-config.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/node/jam-config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,QAAQ,EAGb,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AACtF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAE9C,eAAO,MAAM,kBAAkB;;;;CAI9B,CAAC;AAEF;;GAEG;AACH,qBAAa,SAAS;IAyClB,6CAA6C;aAC7B,WAAW,EAAE,OAAO;IACpC,6FAA6F;aAC7E,aAAa,EAAE,OAAO;IACtC,iBAAiB;aACD,QAAQ,EAAE,MAAM;IAChC,mCAAmC;aACnB,IAAI,EAAE,iBAAiB;IACvC,4BAA4B;aACZ,UAAU,EAAE,UAAU;IACtC,wCAAwC;aACxB,GAAG,EAAE,SAAS,GAAG,IAAI;IACrC,0BAA0B;aACV,OAAO,EAAE,aAAa,GAAG,IAAI;IAC7C,yEAAyE;aACzD,OAAO,EAAE,MAAM,GAAG,IAAI;IACtC,iDAAiD;aACjC,QAAQ,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE;IAClD,sFAAsF;aACtE,iBAAiB,EAAE,GAAG,GAAG,KAAK,GAAG,IAAI;IA3DvD,MAAM,CAAC,GAAG,CAAC,EACT,WAAW,EACX,aAAa,EACb,QAAQ,EACR,UAAU,EACV,UAAU,EACV,SAAgB,EAChB,aAAoB,EACpB,OAAc,EACd,QAAa,EACb,iBAAwB,GACzB,EAAE;QACD,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,iBAAiB,CAAC;QAC9B,UAAU,EAAE,UAAU,CAAC;QACvB,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;QAC7B,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;QACrC,yEAAyE;QACzE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC;QACpC,sFAAsF;QACtF,iBAAiB,CAAC,EAAE,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC;KACxC;IAeD,OAAO;CAsBR;AAED,6CAA6C;AAC7C,MAAM,MAAM,aAAa,GAAG;IAC1B,uCAAuC;IACvC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,8BAA8B;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,kCAAkC;IAClC,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,oCAAoC;AACpC,MAAM,MAAM,SAAS,GAAG;IAGtB,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,wCAAwC;IACxC,cAAc,EAAE,cAAc,CAAC;IAC/B,2CAA2C;IAC3C,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB,CAAC;AAEF,gCAAgC;AAChC,MAAM,MAAM,aAAa,GAAG;IAC1B,2BAA2B;IAC3B,GAAG,EAAE,iBAAiB,CAAC;IACvB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB,CAAC"}
|
|
@@ -15,10 +15,11 @@ export class JamConfig {
|
|
|
15
15
|
pvmBackend;
|
|
16
16
|
dev;
|
|
17
17
|
network;
|
|
18
|
+
rpcPort;
|
|
18
19
|
ancestry;
|
|
19
20
|
devValidatorIndex;
|
|
20
|
-
static new({ isAuthoring, isFastForward, nodeName, nodeConfig, pvmBackend, devConfig = null, networkConfig = null, ancestry = [], devValidatorIndex = null, }) {
|
|
21
|
-
return new JamConfig(isAuthoring ?? false, isFastForward ?? false, nodeName, nodeConfig, pvmBackend, devConfig, networkConfig, ancestry, devValidatorIndex);
|
|
21
|
+
static new({ isAuthoring, isFastForward, nodeName, nodeConfig, pvmBackend, devConfig = null, networkConfig = null, rpcPort = null, ancestry = [], devValidatorIndex = null, }) {
|
|
22
|
+
return new JamConfig(isAuthoring ?? false, isFastForward ?? false, nodeName, nodeConfig, pvmBackend, devConfig, networkConfig, rpcPort, ancestry, devValidatorIndex);
|
|
22
23
|
}
|
|
23
24
|
constructor(
|
|
24
25
|
/** Whether we should be authoring blocks. */
|
|
@@ -35,6 +36,8 @@ export class JamConfig {
|
|
|
35
36
|
dev,
|
|
36
37
|
/** Networking options. */
|
|
37
38
|
network,
|
|
39
|
+
/** RPC WebSocket port. When set, an in-process RPC server is started. */
|
|
40
|
+
rpcPort,
|
|
38
41
|
/** Optional pre-genesis ancestry information. */
|
|
39
42
|
ancestry,
|
|
40
43
|
/** Validator index for dev mode authorship. Use "all" to author as all validators. */
|
|
@@ -46,6 +49,7 @@ export class JamConfig {
|
|
|
46
49
|
this.pvmBackend = pvmBackend;
|
|
47
50
|
this.dev = dev;
|
|
48
51
|
this.network = network;
|
|
52
|
+
this.rpcPort = rpcPort;
|
|
49
53
|
this.ancestry = ancestry;
|
|
50
54
|
this.devValidatorIndex = devValidatorIndex;
|
|
51
55
|
}
|
|
@@ -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;AAqBF;;;;;;;;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,CA6LrH"}
|
|
@@ -15,8 +15,7 @@ const logger = Logger.new(import.meta.filename, "fuzztarget");
|
|
|
15
15
|
/** Dedicated subdirectory under the configured base path that the fuzzer owns and wipes. */
|
|
16
16
|
const FUZZ_DB_SUBDIR = "typeberry-fuzz-db";
|
|
17
17
|
const FUZZ_DB_FJALL = "fjall-hybrid";
|
|
18
|
-
const
|
|
19
|
-
const FUZZ_DB_OPTIONS = [FUZZ_DB_FJALL, FUZZ_DB_LMDB];
|
|
18
|
+
const FUZZ_DB_OPTIONS = [FUZZ_DB_FJALL, "fjall"];
|
|
20
19
|
/** Subdirectory (under the fuzzer's db dir) holding the reused fjall values keyspace. */
|
|
21
20
|
const FUZZ_FJALL_VALUES_SUBDIR = "values-session";
|
|
22
21
|
/**
|
|
@@ -25,6 +24,8 @@ const FUZZ_FJALL_VALUES_SUBDIR = "values-session";
|
|
|
25
24
|
* the resident memory bounded.
|
|
26
25
|
*/
|
|
27
26
|
const FUZZ_FJALL_CACHE_BYTES = 128 * 1024 * 1024;
|
|
27
|
+
/** Rebuild the fjall-hybrid values session every N resets to limit LSM read amplification. */
|
|
28
|
+
const REBUILD_FJALL_SESSION_EVERY = 50;
|
|
28
29
|
/**
|
|
29
30
|
* Resolve the directory the fuzzer should use for its on-disk database, or
|
|
30
31
|
* `undefined` for an in-memory database. The dedicated `FUZZ_DB_SUBDIR` is
|
|
@@ -62,7 +63,6 @@ export async function mainFuzz(fuzzConfig, withRelPath) {
|
|
|
62
63
|
const { jamNodeConfig: config } = fuzzConfig;
|
|
63
64
|
const fuzzDbBase = resolveFuzzDbBase(config.node.databaseBasePath);
|
|
64
65
|
const rawFuzzDb = process.env.JAM_FUZZ_DB?.trim() ?? "";
|
|
65
|
-
// Using experimental fjall-hybrid by default, with an option to test lmdb as well.
|
|
66
66
|
const hybridStateBackend = rawFuzzDb === "" ? FUZZ_DB_FJALL : rawFuzzDb;
|
|
67
67
|
if (!isValidStateBackend(hybridStateBackend)) {
|
|
68
68
|
throw new Error(`JAM_FUZZ_DB must be one of: ${FUZZ_DB_OPTIONS} (got: "${rawFuzzDb}").`);
|
|
@@ -75,6 +75,8 @@ export async function mainFuzz(fuzzConfig, withRelPath) {
|
|
|
75
75
|
// every reset, because opening it is the slow part. Only the in-memory blocks
|
|
76
76
|
// and leaf sets are rebuilt for each vector. fjall-hybrid only.
|
|
77
77
|
let fjallSession = null;
|
|
78
|
+
// Track how many times resetState has been called for periodic fjall session rebuilds.
|
|
79
|
+
let resetCount = 0;
|
|
78
80
|
// Set when close() starts. Guards resetState so a fuzz command arriving
|
|
79
81
|
// mid-shutdown can't build a fresh node that close() then orphans.
|
|
80
82
|
let isClosing = false;
|
|
@@ -112,6 +114,8 @@ export async function mainFuzz(fuzzConfig, withRelPath) {
|
|
|
112
114
|
runningNode = null;
|
|
113
115
|
await finish;
|
|
114
116
|
}
|
|
117
|
+
// Increment reset counter for periodic fjall session rebuilds.
|
|
118
|
+
resetCount++;
|
|
115
119
|
const buildNode = (databaseBasePath) => {
|
|
116
120
|
const isPersistent = databaseBasePath !== undefined;
|
|
117
121
|
return mainImporter({
|
|
@@ -138,36 +142,45 @@ export async function mainFuzz(fuzzConfig, withRelPath) {
|
|
|
138
142
|
// also turns on compression further down, so the big values do not grow the
|
|
139
143
|
// db too much. Tiny stays uncompressed, its db is small and speed matters more.
|
|
140
144
|
ephemeral: isPersistent,
|
|
141
|
-
stateBackend: isPersistent ? hybridStateBackend : "
|
|
145
|
+
stateBackend: isPersistent ? hybridStateBackend : "fjall",
|
|
142
146
|
// Reuse the session keyspace (fjall-hybrid only, other backends
|
|
143
147
|
// ignore it). Nothing to pass for the in-memory fallback.
|
|
144
|
-
sharedFjallSession:
|
|
148
|
+
sharedFjallSession: hybridStateBackend === "fjall-hybrid" ? (fjallSession ?? undefined) : undefined,
|
|
145
149
|
});
|
|
146
150
|
};
|
|
147
151
|
if (fuzzDbBase !== undefined) {
|
|
148
152
|
try {
|
|
149
153
|
if (hybridStateBackend === FUZZ_DB_FJALL) {
|
|
150
|
-
// fjall-hybrid:
|
|
151
|
-
//
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
// every reset, not from the values store, so reusing it does not
|
|
156
|
-
// resume the previous run.
|
|
157
|
-
if (fjallSession === null) {
|
|
158
|
-
// Start from a clean slate once, then keep the keyspace open.
|
|
154
|
+
// fjall-hybrid: manage a reused values session.
|
|
155
|
+
// Rebuild it periodically to avoid LSM read amplification.
|
|
156
|
+
const fjallSessionPath = `${withRelPath(fuzzDbBase)}/${FUZZ_FJALL_VALUES_SUBDIR}`;
|
|
157
|
+
if (resetCount === 1) {
|
|
158
|
+
// First reset: start from a clean slate.
|
|
159
159
|
await wipeFuzzDb(fuzzDbBase);
|
|
160
|
-
fjallSession = await FjallValuesSession.open(
|
|
160
|
+
fjallSession = await FjallValuesSession.open(fjallSessionPath, {
|
|
161
|
+
ephemeral: true,
|
|
162
|
+
cacheSizeBytes: FUZZ_FJALL_CACHE_BYTES,
|
|
163
|
+
});
|
|
164
|
+
logger.info `🗄️ Opened reusable fjall values session at ${fjallSessionPath}`;
|
|
165
|
+
}
|
|
166
|
+
if (resetCount % REBUILD_FJALL_SESSION_EVERY === 0 && fjallSession !== null) {
|
|
167
|
+
// Periodic rebuild: close, wipe session dir, and reopen.
|
|
168
|
+
const session = fjallSession;
|
|
169
|
+
fjallSession = null;
|
|
170
|
+
await session.close().catch(() => { });
|
|
171
|
+
await wipeFuzzDb(fjallSessionPath).catch(() => { });
|
|
172
|
+
}
|
|
173
|
+
if (fjallSession === null) {
|
|
174
|
+
// No active session: create a fresh one.
|
|
175
|
+
fjallSession = await FjallValuesSession.open(fjallSessionPath, {
|
|
161
176
|
ephemeral: true,
|
|
162
177
|
cacheSizeBytes: FUZZ_FJALL_CACHE_BYTES,
|
|
163
178
|
});
|
|
164
|
-
logger.info `🗄️ Opened reusable fjall values session at ${
|
|
179
|
+
logger.info `🗄️ Opened reusable fjall values session at ${fjallSessionPath}`;
|
|
165
180
|
}
|
|
166
181
|
}
|
|
167
182
|
else {
|
|
168
|
-
//
|
|
169
|
-
// reset. A fresh db each reset makes `initializeDatabase` set up
|
|
170
|
-
// genesis again instead of resuming the previous run.
|
|
183
|
+
// Other backends ("fjall"): wipe and reopen on every reset.
|
|
171
184
|
await wipeFuzzDb(fuzzDbBase);
|
|
172
185
|
}
|
|
173
186
|
runningNode = await buildNode(fuzzDbBase);
|