@typeberry/jam 0.1.1-b537c8b → 0.1.1-e48de40
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/block-generator/index.js +132 -94
- package/block-generator/index.js.map +1 -1
- package/importer/index.js +214 -176
- package/importer/index.js.map +1 -1
- package/index.js +374 -340
- package/index.js.map +1 -1
- package/jam-network/index.js +198 -162
- package/jam-network/index.js.map +1 -1
- package/package.json +4 -2
package/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
1
2
|
import './sourcemap-register.cjs';import { createRequire as __WEBPACK_EXTERNAL_createRequire } from "module";
|
|
2
3
|
import * as __WEBPACK_EXTERNAL_MODULE_lmdb__ from "lmdb";
|
|
3
4
|
/******/ var __webpack_modules__ = ({
|
|
@@ -28434,6 +28435,34 @@ class WithDebug {
|
|
|
28434
28435
|
}
|
|
28435
28436
|
}
|
|
28436
28437
|
|
|
28438
|
+
;// CONCATENATED MODULE: ./packages/core/utils/dev.ts
|
|
28439
|
+
const dev_env = typeof process === "undefined" ? {} : process.env;
|
|
28440
|
+
/**
|
|
28441
|
+
* The function will produce relative path resolver that is adjusted
|
|
28442
|
+
* for package location within the workspace.
|
|
28443
|
+
*
|
|
28444
|
+
* Example:
|
|
28445
|
+
* $ npm start -w @typeberry/jam
|
|
28446
|
+
*
|
|
28447
|
+
* The above command will run `./bin/jam/index.js`, however we would
|
|
28448
|
+
* still want relative paths to be resolved according to top-level workspace
|
|
28449
|
+
* directory.
|
|
28450
|
+
*
|
|
28451
|
+
* So the caller, passes the absolute workspace path as argument and get's
|
|
28452
|
+
* a function that can properly resolve relative paths.
|
|
28453
|
+
*
|
|
28454
|
+
* NOTE: the translation happens only for development build! When
|
|
28455
|
+
* we build a single library from our project, we no longer mangle the paths.
|
|
28456
|
+
*/
|
|
28457
|
+
const workspacePathFix = dev_env.NODE_ENV === "development"
|
|
28458
|
+
? (workspacePath) => (p) => {
|
|
28459
|
+
if (p.startsWith("/")) {
|
|
28460
|
+
return p;
|
|
28461
|
+
}
|
|
28462
|
+
return `${workspacePath}/${p}`;
|
|
28463
|
+
}
|
|
28464
|
+
: () => (p) => p;
|
|
28465
|
+
|
|
28437
28466
|
;// CONCATENATED MODULE: ./packages/core/utils/opaque.ts
|
|
28438
28467
|
/**
|
|
28439
28468
|
* @fileoverview `Opaque<Type, Token>` constructs a unique type which is a subset of Type with a
|
|
@@ -28777,6 +28806,7 @@ function isResult(x) {
|
|
|
28777
28806
|
|
|
28778
28807
|
|
|
28779
28808
|
|
|
28809
|
+
|
|
28780
28810
|
;// CONCATENATED MODULE: ./packages/core/bytes/bitvec.ts
|
|
28781
28811
|
|
|
28782
28812
|
/**
|
|
@@ -35148,6 +35178,23 @@ function parseLevel(lvl) {
|
|
|
35148
35178
|
;// CONCATENATED MODULE: ./packages/core/logger/console.ts
|
|
35149
35179
|
// biome-ignore-all lint/suspicious/noConsole: logger
|
|
35150
35180
|
|
|
35181
|
+
function print(level, levelAndName, strings, data) {
|
|
35182
|
+
if (level < levelAndName[0]) {
|
|
35183
|
+
return;
|
|
35184
|
+
}
|
|
35185
|
+
const lvlText = Level[level].padEnd(5);
|
|
35186
|
+
const val = strings.map((v, idx) => `${v}${data[idx]}`);
|
|
35187
|
+
const msg = `${lvlText} [${levelAndName[1]}] ${val}`;
|
|
35188
|
+
if (level === Level.WARN) {
|
|
35189
|
+
console.warn(msg);
|
|
35190
|
+
}
|
|
35191
|
+
else if (level === Level.ERROR) {
|
|
35192
|
+
console.error(msg);
|
|
35193
|
+
}
|
|
35194
|
+
else {
|
|
35195
|
+
console.info(msg);
|
|
35196
|
+
}
|
|
35197
|
+
}
|
|
35151
35198
|
/** An optimized logger that ignores `TRACE`, `DEBUG` and `LOG` messages.
|
|
35152
35199
|
*
|
|
35153
35200
|
* Use the `create` method to instantiate the right instance of a more specialized logger.
|
|
@@ -35178,109 +35225,91 @@ class ConsoleTransport {
|
|
|
35178
35225
|
constructor(options) {
|
|
35179
35226
|
this.options = options;
|
|
35180
35227
|
}
|
|
35181
|
-
insane(
|
|
35228
|
+
insane(_levelAndName, _strings, _data) {
|
|
35182
35229
|
/* no-op */
|
|
35183
35230
|
}
|
|
35184
|
-
trace(
|
|
35231
|
+
trace(_levelAndName, _strings, _data) {
|
|
35185
35232
|
/* no-op */
|
|
35186
35233
|
}
|
|
35187
|
-
log(
|
|
35234
|
+
log(_levelAndName, _strings, _data) {
|
|
35188
35235
|
/* no-op */
|
|
35189
35236
|
}
|
|
35190
|
-
info(
|
|
35237
|
+
info(_levelAndName, _strings, _data) {
|
|
35191
35238
|
/* no-op */
|
|
35192
35239
|
}
|
|
35193
|
-
warn(
|
|
35194
|
-
|
|
35240
|
+
warn(levelAndName, strings, data) {
|
|
35241
|
+
print(Level.WARN, levelAndName, strings, data);
|
|
35195
35242
|
}
|
|
35196
|
-
error(
|
|
35197
|
-
|
|
35198
|
-
}
|
|
35199
|
-
push(level, moduleName, val) {
|
|
35200
|
-
const shortModule = moduleName.replace(this.options.workingDir, "");
|
|
35201
|
-
const configuredLevel = findLevel(this.options, moduleName);
|
|
35202
|
-
const lvlText = Level[level].padEnd(5);
|
|
35203
|
-
if (level < configuredLevel) {
|
|
35204
|
-
return;
|
|
35205
|
-
}
|
|
35206
|
-
const msg = `${lvlText} [${shortModule}] ${val}`;
|
|
35207
|
-
if (level === Level.WARN) {
|
|
35208
|
-
console.warn(msg);
|
|
35209
|
-
}
|
|
35210
|
-
else if (level === Level.ERROR) {
|
|
35211
|
-
console.error(msg);
|
|
35212
|
-
}
|
|
35213
|
-
else {
|
|
35214
|
-
console.info(msg);
|
|
35215
|
-
}
|
|
35243
|
+
error(levelAndName, strings, data) {
|
|
35244
|
+
print(Level.ERROR, levelAndName, strings, data);
|
|
35216
35245
|
}
|
|
35217
35246
|
}
|
|
35218
35247
|
/**
|
|
35219
35248
|
* Insane version of console logger - supports insane level.
|
|
35220
35249
|
*/
|
|
35221
35250
|
class InsaneConsoleLogger extends ConsoleTransport {
|
|
35222
|
-
insane(
|
|
35223
|
-
|
|
35251
|
+
insane(levelAndName, strings, data) {
|
|
35252
|
+
print(Level.INSANE, levelAndName, strings, data);
|
|
35224
35253
|
}
|
|
35225
|
-
trace(
|
|
35226
|
-
|
|
35254
|
+
trace(levelAndName, strings, data) {
|
|
35255
|
+
print(Level.TRACE, levelAndName, strings, data);
|
|
35227
35256
|
}
|
|
35228
|
-
log(
|
|
35229
|
-
|
|
35257
|
+
log(levelAndName, strings, data) {
|
|
35258
|
+
print(Level.LOG, levelAndName, strings, data);
|
|
35230
35259
|
}
|
|
35231
|
-
info(
|
|
35232
|
-
|
|
35260
|
+
info(levelAndName, strings, data) {
|
|
35261
|
+
print(Level.INFO, levelAndName, strings, data);
|
|
35233
35262
|
}
|
|
35234
35263
|
}
|
|
35235
35264
|
/**
|
|
35236
35265
|
* A basic version of console logger - printing everything.
|
|
35237
35266
|
*/
|
|
35238
35267
|
class TraceConsoleTransport extends ConsoleTransport {
|
|
35239
|
-
insane(
|
|
35268
|
+
insane(_levelAndName, _strings, _data) {
|
|
35240
35269
|
/* no-op */
|
|
35241
35270
|
}
|
|
35242
|
-
trace(
|
|
35243
|
-
|
|
35271
|
+
trace(levelAndName, strings, data) {
|
|
35272
|
+
print(Level.TRACE, levelAndName, strings, data);
|
|
35244
35273
|
}
|
|
35245
|
-
log(
|
|
35246
|
-
|
|
35274
|
+
log(levelAndName, strings, data) {
|
|
35275
|
+
print(Level.LOG, levelAndName, strings, data);
|
|
35247
35276
|
}
|
|
35248
|
-
info(
|
|
35249
|
-
|
|
35277
|
+
info(levelAndName, strings, data) {
|
|
35278
|
+
print(Level.INFO, levelAndName, strings, data);
|
|
35250
35279
|
}
|
|
35251
35280
|
}
|
|
35252
35281
|
/**
|
|
35253
35282
|
* An optimized version of the logger - completely ignores `TRACE` level calls.
|
|
35254
35283
|
*/
|
|
35255
35284
|
class LogConsoleTransport extends ConsoleTransport {
|
|
35256
|
-
insane(
|
|
35285
|
+
insane(_levelAndName, _strings, _data) {
|
|
35257
35286
|
/* no-op */
|
|
35258
35287
|
}
|
|
35259
|
-
trace(
|
|
35288
|
+
trace(_levelAndName, _strings, _data) {
|
|
35260
35289
|
/* no-op */
|
|
35261
35290
|
}
|
|
35262
|
-
log(
|
|
35263
|
-
|
|
35291
|
+
log(levelAndName, strings, data) {
|
|
35292
|
+
print(Level.LOG, levelAndName, strings, data);
|
|
35264
35293
|
}
|
|
35265
|
-
info(
|
|
35266
|
-
|
|
35294
|
+
info(levelAndName, strings, data) {
|
|
35295
|
+
print(Level.INFO, levelAndName, strings, data);
|
|
35267
35296
|
}
|
|
35268
35297
|
}
|
|
35269
35298
|
/**
|
|
35270
35299
|
* An optimized version of the logger - completely ignores `TRACE` & `DEBUG` level calls.
|
|
35271
35300
|
*/
|
|
35272
35301
|
class InfoConsoleTransport extends ConsoleTransport {
|
|
35273
|
-
insane(
|
|
35302
|
+
insane(_levelAndName, _strings, _data) {
|
|
35274
35303
|
/* no-op */
|
|
35275
35304
|
}
|
|
35276
|
-
trace(
|
|
35305
|
+
trace(_levelAndName, _strings, _data) {
|
|
35277
35306
|
/* no-op */
|
|
35278
35307
|
}
|
|
35279
|
-
log(
|
|
35308
|
+
log(_levelAndName, _strings, _data) {
|
|
35280
35309
|
/* no-op */
|
|
35281
35310
|
}
|
|
35282
|
-
info(
|
|
35283
|
-
|
|
35311
|
+
info(levelAndName, strings, data) {
|
|
35312
|
+
print(Level.INFO, levelAndName, strings, data);
|
|
35284
35313
|
}
|
|
35285
35314
|
}
|
|
35286
35315
|
|
|
@@ -35317,11 +35346,6 @@ class Logger {
|
|
|
35317
35346
|
const module = moduleName ?? fName;
|
|
35318
35347
|
return new Logger(module.padStart(8, " "), GLOBAL_CONFIG);
|
|
35319
35348
|
}
|
|
35320
|
-
/**
|
|
35321
|
-
* Return currently configured level for given module. */
|
|
35322
|
-
static getLevel(moduleName) {
|
|
35323
|
-
return findLevel(GLOBAL_CONFIG.options, moduleName);
|
|
35324
|
-
}
|
|
35325
35349
|
/**
|
|
35326
35350
|
* Global configuration of all loggers.
|
|
35327
35351
|
*
|
|
@@ -35352,33 +35376,46 @@ class Logger {
|
|
|
35352
35376
|
const options = parseLoggerOptions(input, defaultLevel, workingDir);
|
|
35353
35377
|
Logger.configureAllFromOptions(options);
|
|
35354
35378
|
}
|
|
35379
|
+
cachedLevelAndName;
|
|
35355
35380
|
constructor(moduleName, config) {
|
|
35356
35381
|
this.moduleName = moduleName;
|
|
35357
35382
|
this.config = config;
|
|
35358
35383
|
}
|
|
35384
|
+
/** Return currently configured level for given module. */
|
|
35385
|
+
getLevel() {
|
|
35386
|
+
return this.getLevelAndName()[0];
|
|
35387
|
+
}
|
|
35388
|
+
getLevelAndName() {
|
|
35389
|
+
if (this.cachedLevelAndName === undefined) {
|
|
35390
|
+
const level = findLevel(this.config.options, this.moduleName);
|
|
35391
|
+
const shortName = this.moduleName.replace(this.config.options.workingDir, "");
|
|
35392
|
+
this.cachedLevelAndName = [level, shortName];
|
|
35393
|
+
}
|
|
35394
|
+
return this.cachedLevelAndName;
|
|
35395
|
+
}
|
|
35359
35396
|
/** Log a message with `INSANE` level. */
|
|
35360
|
-
insane(
|
|
35361
|
-
this.config.transport.insane(this.
|
|
35397
|
+
insane(strings, ...data) {
|
|
35398
|
+
this.config.transport.insane(this.getLevelAndName(), strings, data);
|
|
35362
35399
|
}
|
|
35363
35400
|
/** Log a message with `TRACE` level. */
|
|
35364
|
-
trace(
|
|
35365
|
-
this.config.transport.trace(this.
|
|
35401
|
+
trace(strings, ...data) {
|
|
35402
|
+
this.config.transport.trace(this.getLevelAndName(), strings, data);
|
|
35366
35403
|
}
|
|
35367
35404
|
/** Log a message with `DEBUG`/`LOG` level. */
|
|
35368
|
-
log(
|
|
35369
|
-
this.config.transport.log(this.
|
|
35405
|
+
log(strings, ...data) {
|
|
35406
|
+
this.config.transport.log(this.getLevelAndName(), strings, data);
|
|
35370
35407
|
}
|
|
35371
35408
|
/** Log a message with `INFO` level. */
|
|
35372
|
-
info(
|
|
35373
|
-
this.config.transport.info(this.
|
|
35409
|
+
info(strings, ...data) {
|
|
35410
|
+
this.config.transport.info(this.getLevelAndName(), strings, data);
|
|
35374
35411
|
}
|
|
35375
35412
|
/** Log a message with `WARN` level. */
|
|
35376
|
-
warn(
|
|
35377
|
-
this.config.transport.warn(this.
|
|
35413
|
+
warn(strings, ...data) {
|
|
35414
|
+
this.config.transport.warn(this.getLevelAndName(), strings, data);
|
|
35378
35415
|
}
|
|
35379
35416
|
/** Log a message with `ERROR` level. */
|
|
35380
|
-
error(
|
|
35381
|
-
this.config.transport.error(this.
|
|
35417
|
+
error(strings, ...data) {
|
|
35418
|
+
this.config.transport.error(this.getLevelAndName(), strings, data);
|
|
35382
35419
|
}
|
|
35383
35420
|
}
|
|
35384
35421
|
|
|
@@ -35468,15 +35505,15 @@ class NodeConfiguration {
|
|
|
35468
35505
|
}
|
|
35469
35506
|
function loadConfig(configPath) {
|
|
35470
35507
|
if (configPath === DEFAULT_CONFIG) {
|
|
35471
|
-
logger.log
|
|
35508
|
+
logger.log `🔧 Loading DEFAULT config`;
|
|
35472
35509
|
return parseFromJson(configs.default, NodeConfiguration.fromJson);
|
|
35473
35510
|
}
|
|
35474
35511
|
if (configPath === DEV_CONFIG) {
|
|
35475
|
-
logger.log
|
|
35512
|
+
logger.log `🔧 Loading DEV config`;
|
|
35476
35513
|
return parseFromJson(configs.dev, NodeConfiguration.fromJson);
|
|
35477
35514
|
}
|
|
35478
35515
|
try {
|
|
35479
|
-
logger.log
|
|
35516
|
+
logger.log `🔧 Loading config from ${configPath}`;
|
|
35480
35517
|
const configFile = external_node_fs_default().readFileSync(configPath, "utf8");
|
|
35481
35518
|
const parsed = JSON.parse(configFile);
|
|
35482
35519
|
return parseFromJson(parsed, NodeConfiguration.fromJson);
|
|
@@ -39182,7 +39219,7 @@ class LmdbStates {
|
|
|
39182
39219
|
await Promise.all([valuesWrite, statesWrite]);
|
|
39183
39220
|
}
|
|
39184
39221
|
catch (e) {
|
|
39185
|
-
states_logger.error
|
|
39222
|
+
states_logger.error `${e}`;
|
|
39186
39223
|
return result_Result.error(StateUpdateError.Commit);
|
|
39187
39224
|
}
|
|
39188
39225
|
return result_Result.ok(result_OK);
|
|
@@ -39251,7 +39288,7 @@ function openDatabase(nodeName, genesisHeader, databaseBasePath, { readOnly = fa
|
|
|
39251
39288
|
const genesisHeaderHash = hashBytes(genesisHeader).asOpaque();
|
|
39252
39289
|
const genesisHeaderHashNibbles = genesisHeaderHash.toString().substring(2, 10);
|
|
39253
39290
|
const dbPath = `${databaseBasePath}/${nodeNameHash}/${genesisHeaderHashNibbles}`;
|
|
39254
|
-
common_logger.info
|
|
39291
|
+
common_logger.info `🛢️ Opening database at ${dbPath}`;
|
|
39255
39292
|
try {
|
|
39256
39293
|
return {
|
|
39257
39294
|
dbPath,
|
|
@@ -39273,21 +39310,21 @@ async function initializeDatabase(spec, genesisHeaderHash, rootDb, config, ances
|
|
|
39273
39310
|
const states = new LmdbStates(spec, rootDb);
|
|
39274
39311
|
const header = blocks.getBestHeaderHash();
|
|
39275
39312
|
const state = blocks.getPostStateRoot(header);
|
|
39276
|
-
common_logger.log
|
|
39277
|
-
common_logger.log
|
|
39313
|
+
common_logger.log `🛢️ Best header hash: ${header}`;
|
|
39314
|
+
common_logger.log `🛢️ Best state root: ${state}`;
|
|
39278
39315
|
// DB seems already initialized, just go with what we have.
|
|
39279
39316
|
const isDbInitialized = state !== null && !state.isEqualTo(bytes_Bytes.zero(hash_HASH_SIZE)) && !header.isEqualTo(bytes_Bytes.zero(hash_HASH_SIZE));
|
|
39280
39317
|
if (isDbInitialized) {
|
|
39281
39318
|
await rootDb.db.close();
|
|
39282
39319
|
return;
|
|
39283
39320
|
}
|
|
39284
|
-
common_logger.log
|
|
39321
|
+
common_logger.log `🛢️ Database looks fresh. Initializing.`;
|
|
39285
39322
|
// looks like a fresh db, initialize the state.
|
|
39286
39323
|
const genesisHeader = decoder_Decoder.decodeObject(Header.Codec, config.genesisHeader, spec);
|
|
39287
39324
|
const genesisExtrinsic = emptyBlock().extrinsic;
|
|
39288
39325
|
const genesisBlock = Block.create({ header: genesisHeader, extrinsic: genesisExtrinsic });
|
|
39289
39326
|
const blockView = blockAsView(genesisBlock, spec);
|
|
39290
|
-
common_logger.log
|
|
39327
|
+
common_logger.log `🧬 Writing genesis block #${genesisHeader.timeSlotIndex}: ${genesisHeaderHash}`;
|
|
39291
39328
|
const { genesisStateSerialized, genesisStateRootHash } = loadGenesisState(spec, config.genesisState);
|
|
39292
39329
|
// write to db
|
|
39293
39330
|
await blocks.insertBlock(new WithHash(genesisHeaderHash, blockView));
|
|
@@ -39305,7 +39342,7 @@ function loadGenesisState(spec, data) {
|
|
|
39305
39342
|
const stateEntries = state_entries_StateEntries.fromEntriesUnsafe(data.entries());
|
|
39306
39343
|
const state = serialized_state_SerializedState.fromStateEntries(spec, stateEntries);
|
|
39307
39344
|
const genesisStateRootHash = stateEntries.getRootHash();
|
|
39308
|
-
common_logger.info
|
|
39345
|
+
common_logger.info `🧬 Genesis state root: ${genesisStateRootHash}`;
|
|
39309
39346
|
return {
|
|
39310
39347
|
genesisState: state,
|
|
39311
39348
|
genesisStateSerialized: stateEntries,
|
|
@@ -39444,7 +39481,7 @@ class TypedPort {
|
|
|
39444
39481
|
this.dispatchPortMessage(msg);
|
|
39445
39482
|
}
|
|
39446
39483
|
catch (e) {
|
|
39447
|
-
port_logger.error
|
|
39484
|
+
port_logger.error `[${this.constructor.name}] Failed to dispatch a message: ${e}: ${msg}`;
|
|
39448
39485
|
throw e;
|
|
39449
39486
|
}
|
|
39450
39487
|
});
|
|
@@ -39518,7 +39555,7 @@ class TypedPort {
|
|
|
39518
39555
|
this.port.postMessage(msg, transferList);
|
|
39519
39556
|
}
|
|
39520
39557
|
catch (e) {
|
|
39521
|
-
port_logger.error
|
|
39558
|
+
port_logger.error `[${this.constructor.name}] Failed to post a message: ${e}: ${msg}`;
|
|
39522
39559
|
throw e;
|
|
39523
39560
|
}
|
|
39524
39561
|
}
|
|
@@ -39549,7 +39586,7 @@ class TypedPort {
|
|
|
39549
39586
|
cleanup(reason) {
|
|
39550
39587
|
// resolve all pending requests with an error.
|
|
39551
39588
|
const responseListeners = this.responseListeners.eventNames();
|
|
39552
|
-
for (const ev
|
|
39589
|
+
for (const ev of responseListeners) {
|
|
39553
39590
|
this.responseListeners.emit(ev, new Error(`port is ${reason}`));
|
|
39554
39591
|
}
|
|
39555
39592
|
}
|
|
@@ -39598,7 +39635,7 @@ class MessageChannelStateMachine {
|
|
|
39598
39635
|
this.dispatchSignal(name, data);
|
|
39599
39636
|
}
|
|
39600
39637
|
catch (e) {
|
|
39601
|
-
channel_logger.error
|
|
39638
|
+
channel_logger.error `[${this.constructor.name}] Unable to dispatch signal (${name}): ${e}. ${this.stateInfo(remoteState)}`;
|
|
39602
39639
|
throw e;
|
|
39603
39640
|
}
|
|
39604
39641
|
});
|
|
@@ -39607,7 +39644,7 @@ class MessageChannelStateMachine {
|
|
|
39607
39644
|
await this.dispatchRequest(name, data, msg);
|
|
39608
39645
|
}
|
|
39609
39646
|
catch (e) {
|
|
39610
|
-
channel_logger.error
|
|
39647
|
+
channel_logger.error `[${this.constructor.name}] Unable to dispatch request (${name}): ${e}. ${this.stateInfo(remoteState)}`;
|
|
39611
39648
|
throw e;
|
|
39612
39649
|
}
|
|
39613
39650
|
});
|
|
@@ -39693,7 +39730,7 @@ class MessageChannelStateMachine {
|
|
|
39693
39730
|
this.machine.transition(res.transitionTo.state, res.transitionTo.data);
|
|
39694
39731
|
}
|
|
39695
39732
|
if (didStateChangeInMeantime) {
|
|
39696
|
-
channel_logger.warn
|
|
39733
|
+
channel_logger.warn `Ignoring obsolete response for an old request: "${name}"`;
|
|
39697
39734
|
return;
|
|
39698
39735
|
}
|
|
39699
39736
|
return this.port.respond(prevState.stateName, msg, res.response);
|
|
@@ -39709,7 +39746,7 @@ class MessageChannelStateMachine {
|
|
|
39709
39746
|
}
|
|
39710
39747
|
}
|
|
39711
39748
|
transitionTo() {
|
|
39712
|
-
channel_logger.trace
|
|
39749
|
+
channel_logger.trace `[${this.machine.name}] transitioned to ${this.currentState()}`;
|
|
39713
39750
|
return this;
|
|
39714
39751
|
}
|
|
39715
39752
|
/**
|
|
@@ -39729,7 +39766,7 @@ class MessageChannelStateMachine {
|
|
|
39729
39766
|
await promise;
|
|
39730
39767
|
}
|
|
39731
39768
|
catch (e) {
|
|
39732
|
-
channel_logger.error
|
|
39769
|
+
channel_logger.error `${e}`;
|
|
39733
39770
|
}
|
|
39734
39771
|
return new MessageChannelStateMachine(machine, port);
|
|
39735
39772
|
}
|
|
@@ -39932,7 +39969,7 @@ class State {
|
|
|
39932
39969
|
* actions.
|
|
39933
39970
|
*/
|
|
39934
39971
|
onActivation(data) {
|
|
39935
|
-
state_logger.trace
|
|
39972
|
+
state_logger.trace `[${this.constructor.name}] Changing state to: ${this}`;
|
|
39936
39973
|
this.data = data;
|
|
39937
39974
|
}
|
|
39938
39975
|
/**
|
|
@@ -40030,7 +40067,7 @@ async function spawnWorkerGeneric(bootstrapPath, logger, mainReadyName, mainRead
|
|
|
40030
40067
|
const worker = new external_node_worker_threads_namespaceObject.Worker(bootstrapPath);
|
|
40031
40068
|
const machine = stateMachineMain(`main->${mainReadyName}`, mainReadyName, mainReadyState);
|
|
40032
40069
|
const channel = await MessageChannelStateMachine.createAndTransferChannel(machine, worker);
|
|
40033
|
-
logger.trace
|
|
40070
|
+
logger.trace `[${machine.name}] Worker spawned ${channel.currentState()}`;
|
|
40034
40071
|
return channel;
|
|
40035
40072
|
}
|
|
40036
40073
|
|
|
@@ -40143,7 +40180,7 @@ class MainReady extends State {
|
|
|
40143
40180
|
if (res instanceof Uint8Array) {
|
|
40144
40181
|
return bytes_Bytes.fromBlob(res, hash_HASH_SIZE).asOpaque();
|
|
40145
40182
|
}
|
|
40146
|
-
state_machine_logger.error
|
|
40183
|
+
state_machine_logger.error `Invalid response for getBestStateRootHash. Expected Uint8Array, got: ${res}`;
|
|
40147
40184
|
return bytes_Bytes.zero(hash_HASH_SIZE).asOpaque();
|
|
40148
40185
|
}
|
|
40149
40186
|
finish(channel) {
|
|
@@ -40191,7 +40228,7 @@ class ImporterReady extends State {
|
|
|
40191
40228
|
}
|
|
40192
40229
|
async getStateEntries(hash) {
|
|
40193
40230
|
if (this.importer === null) {
|
|
40194
|
-
state_machine_logger.error
|
|
40231
|
+
state_machine_logger.error `${this.constructor.name} importer not initialized yet!`;
|
|
40195
40232
|
await new Promise((resolve) => {
|
|
40196
40233
|
this.onImporter.once(resolve);
|
|
40197
40234
|
});
|
|
@@ -40205,7 +40242,7 @@ class ImporterReady extends State {
|
|
|
40205
40242
|
response: encoded.raw,
|
|
40206
40243
|
};
|
|
40207
40244
|
}
|
|
40208
|
-
state_machine_logger.error
|
|
40245
|
+
state_machine_logger.error `${this.constructor.name} got invalid request type: ${JSON.stringify(hash)}.`;
|
|
40209
40246
|
return {
|
|
40210
40247
|
response: null,
|
|
40211
40248
|
};
|
|
@@ -40225,7 +40262,7 @@ class ImporterReady extends State {
|
|
|
40225
40262
|
}
|
|
40226
40263
|
async importBlock(block) {
|
|
40227
40264
|
if (this.importer === null) {
|
|
40228
|
-
state_machine_logger.error
|
|
40265
|
+
state_machine_logger.error `${this.constructor.name} importer not initialized yet!`;
|
|
40229
40266
|
await new Promise((resolve) => {
|
|
40230
40267
|
this.onImporter.once(resolve);
|
|
40231
40268
|
});
|
|
@@ -40245,8 +40282,8 @@ class ImporterReady extends State {
|
|
|
40245
40282
|
}
|
|
40246
40283
|
}
|
|
40247
40284
|
catch (e) {
|
|
40248
|
-
state_machine_logger.error
|
|
40249
|
-
state_machine_logger.error
|
|
40285
|
+
state_machine_logger.error `Failed to import block: ${e}`;
|
|
40286
|
+
state_machine_logger.error `${e instanceof Error ? e.stack : ""}`;
|
|
40250
40287
|
response = result_Result.error(`${e}`);
|
|
40251
40288
|
}
|
|
40252
40289
|
const encoded = encoder_Encoder.encodeObject(importBlockResultCodec, response);
|
|
@@ -40254,7 +40291,7 @@ class ImporterReady extends State {
|
|
|
40254
40291
|
response: encoded.raw,
|
|
40255
40292
|
};
|
|
40256
40293
|
}
|
|
40257
|
-
state_machine_logger.error
|
|
40294
|
+
state_machine_logger.error `${this.constructor.name} got invalid request type: ${JSON.stringify(block)}.`;
|
|
40258
40295
|
return {
|
|
40259
40296
|
response: null,
|
|
40260
40297
|
};
|
|
@@ -40266,7 +40303,7 @@ class ImporterReady extends State {
|
|
|
40266
40303
|
this.onBlock.emit(blockView);
|
|
40267
40304
|
}
|
|
40268
40305
|
else {
|
|
40269
|
-
state_machine_logger.error
|
|
40306
|
+
state_machine_logger.error `${this.constructor.name} got invalid signal type: ${JSON.stringify(block)}.`;
|
|
40270
40307
|
}
|
|
40271
40308
|
}
|
|
40272
40309
|
async endWork() {
|
|
@@ -40365,7 +40402,7 @@ class state_machine_MainReady extends State {
|
|
|
40365
40402
|
this.onNewBlocks.emit(blocks);
|
|
40366
40403
|
}
|
|
40367
40404
|
else {
|
|
40368
|
-
jam_network_state_machine_logger.error
|
|
40405
|
+
jam_network_state_machine_logger.error `${this.constructor.name} got invalid signal type: ${JSON.stringify(block)}.`;
|
|
40369
40406
|
}
|
|
40370
40407
|
}
|
|
40371
40408
|
announceHeader(port, header) {
|
|
@@ -40403,7 +40440,7 @@ class NetworkReady extends State {
|
|
|
40403
40440
|
this.onNewHeader.emit(decoded);
|
|
40404
40441
|
}
|
|
40405
40442
|
else {
|
|
40406
|
-
jam_network_state_machine_logger.error
|
|
40443
|
+
jam_network_state_machine_logger.error `${this.constructor.name} got invalid signal type: ${JSON.stringify(header)}.`;
|
|
40407
40444
|
}
|
|
40408
40445
|
}
|
|
40409
40446
|
sendBlocks(port, blocks) {
|
|
@@ -42111,12 +42148,14 @@ class WriteablePage extends MemoryPage {
|
|
|
42111
42148
|
|
|
42112
42149
|
|
|
42113
42150
|
|
|
42151
|
+
|
|
42152
|
+
|
|
42114
42153
|
var AccessType;
|
|
42115
42154
|
(function (AccessType) {
|
|
42116
42155
|
AccessType[AccessType["READ"] = 0] = "READ";
|
|
42117
42156
|
AccessType[AccessType["WRITE"] = 1] = "WRITE";
|
|
42118
42157
|
})(AccessType || (AccessType = {}));
|
|
42119
|
-
|
|
42158
|
+
const memory_logger = Logger.new(import.meta.filename, "pvm:mem");
|
|
42120
42159
|
class Memory {
|
|
42121
42160
|
sbrkIndex;
|
|
42122
42161
|
virtualSbrkIndex;
|
|
@@ -42147,7 +42186,7 @@ class Memory {
|
|
|
42147
42186
|
if (bytes.length === 0) {
|
|
42148
42187
|
return result_Result.ok(result_OK);
|
|
42149
42188
|
}
|
|
42150
|
-
|
|
42189
|
+
memory_logger.insane `MEM[${address}] <- ${bytes_BytesBlob.blobFrom(bytes)}`;
|
|
42151
42190
|
const pagesResult = this.getPages(address, bytes.length, AccessType.WRITE);
|
|
42152
42191
|
if (pagesResult.isError) {
|
|
42153
42192
|
return result_Result.error(pagesResult.error);
|
|
@@ -42214,7 +42253,7 @@ class Memory {
|
|
|
42214
42253
|
currentPosition += bytesToRead;
|
|
42215
42254
|
bytesLeft -= bytesToRead;
|
|
42216
42255
|
}
|
|
42217
|
-
|
|
42256
|
+
memory_logger.insane `MEM[${startAddress}] => ${bytes_BytesBlob.blobFrom(result)}`;
|
|
42218
42257
|
return result_Result.ok(result_OK);
|
|
42219
42258
|
}
|
|
42220
42259
|
sbrk(length) {
|
|
@@ -44144,7 +44183,7 @@ class ProgramDecoder {
|
|
|
44144
44183
|
return result_Result.ok(new ProgramDecoder(program));
|
|
44145
44184
|
}
|
|
44146
44185
|
catch (e) {
|
|
44147
|
-
program_decoder_logger.error
|
|
44186
|
+
program_decoder_logger.error `Invalid program: ${e}`;
|
|
44148
44187
|
return result_Result.error(ProgramDecoderError.InvalidProgramError);
|
|
44149
44188
|
}
|
|
44150
44189
|
}
|
|
@@ -44310,7 +44349,7 @@ class Interpreter {
|
|
|
44310
44349
|
const argsType = instructionArgumentTypeMap[currentInstruction] ?? ArgumentType.NO_ARGUMENTS;
|
|
44311
44350
|
const argsResult = this.argsDecodingResults[argsType];
|
|
44312
44351
|
this.argsDecoder.fillArgs(this.pc, argsResult);
|
|
44313
|
-
interpreter_logger.insane
|
|
44352
|
+
interpreter_logger.insane `[PC: ${this.pc}] ${Instruction[currentInstruction]}`;
|
|
44314
44353
|
if (!isValidInstruction) {
|
|
44315
44354
|
this.instructionResult.status = pvm_interpreter_result_Result.PANIC;
|
|
44316
44355
|
}
|
|
@@ -44382,7 +44421,7 @@ class Interpreter {
|
|
|
44382
44421
|
this.status = status_Status.HOST;
|
|
44383
44422
|
break;
|
|
44384
44423
|
}
|
|
44385
|
-
interpreter_logger.insane
|
|
44424
|
+
interpreter_logger.insane `[PC: ${this.pc}] Status: ${pvm_interpreter_result_Result[this.instructionResult.status]}`;
|
|
44386
44425
|
return this.status;
|
|
44387
44426
|
}
|
|
44388
44427
|
this.pc = this.instructionResult.nextPc;
|
|
@@ -44629,7 +44668,7 @@ class host_calls_manager_HostCallsManager {
|
|
|
44629
44668
|
return `r${idx}=${value} (0x${value.toString(16)})`;
|
|
44630
44669
|
})
|
|
44631
44670
|
.join(", ");
|
|
44632
|
-
host_calls_manager_logger.insane
|
|
44671
|
+
host_calls_manager_logger.insane `[${currentServiceId}] ${context} ${name}${requested}. Gas: ${gas}. Regs: ${registerValues}.`;
|
|
44633
44672
|
}
|
|
44634
44673
|
}
|
|
44635
44674
|
class NoopMissing {
|
|
@@ -45237,7 +45276,7 @@ class block_generator_state_machine_MainReady extends State {
|
|
|
45237
45276
|
this.onBlock.emit(block);
|
|
45238
45277
|
}
|
|
45239
45278
|
else {
|
|
45240
|
-
block_generator_state_machine_logger.error
|
|
45279
|
+
block_generator_state_machine_logger.error `${this.constructor.name} got invalid signal type: ${JSON.stringify(block)}.`;
|
|
45241
45280
|
}
|
|
45242
45281
|
}
|
|
45243
45282
|
finish(channel) {
|
|
@@ -45292,12 +45331,12 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
|
|
|
45292
45331
|
channel
|
|
45293
45332
|
.then((channel) => main(channel))
|
|
45294
45333
|
.catch((e) => {
|
|
45295
|
-
block_generator_logger.error
|
|
45334
|
+
block_generator_logger.error `${e}`;
|
|
45296
45335
|
if (e.stack !== undefined) {
|
|
45297
|
-
block_generator_logger.error
|
|
45336
|
+
block_generator_logger.error `${e.stack}`;
|
|
45298
45337
|
}
|
|
45299
45338
|
if (e.cause !== undefined) {
|
|
45300
|
-
block_generator_logger.error
|
|
45339
|
+
block_generator_logger.error `${e.cause}`;
|
|
45301
45340
|
}
|
|
45302
45341
|
});
|
|
45303
45342
|
}
|
|
@@ -45305,7 +45344,7 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
|
|
|
45305
45344
|
* The `BlockGenerator` should periodically create new blocks and send them as signals to the main thread.
|
|
45306
45345
|
*/
|
|
45307
45346
|
async function main(channel) {
|
|
45308
|
-
block_generator_logger.info
|
|
45347
|
+
block_generator_logger.info `🎁 Block Generator running ${channel.currentState()}`;
|
|
45309
45348
|
// Await the configuration object
|
|
45310
45349
|
const ready = await channel.waitForState("ready(generator)");
|
|
45311
45350
|
const config = ready.currentState().getConfig();
|
|
@@ -45320,11 +45359,11 @@ async function main(channel) {
|
|
|
45320
45359
|
await (0,promises_namespaceObject.setTimeout)(config.chainSpec.slotDuration * 1000);
|
|
45321
45360
|
counter += 1;
|
|
45322
45361
|
const newBlock = await generator.nextEncodedBlock();
|
|
45323
|
-
block_generator_logger.trace
|
|
45362
|
+
block_generator_logger.trace `Sending block ${counter}`;
|
|
45324
45363
|
worker.sendBlock(port, newBlock);
|
|
45325
45364
|
}
|
|
45326
45365
|
});
|
|
45327
|
-
block_generator_logger.info
|
|
45366
|
+
block_generator_logger.info `Block Generator finished. Closing channel.`;
|
|
45328
45367
|
// Close the comms to gracefully close the app.
|
|
45329
45368
|
finished.currentState().close(channel);
|
|
45330
45369
|
}
|
|
@@ -45439,11 +45478,11 @@ class PeersManagement {
|
|
|
45439
45478
|
_onPeerDisconnected = [];
|
|
45440
45479
|
peers = new Map();
|
|
45441
45480
|
peerConnected(peer) {
|
|
45442
|
-
peers_logger.info
|
|
45481
|
+
peers_logger.info `💡 Peer ${displayId(peer)} connected.`;
|
|
45443
45482
|
const oldPeerData = this.peers.get(peer.id);
|
|
45444
45483
|
if (oldPeerData !== undefined) {
|
|
45445
45484
|
// TODO [ToDr] replacing old connection?
|
|
45446
|
-
peers_logger.warn
|
|
45485
|
+
peers_logger.warn `Replacing older connection.`;
|
|
45447
45486
|
}
|
|
45448
45487
|
this.peers.set(peer.id, peer);
|
|
45449
45488
|
for (const callback of this._onPeerConnected) {
|
|
@@ -45451,7 +45490,7 @@ class PeersManagement {
|
|
|
45451
45490
|
}
|
|
45452
45491
|
}
|
|
45453
45492
|
peerDisconnected(peer) {
|
|
45454
|
-
peers_logger.info
|
|
45493
|
+
peers_logger.info `⚡︎Peer ${displayId(peer)} disconnected.`;
|
|
45455
45494
|
this.peers.delete(peer.id);
|
|
45456
45495
|
for (const callback of this._onPeerDisconnected) {
|
|
45457
45496
|
callback(peer);
|
|
@@ -54243,23 +54282,23 @@ var VerifyCertError;
|
|
|
54243
54282
|
VerifyCertError[VerifyCertError["IncorrectSignature"] = 4] = "IncorrectSignature";
|
|
54244
54283
|
})(VerifyCertError || (VerifyCertError = {}));
|
|
54245
54284
|
async function verifyCertificate(certs) {
|
|
54246
|
-
certificate_logger.log
|
|
54285
|
+
certificate_logger.log `Incoming peer. Verifying certificate`;
|
|
54247
54286
|
// Must present exactly one cert
|
|
54248
54287
|
if (certs.length !== 1) {
|
|
54249
|
-
certificate_logger.log
|
|
54288
|
+
certificate_logger.log `Rejecting peer: expected exactly one certificate, got: ${certs.length}`;
|
|
54250
54289
|
return result_Result.error(VerifyCertError.NoCertificate);
|
|
54251
54290
|
}
|
|
54252
54291
|
// Parse with Node's X509Certificate (accepts PEM or DER)
|
|
54253
54292
|
const xc = new (external_node_crypto_default()).X509Certificate(certs[0]);
|
|
54254
54293
|
// Must be Ed25519 key
|
|
54255
54294
|
if (xc.publicKey.asymmetricKeyType !== CURVE_NAME.toLowerCase()) {
|
|
54256
|
-
certificate_logger.log
|
|
54295
|
+
certificate_logger.log `Rejecting peer using non-ed25519 certificate: ${xc.publicKey.asymmetricKeyType}`;
|
|
54257
54296
|
return result_Result.error(VerifyCertError.NotEd25519);
|
|
54258
54297
|
}
|
|
54259
54298
|
// Extract raw public key via JWK export
|
|
54260
54299
|
const jwk = xc.publicKey.export({ format: "jwk" });
|
|
54261
54300
|
if (jwk.kty !== KEY_TYPE || jwk.crv !== CURVE_NAME) {
|
|
54262
|
-
certificate_logger.log
|
|
54301
|
+
certificate_logger.log `Public key type mismatch: ${jwk.kty}, ${jwk.crv}`;
|
|
54263
54302
|
return result_Result.error(VerifyCertError.PublicKeyTypeMismatch);
|
|
54264
54303
|
}
|
|
54265
54304
|
// SAN must be exactly 'e'+base32(rawPub)
|
|
@@ -54267,7 +54306,7 @@ async function verifyCertificate(certs) {
|
|
|
54267
54306
|
const sanField = xc.subjectAltName ?? "";
|
|
54268
54307
|
const m = sanField.match(/DNS:([^,]+)/);
|
|
54269
54308
|
if (m === null || m[1] !== expectedSan) {
|
|
54270
|
-
certificate_logger.log
|
|
54309
|
+
certificate_logger.log `AltName mismatch. Expected: '${expectedSan}', got: '${m?.[1]}'`;
|
|
54271
54310
|
return result_Result.error(VerifyCertError.AltNameMismatch);
|
|
54272
54311
|
}
|
|
54273
54312
|
const key = Buffer.from(jwk.x ?? "", "base64url");
|
|
@@ -54534,19 +54573,19 @@ class QuicNetwork {
|
|
|
54534
54573
|
}
|
|
54535
54574
|
this.started = true;
|
|
54536
54575
|
await this.socket.start({ host: this.listen.host, port: this.listen.port });
|
|
54537
|
-
quic_network_logger.info
|
|
54576
|
+
quic_network_logger.info `🛜 QUIC socket on ${this.socket.host}:${this.socket.port}`;
|
|
54538
54577
|
await this.server.start();
|
|
54539
|
-
quic_network_logger.log
|
|
54578
|
+
quic_network_logger.log `🛜 QUIC server listening`;
|
|
54540
54579
|
}
|
|
54541
54580
|
async stop() {
|
|
54542
54581
|
if (!this.started) {
|
|
54543
54582
|
throw new Error("Network not started yet!");
|
|
54544
54583
|
}
|
|
54545
|
-
quic_network_logger.info
|
|
54584
|
+
quic_network_logger.info `Stopping the networking.`;
|
|
54546
54585
|
await this.server.stop();
|
|
54547
54586
|
await this.socket.stop();
|
|
54548
54587
|
this.started = false;
|
|
54549
|
-
quic_network_logger.info
|
|
54588
|
+
quic_network_logger.info `Networking stopped.`;
|
|
54550
54589
|
}
|
|
54551
54590
|
get peers() {
|
|
54552
54591
|
return this._peers;
|
|
@@ -54567,7 +54606,7 @@ clazz, callback) {
|
|
|
54567
54606
|
await callback(ev);
|
|
54568
54607
|
}
|
|
54569
54608
|
catch (e) {
|
|
54570
|
-
quic_utils_logger.error
|
|
54609
|
+
quic_utils_logger.error `Unhandled exception in ${clazz.name} event handler: ${e}`;
|
|
54571
54610
|
}
|
|
54572
54611
|
});
|
|
54573
54612
|
}
|
|
@@ -54626,7 +54665,7 @@ class QuicPeer {
|
|
|
54626
54665
|
streamEvents = new (external_node_events_default())();
|
|
54627
54666
|
constructor(conn, peerInfo) {
|
|
54628
54667
|
this.conn = conn;
|
|
54629
|
-
quic_peer_logger.log
|
|
54668
|
+
quic_peer_logger.log `👥 [${peerInfo.id}] peer connected ${conn.remoteHost}:${conn.remotePort}`;
|
|
54630
54669
|
this.connectionId = conn.connectionIdShared.toString();
|
|
54631
54670
|
this.address = {
|
|
54632
54671
|
host: conn.remoteHost,
|
|
@@ -54636,11 +54675,11 @@ class QuicPeer {
|
|
|
54636
54675
|
this.key = peerInfo.key;
|
|
54637
54676
|
addEventListener(conn, EventQUICConnectionStream, (ev) => {
|
|
54638
54677
|
const stream = ev.detail;
|
|
54639
|
-
quic_peer_logger.log
|
|
54678
|
+
quic_peer_logger.log `🚰 [${this.id}] new stream: [${stream.streamId}]`;
|
|
54640
54679
|
this.streamEvents.emit("stream", new QuicStream(stream));
|
|
54641
54680
|
});
|
|
54642
54681
|
addEventListener(conn, EventQUICConnectionError, (err) => {
|
|
54643
|
-
quic_peer_logger.error
|
|
54682
|
+
quic_peer_logger.error `❌ [${this.id}] connection failed: ${err.detail}`;
|
|
54644
54683
|
});
|
|
54645
54684
|
}
|
|
54646
54685
|
addOnIncomingStream(streamCallback) {
|
|
@@ -54648,11 +54687,11 @@ class QuicPeer {
|
|
|
54648
54687
|
}
|
|
54649
54688
|
openStream() {
|
|
54650
54689
|
const stream = this.conn.newStream("bidi");
|
|
54651
|
-
quic_peer_logger.log
|
|
54690
|
+
quic_peer_logger.log `🚰 [${this.id}] opening stream: [${stream.streamId}]`;
|
|
54652
54691
|
return new QuicStream(stream);
|
|
54653
54692
|
}
|
|
54654
54693
|
async disconnect() {
|
|
54655
|
-
quic_peer_logger.log
|
|
54694
|
+
quic_peer_logger.log `👋 [${this.id}] disconnecting`;
|
|
54656
54695
|
await this.conn.stop({ isApp: true });
|
|
54657
54696
|
}
|
|
54658
54697
|
}
|
|
@@ -54673,7 +54712,7 @@ const setup_logger = Logger.new(import.meta.filename, "net");
|
|
|
54673
54712
|
class Quic {
|
|
54674
54713
|
/** Setup QUIC socket and start listening for connections. */
|
|
54675
54714
|
static async setup({ host, port, protocols, key }) {
|
|
54676
|
-
const quicLoggerLvl =
|
|
54715
|
+
const quicLoggerLvl = setup_logger.getLevel() > Level.TRACE ? LogLevel.WARN : LogLevel.DEBUG;
|
|
54677
54716
|
const quicLogger = new dist_Logger("quic", quicLoggerLvl, [
|
|
54678
54717
|
new handlers_StreamHandler(format `${level}:${keys}:${msg}`),
|
|
54679
54718
|
]);
|
|
@@ -54696,7 +54735,7 @@ class Quic {
|
|
|
54696
54735
|
verifyPeer: true,
|
|
54697
54736
|
verifyCallback: lastConnectedPeer.verifyCallback,
|
|
54698
54737
|
};
|
|
54699
|
-
setup_logger.info
|
|
54738
|
+
setup_logger.info `🆔 Peer id: ** ${altNameRaw(key.pubKey)}@${host}:${port} ** (pubkey: ${key.pubKey})`;
|
|
54700
54739
|
// Shared injected UDP socket
|
|
54701
54740
|
const socket = new dist_QUICSocket({
|
|
54702
54741
|
logger: quicLogger.getChild("socket"),
|
|
@@ -54711,8 +54750,8 @@ class Quic {
|
|
|
54711
54750
|
// peer management
|
|
54712
54751
|
const peers = new PeersManagement();
|
|
54713
54752
|
// basic error handling
|
|
54714
|
-
addEventListener(server, EventQUICServerError, (error) => setup_logger.error
|
|
54715
|
-
addEventListener(server, EventQUICServerClose, (ev) => setup_logger.error
|
|
54753
|
+
addEventListener(server, EventQUICServerError, (error) => setup_logger.error `🛜 Server error: ${error}`);
|
|
54754
|
+
addEventListener(server, EventQUICServerClose, (ev) => setup_logger.error `🛜 Server stopped: ${ev}`);
|
|
54716
54755
|
// handling incoming session
|
|
54717
54756
|
addEventListener(server, EventQUICServerConnection, async (ev) => {
|
|
54718
54757
|
const conn = ev.detail;
|
|
@@ -54721,16 +54760,16 @@ class Quic {
|
|
|
54721
54760
|
return;
|
|
54722
54761
|
}
|
|
54723
54762
|
if (lastConnectedPeer.info.key.isEqualTo(key.pubKey)) {
|
|
54724
|
-
setup_logger.log
|
|
54763
|
+
setup_logger.log `🛜 Rejecting connection from ourself from ${conn.remoteHost}:${conn.remotePort}`;
|
|
54725
54764
|
await conn.stop();
|
|
54726
54765
|
return;
|
|
54727
54766
|
}
|
|
54728
54767
|
if (peers.isConnected(lastConnectedPeer.info.id)) {
|
|
54729
|
-
setup_logger.log
|
|
54768
|
+
setup_logger.log `🛜 Rejecting duplicate connection with peer ${lastConnectedPeer.info.id} from ${conn.remoteHost}:${conn.remotePort}`;
|
|
54730
54769
|
await conn.stop();
|
|
54731
54770
|
return;
|
|
54732
54771
|
}
|
|
54733
|
-
setup_logger.log
|
|
54772
|
+
setup_logger.log `🛜 Server handshake with ${conn.remoteHost}:${conn.remotePort}`;
|
|
54734
54773
|
newPeer(conn, lastConnectedPeer.info);
|
|
54735
54774
|
lastConnectedPeer.info = null;
|
|
54736
54775
|
await conn.start();
|
|
@@ -54753,10 +54792,10 @@ class Quic {
|
|
|
54753
54792
|
});
|
|
54754
54793
|
const client = await clientLater;
|
|
54755
54794
|
addEventListener(client, EventQUICClientClose, () => {
|
|
54756
|
-
setup_logger.log
|
|
54795
|
+
setup_logger.log `⚰️ Client connection closed.`;
|
|
54757
54796
|
});
|
|
54758
54797
|
addEventListener(client, EventQUICClientError, (error) => {
|
|
54759
|
-
setup_logger.error
|
|
54798
|
+
setup_logger.error `🔴 Client error: ${error.detail}`;
|
|
54760
54799
|
});
|
|
54761
54800
|
if (peerDetails.info === null) {
|
|
54762
54801
|
throw new Error("Client connected, but there is no peer details!");
|
|
@@ -54764,7 +54803,7 @@ class Quic {
|
|
|
54764
54803
|
if (options.verifyName !== undefined && options.verifyName !== peerDetails.info.id) {
|
|
54765
54804
|
throw new Error(`Client connected, but the id didn't match. Expected: ${options.verifyName}, got: ${peerDetails.info.id}`);
|
|
54766
54805
|
}
|
|
54767
|
-
setup_logger.log
|
|
54806
|
+
setup_logger.log `🤝 Client handshake with: ${peer.host}:${peer.port}`;
|
|
54768
54807
|
return newPeer(client.connection, peerDetails.info);
|
|
54769
54808
|
}
|
|
54770
54809
|
function newPeer(conn, peerInfo) {
|
|
@@ -54884,10 +54923,10 @@ class Connections {
|
|
|
54884
54923
|
for (;;) {
|
|
54885
54924
|
// increase the reconnection counter
|
|
54886
54925
|
meta.currentRetry += 1;
|
|
54887
|
-
if (meta.currentRetry
|
|
54926
|
+
if (meta.currentRetry > meta.maxRetries) {
|
|
54888
54927
|
// reached max retries for a peer, remove it from tracking.
|
|
54889
54928
|
this.peerInfo.delete(id);
|
|
54890
|
-
jamnp_s_peers_logger.log
|
|
54929
|
+
jamnp_s_peers_logger.log `[${id}] max retries reached. Removing peer.`;
|
|
54891
54930
|
return;
|
|
54892
54931
|
}
|
|
54893
54932
|
// else attempt to connect to a node a bit later.
|
|
@@ -54906,7 +54945,7 @@ class Connections {
|
|
|
54906
54945
|
}
|
|
54907
54946
|
// attempt to connect to the peer
|
|
54908
54947
|
try {
|
|
54909
|
-
jamnp_s_peers_logger.trace
|
|
54948
|
+
jamnp_s_peers_logger.trace `[${id}] Attempting to connect to peer at ${meta.address.host}:${meta.address.port}.`;
|
|
54910
54949
|
await this.network.dial(meta.address, { signal, verifyName: meta.peerId });
|
|
54911
54950
|
return;
|
|
54912
54951
|
}
|
|
@@ -54915,7 +54954,7 @@ class Connections {
|
|
|
54915
54954
|
return;
|
|
54916
54955
|
}
|
|
54917
54956
|
// failing to connect, will retry.
|
|
54918
|
-
jamnp_s_peers_logger.trace
|
|
54957
|
+
jamnp_s_peers_logger.trace `[${id}] attempt failed. Will retry (${meta.currentRetry}/${meta.maxRetries})`;
|
|
54919
54958
|
}
|
|
54920
54959
|
}
|
|
54921
54960
|
}
|
|
@@ -55028,7 +55067,7 @@ class StreamManager {
|
|
|
55028
55067
|
// We expect a one-byte identifier first.
|
|
55029
55068
|
const data = await reader.read();
|
|
55030
55069
|
bytes = bytes_BytesBlob.blobFrom(data.value !== undefined ? data.value : new Uint8Array());
|
|
55031
|
-
stream_manager_logger.trace
|
|
55070
|
+
stream_manager_logger.trace `🚰 --> [${peer.id}:${streamId}] Initial data: ${bytes}`;
|
|
55032
55071
|
}
|
|
55033
55072
|
finally {
|
|
55034
55073
|
reader.releaseLock();
|
|
@@ -55042,7 +55081,7 @@ class StreamManager {
|
|
|
55042
55081
|
if (handler === undefined) {
|
|
55043
55082
|
throw new Error(`Unsupported stream kind: ${kind}`);
|
|
55044
55083
|
}
|
|
55045
|
-
stream_manager_logger.log
|
|
55084
|
+
stream_manager_logger.log `🚰 --> [${peer.id}:${stream.streamId}] Stream identified as: ${kind}`;
|
|
55046
55085
|
this.registerStream(peer, handler, stream, bytes_BytesBlob.blobFrom(bytes.raw.subarray(1)));
|
|
55047
55086
|
}
|
|
55048
55087
|
registerStream(peer, handler, stream, initialData) {
|
|
@@ -55052,7 +55091,7 @@ class StreamManager {
|
|
|
55052
55091
|
this.streams.delete(streamId);
|
|
55053
55092
|
this.backgroundTasks.delete(streamId);
|
|
55054
55093
|
if (kind === StreamErrorKind.Exception) {
|
|
55055
|
-
stream_manager_logger.error
|
|
55094
|
+
stream_manager_logger.error `🚰 --- [${peer.id}:${streamId}] Stream error: ${e}. Disconnecting peer.`;
|
|
55056
55095
|
}
|
|
55057
55096
|
if (kind !== StreamErrorKind.LocalClose) {
|
|
55058
55097
|
// whenever we have an error, we are going to inform the handler
|
|
@@ -55086,10 +55125,10 @@ async function readStreamForever(peer, handler, quicStream, initialData, reader)
|
|
|
55086
55125
|
let isDone = false;
|
|
55087
55126
|
const callback = handleMessageFragmentation((data) => {
|
|
55088
55127
|
const bytes = bytes_BytesBlob.blobFrom(new Uint8Array(data));
|
|
55089
|
-
stream_manager_logger.trace
|
|
55128
|
+
stream_manager_logger.trace `🚰 --> [${peer.id}:${quicStream.streamId}] ${bytes}`;
|
|
55090
55129
|
handler.onStreamMessage(quicStream, bytes);
|
|
55091
55130
|
}, () => {
|
|
55092
|
-
stream_manager_logger.error
|
|
55131
|
+
stream_manager_logger.error `🚰 --> [${peer.id}:${quicStream.streamId}] got too much data. Disconnecting.`;
|
|
55093
55132
|
peer.disconnect();
|
|
55094
55133
|
});
|
|
55095
55134
|
for (;;) {
|
|
@@ -55098,7 +55137,7 @@ async function readStreamForever(peer, handler, quicStream, initialData, reader)
|
|
|
55098
55137
|
// be a promise, so that we can make back pressure here.
|
|
55099
55138
|
callback(bytes.raw);
|
|
55100
55139
|
if (isDone) {
|
|
55101
|
-
stream_manager_logger.log
|
|
55140
|
+
stream_manager_logger.log `🚰 --> [${peer.id}:${quicStream.streamId}] remote finished.`;
|
|
55102
55141
|
return;
|
|
55103
55142
|
}
|
|
55104
55143
|
// await for more data
|
|
@@ -55141,7 +55180,7 @@ class QuicStreamSender {
|
|
|
55141
55180
|
return;
|
|
55142
55181
|
}
|
|
55143
55182
|
const { data, addPrefix } = chunk;
|
|
55144
|
-
stream_manager_logger.trace
|
|
55183
|
+
stream_manager_logger.trace `🚰 <-- [${this.streamId}] write: ${data}`;
|
|
55145
55184
|
if (addPrefix) {
|
|
55146
55185
|
await writer.write(encodeMessageLength(data.raw));
|
|
55147
55186
|
}
|
|
@@ -55158,7 +55197,7 @@ class QuicStreamSender {
|
|
|
55158
55197
|
}
|
|
55159
55198
|
close() {
|
|
55160
55199
|
handleAsyncErrors(async () => {
|
|
55161
|
-
stream_manager_logger.trace
|
|
55200
|
+
stream_manager_logger.trace `🚰 <-- [${this.streamId}] closing`;
|
|
55162
55201
|
if (this.currentWriterPromise !== null) {
|
|
55163
55202
|
await this.currentWriterPromise;
|
|
55164
55203
|
}
|
|
@@ -55244,7 +55283,7 @@ class ServerHandler {
|
|
|
55244
55283
|
}
|
|
55245
55284
|
onStreamMessage(sender, message) {
|
|
55246
55285
|
const request = decoder_Decoder.decodeObject(BlockRequest.Codec, message);
|
|
55247
|
-
ce_128_block_request_logger.log
|
|
55286
|
+
ce_128_block_request_logger.log `[${sender.streamId}] Client has requested: ${request}`;
|
|
55248
55287
|
const blocks = this.getBlockSequence(sender.streamId, request.headerHash, request.direction, request.maxBlocks);
|
|
55249
55288
|
sender.bufferAndSend(encoder_Encoder.encodeObject(descriptors_codec.sequenceFixLen(Block.Codec.View, blocks.length), blocks, this.chainSpec));
|
|
55250
55289
|
sender.close();
|
|
@@ -55264,7 +55303,7 @@ class ClientHandler {
|
|
|
55264
55303
|
throw new Error("Received an unexpected message from the server.");
|
|
55265
55304
|
}
|
|
55266
55305
|
const blocks = decoder_Decoder.decodeSequence(Block.Codec.View, message, this.chainSpec);
|
|
55267
|
-
ce_128_block_request_logger.log
|
|
55306
|
+
ce_128_block_request_logger.log `[${sender.streamId}] Server returned ${blocks.length} blocks in ${message.length} bytes of data.`;
|
|
55268
55307
|
this.promiseResolvers.get(sender.streamId)?.(blocks);
|
|
55269
55308
|
this.promiseResolvers.delete(sender.streamId);
|
|
55270
55309
|
}
|
|
@@ -55435,13 +55474,13 @@ class ce_129_state_request_Handler {
|
|
|
55435
55474
|
}
|
|
55436
55475
|
onStreamMessage(sender, message) {
|
|
55437
55476
|
if (this.isServer) {
|
|
55438
|
-
ce_129_state_request_logger.info
|
|
55477
|
+
ce_129_state_request_logger.info `[${sender.streamId}][server]: Received request.`;
|
|
55439
55478
|
if (this.getBoundaryNodes === undefined || this.getKeyValuePairs === undefined)
|
|
55440
55479
|
return;
|
|
55441
55480
|
const request = decoder_Decoder.decodeObject(StateRequest.Codec, message);
|
|
55442
55481
|
const boundaryNodes = this.getBoundaryNodes(request.headerHash, request.startKey, request.endKey);
|
|
55443
55482
|
const keyValuePairs = this.getKeyValuePairs(request.headerHash, request.startKey, request.endKey);
|
|
55444
|
-
ce_129_state_request_logger.info
|
|
55483
|
+
ce_129_state_request_logger.info `[${sender.streamId}][server]: <-- responding with boundary nodes and key value pairs.`;
|
|
55445
55484
|
sender.bufferAndSend(encoder_Encoder.encodeObject(descriptors_codec.sequenceVarLen(trieNodeCodec), boundaryNodes));
|
|
55446
55485
|
sender.bufferAndSend(encoder_Encoder.encodeObject(StateResponse.Codec, StateResponse.create({ keyValuePairs })));
|
|
55447
55486
|
sender.close();
|
|
@@ -55449,11 +55488,11 @@ class ce_129_state_request_Handler {
|
|
|
55449
55488
|
}
|
|
55450
55489
|
if (!this.boundaryNodes.has(sender.streamId)) {
|
|
55451
55490
|
this.boundaryNodes.set(sender.streamId, decoder_Decoder.decodeObject(descriptors_codec.sequenceVarLen(trieNodeCodec), message));
|
|
55452
|
-
ce_129_state_request_logger.info
|
|
55491
|
+
ce_129_state_request_logger.info `[${sender.streamId}][client]: Received boundary nodes.`;
|
|
55453
55492
|
return;
|
|
55454
55493
|
}
|
|
55455
55494
|
this.onResponse.get(sender.streamId)?.(decoder_Decoder.decodeObject(StateResponse.Codec, message));
|
|
55456
|
-
ce_129_state_request_logger.info
|
|
55495
|
+
ce_129_state_request_logger.info `[${sender.streamId}][client]: Received state values.`;
|
|
55457
55496
|
}
|
|
55458
55497
|
onClose(streamId) {
|
|
55459
55498
|
this.boundaryNodes.delete(streamId);
|
|
@@ -55510,7 +55549,7 @@ class ce_131_ce_132_safrole_ticket_distribution_ServerHandler {
|
|
|
55510
55549
|
}
|
|
55511
55550
|
onStreamMessage(sender, message) {
|
|
55512
55551
|
const ticketDistribution = Decoder.decodeObject(TicketDistributionRequest.Codec, message);
|
|
55513
|
-
ce_131_ce_132_safrole_ticket_distribution_logger.log
|
|
55552
|
+
ce_131_ce_132_safrole_ticket_distribution_logger.log `[${sender.streamId}][ce-${this.kind}] Received ticket for epoch ${ticketDistribution.epochIndex}`;
|
|
55514
55553
|
this.onTicketReceived(ticketDistribution.epochIndex, ticketDistribution.ticket);
|
|
55515
55554
|
sender.close();
|
|
55516
55555
|
}
|
|
@@ -55522,7 +55561,7 @@ class ce_131_ce_132_safrole_ticket_distribution_ClientHandler {
|
|
|
55522
55561
|
this.kind = kind;
|
|
55523
55562
|
}
|
|
55524
55563
|
onStreamMessage(sender) {
|
|
55525
|
-
ce_131_ce_132_safrole_ticket_distribution_logger.warn
|
|
55564
|
+
ce_131_ce_132_safrole_ticket_distribution_logger.warn `[${sender.streamId}][ce-${this.kind}] Unexpected message received. Closing.`;
|
|
55526
55565
|
sender.close();
|
|
55527
55566
|
}
|
|
55528
55567
|
onClose() { }
|
|
@@ -55595,15 +55634,15 @@ class ce_133_work_package_submission_ServerHandler {
|
|
|
55595
55634
|
class ce_133_work_package_submission_ClientHandler {
|
|
55596
55635
|
kind = ce_133_work_package_submission_STREAM_KIND;
|
|
55597
55636
|
onStreamMessage(sender) {
|
|
55598
|
-
ce_133_work_package_submission_logger.warn
|
|
55637
|
+
ce_133_work_package_submission_logger.warn `[${sender.streamId}] Got unexpected message on CE-133 stream. Closing.`;
|
|
55599
55638
|
sender.close();
|
|
55600
55639
|
}
|
|
55601
55640
|
onClose() { }
|
|
55602
55641
|
sendWorkPackage(sender, coreIndex, workPackage, extrinsic) {
|
|
55603
55642
|
const corePack = CoreWorkPackage.create({ coreIndex, workPackage });
|
|
55604
|
-
ce_133_work_package_submission_logger.trace
|
|
55643
|
+
ce_133_work_package_submission_logger.trace `[${sender.streamId}] Sending work package: ${corePack}`;
|
|
55605
55644
|
sender.bufferAndSend(Encoder.encodeObject(CoreWorkPackage.Codec, corePack));
|
|
55606
|
-
ce_133_work_package_submission_logger.trace
|
|
55645
|
+
ce_133_work_package_submission_logger.trace `[${sender.streamId}] Sending extrinsics: ${workPackage.items}`;
|
|
55607
55646
|
sender.bufferAndSend(Encoder.encodeObject(workItemExtrinsicsCodec(workPackage.items), extrinsic));
|
|
55608
55647
|
// now close the connection
|
|
55609
55648
|
sender.close();
|
|
@@ -55679,7 +55718,7 @@ class ce_134_work_package_sharing_ServerHandler {
|
|
|
55679
55718
|
ce_134_work_package_sharing_ServerHandler.sendWorkReport(sender, workReportHash, signature);
|
|
55680
55719
|
})
|
|
55681
55720
|
.catch((error) => {
|
|
55682
|
-
ce_134_work_package_sharing_logger.error
|
|
55721
|
+
ce_134_work_package_sharing_logger.error `[${streamId}] Error processing work package: ${error}`;
|
|
55683
55722
|
this.onClose(streamId);
|
|
55684
55723
|
});
|
|
55685
55724
|
}
|
|
@@ -55696,7 +55735,7 @@ class ce_134_work_package_sharing_ClientHandler {
|
|
|
55696
55735
|
throw new Error("Unexpected message received.");
|
|
55697
55736
|
}
|
|
55698
55737
|
const response = Decoder.decodeObject(WorkPackageSharingResponse.Codec, message);
|
|
55699
|
-
ce_134_work_package_sharing_logger.info
|
|
55738
|
+
ce_134_work_package_sharing_logger.info `[${sender.streamId}] Received work report hash and signature.`;
|
|
55700
55739
|
pendingRequest.resolve({ workReportHash: response.workReportHash, signature: response.signature });
|
|
55701
55740
|
sender.close();
|
|
55702
55741
|
}
|
|
@@ -55709,9 +55748,9 @@ class ce_134_work_package_sharing_ClientHandler {
|
|
|
55709
55748
|
}
|
|
55710
55749
|
async sendWorkPackage(sender, coreIndex, segmentsRootMappings, workPackageBundle) {
|
|
55711
55750
|
const request = WorkPackageSharingRequest.create({ coreIndex, segmentsRootMappings });
|
|
55712
|
-
ce_134_work_package_sharing_logger.trace
|
|
55751
|
+
ce_134_work_package_sharing_logger.trace `[${sender.streamId}] Sending core index and segments-root mappings.`;
|
|
55713
55752
|
sender.bufferAndSend(Encoder.encodeObject(WorkPackageSharingRequest.Codec, request));
|
|
55714
|
-
ce_134_work_package_sharing_logger.trace
|
|
55753
|
+
ce_134_work_package_sharing_logger.trace `[${sender.streamId}] Sending work package bundle.`;
|
|
55715
55754
|
sender.bufferAndSend(Encoder.encodeObject(WorkPackageBundleCodec, workPackageBundle));
|
|
55716
55755
|
return new Promise((resolve, reject) => {
|
|
55717
55756
|
this.pendingRequests.set(sender.streamId, { resolve, reject });
|
|
@@ -55771,7 +55810,7 @@ class ce_135_work_report_distribution_ServerHandler {
|
|
|
55771
55810
|
}
|
|
55772
55811
|
onStreamMessage(sender, message) {
|
|
55773
55812
|
const guaranteedWorkReport = Decoder.decodeObject(GuaranteedWorkReport.Codec, message, this.chainSpec);
|
|
55774
|
-
ce_135_work_report_distribution_logger.log
|
|
55813
|
+
ce_135_work_report_distribution_logger.log `[${sender.streamId}] Received guaranteed work report.`;
|
|
55775
55814
|
this.onWorkReport(guaranteedWorkReport);
|
|
55776
55815
|
sender.close();
|
|
55777
55816
|
}
|
|
@@ -55784,12 +55823,12 @@ class ce_135_work_report_distribution_ClientHandler {
|
|
|
55784
55823
|
this.chainSpec = chainSpec;
|
|
55785
55824
|
}
|
|
55786
55825
|
onStreamMessage(sender) {
|
|
55787
|
-
ce_135_work_report_distribution_logger.warn
|
|
55826
|
+
ce_135_work_report_distribution_logger.warn `[${sender.streamId}] Got unexpected message on CE-135 stream. Closing.`;
|
|
55788
55827
|
sender.close();
|
|
55789
55828
|
}
|
|
55790
55829
|
onClose() { }
|
|
55791
55830
|
sendWorkReport(sender, workReport) {
|
|
55792
|
-
ce_135_work_report_distribution_logger.trace
|
|
55831
|
+
ce_135_work_report_distribution_logger.trace `[${sender.streamId}] Sending guaranteed work report.`;
|
|
55793
55832
|
sender.bufferAndSend(Encoder.encodeObject(GuaranteedWorkReport.Codec, workReport, this.chainSpec));
|
|
55794
55833
|
sender.close();
|
|
55795
55834
|
}
|
|
@@ -55895,7 +55934,7 @@ class up_0_block_announcement_Handler {
|
|
|
55895
55934
|
this.handshakes.set(streamId, handshake);
|
|
55896
55935
|
// we didn't initiate this handshake, so let's respond
|
|
55897
55936
|
if (!this.pendingHandshakes.delete(streamId)) {
|
|
55898
|
-
up_0_block_announcement_logger.log
|
|
55937
|
+
up_0_block_announcement_logger.log `[${streamId}] <-- responding with a handshake.`;
|
|
55899
55938
|
sender.bufferAndSend(encoder_Encoder.encodeObject(Handshake.Codec, this.getHandshake()));
|
|
55900
55939
|
}
|
|
55901
55940
|
this.onHandshake(streamId, handshake);
|
|
@@ -55903,7 +55942,7 @@ class up_0_block_announcement_Handler {
|
|
|
55903
55942
|
}
|
|
55904
55943
|
// it's just an announcement
|
|
55905
55944
|
const annoucement = decoder_Decoder.decodeObject(Announcement.Codec, message, this.spec);
|
|
55906
|
-
up_0_block_announcement_logger.log
|
|
55945
|
+
up_0_block_announcement_logger.log `[${streamId}] --> got blocks announcement: ${annoucement.final}`;
|
|
55907
55946
|
this.onAnnouncement(streamId, annoucement);
|
|
55908
55947
|
}
|
|
55909
55948
|
onClose(streamId) {
|
|
@@ -55916,7 +55955,7 @@ class up_0_block_announcement_Handler {
|
|
|
55916
55955
|
return;
|
|
55917
55956
|
}
|
|
55918
55957
|
const handshake = this.getHandshake();
|
|
55919
|
-
up_0_block_announcement_logger.trace
|
|
55958
|
+
up_0_block_announcement_logger.trace `[${streamId}] <-- sending handshake`;
|
|
55920
55959
|
this.pendingHandshakes.set(sender.streamId, true);
|
|
55921
55960
|
sender.bufferAndSend(encoder_Encoder.encodeObject(Handshake.Codec, handshake));
|
|
55922
55961
|
}
|
|
@@ -55924,11 +55963,11 @@ class up_0_block_announcement_Handler {
|
|
|
55924
55963
|
const { streamId } = sender;
|
|
55925
55964
|
// only send announcement if we've handshaken
|
|
55926
55965
|
if (this.handshakes.has(streamId)) {
|
|
55927
|
-
up_0_block_announcement_logger.trace
|
|
55966
|
+
up_0_block_announcement_logger.trace `[${streamId}] <-- sending block announcement: ${annoucement.final}`;
|
|
55928
55967
|
sender.bufferAndSend(encoder_Encoder.encodeObject(Announcement.Codec, annoucement, this.spec));
|
|
55929
55968
|
}
|
|
55930
55969
|
else {
|
|
55931
|
-
up_0_block_announcement_logger.warn
|
|
55970
|
+
up_0_block_announcement_logger.warn `[${streamId}] <-- no handshake yet, skipping announcement.`;
|
|
55932
55971
|
}
|
|
55933
55972
|
}
|
|
55934
55973
|
}
|
|
@@ -56045,7 +56084,7 @@ class SyncTask {
|
|
|
56045
56084
|
onUp0Annoucement(peer, announcement) {
|
|
56046
56085
|
const { hash, slot } = announcement.final;
|
|
56047
56086
|
const bestHeader = hashHeader(announcement.header, this.spec);
|
|
56048
|
-
sync_logger.info
|
|
56087
|
+
sync_logger.info `[${peer.id}] --> Received new header #${announcement.header.timeSlotIndex}: ${bestHeader.hash}`;
|
|
56049
56088
|
// NOTE [ToDr] Instead of having `Connections` store aux data perhaps
|
|
56050
56089
|
// we should maintain that directly? However that would require
|
|
56051
56090
|
// listening to peers connected/disconnected to perfrom some cleanups
|
|
@@ -56120,7 +56159,7 @@ class SyncTask {
|
|
|
56120
56159
|
const peers = this.connections.getConnectedPeers();
|
|
56121
56160
|
for (const peerInfo of peers) {
|
|
56122
56161
|
this.streamManager.withStreamOfKind(peerInfo.peerId, up_0_block_announcement_STREAM_KIND, (handler, sender) => {
|
|
56123
|
-
sync_logger.log
|
|
56162
|
+
sync_logger.log `[${peerInfo.peerId}] <-- Broadcasting new header #${slot}: ${header.hash}`;
|
|
56124
56163
|
handler.sendAnnouncement(sender, annoucement);
|
|
56125
56164
|
return result_OK;
|
|
56126
56165
|
});
|
|
@@ -56134,13 +56173,13 @@ class SyncTask {
|
|
|
56134
56173
|
}
|
|
56135
56174
|
if (res.error === BlockSequenceError.BlockOnFork) {
|
|
56136
56175
|
// seems that peer is requesting syncing a fork from us, let's bail.
|
|
56137
|
-
sync_logger.warn
|
|
56176
|
+
sync_logger.warn `[${peer.id}] --> Invalid block sequence request: ${startHash} is on a fork.`;
|
|
56138
56177
|
return [];
|
|
56139
56178
|
}
|
|
56140
56179
|
if (res.error === BlockSequenceError.NoStartBlock) {
|
|
56141
56180
|
// we don't know about that block at all, so let's just bail.
|
|
56142
56181
|
// we should probably penalize the peer for sending BS?
|
|
56143
|
-
sync_logger.warn
|
|
56182
|
+
sync_logger.warn `[${peer.id}] --> Invalid block sequence request: ${startHash} missing header or extrinsic.`;
|
|
56144
56183
|
return [];
|
|
56145
56184
|
}
|
|
56146
56185
|
debug_assertNever(res.error);
|
|
@@ -56160,10 +56199,10 @@ class SyncTask {
|
|
|
56160
56199
|
// figure out where others are at
|
|
56161
56200
|
const othersBest = this.othersBest;
|
|
56162
56201
|
const blocksToSync = othersBest.slot - ourBestSlot;
|
|
56163
|
-
sync_logger.trace
|
|
56202
|
+
sync_logger.trace `Our best. ${ourBestSlot}. Best seen: ${othersBest.slot}`;
|
|
56164
56203
|
if (blocksToSync < 1) {
|
|
56165
56204
|
this.connections.getPeerCount();
|
|
56166
|
-
sync_logger.trace
|
|
56205
|
+
sync_logger.trace `No new blocks. ${peerCount} peers.`;
|
|
56167
56206
|
return {
|
|
56168
56207
|
kind: SyncResult.NoNewBlocks,
|
|
56169
56208
|
ours: ourBestSlot,
|
|
@@ -56171,7 +56210,7 @@ class SyncTask {
|
|
|
56171
56210
|
};
|
|
56172
56211
|
}
|
|
56173
56212
|
const requested = [];
|
|
56174
|
-
sync_logger.log
|
|
56213
|
+
sync_logger.log `Sync ${blocksToSync} blocks from ${peerCount} peers.`;
|
|
56175
56214
|
// NOTE [ToDr] We might be requesting the same blocks from many peers
|
|
56176
56215
|
// which isn't very optimal, but for now: 🤷
|
|
56177
56216
|
//
|
|
@@ -56197,12 +56236,12 @@ class SyncTask {
|
|
|
56197
56236
|
// request as much blocks from that peer as possible.
|
|
56198
56237
|
this.streamManager.withNewStream(peerInfo.peerRef, STREAM_KIND, (handler, sender) => {
|
|
56199
56238
|
handleAsyncErrors(async () => {
|
|
56200
|
-
sync_logger.log
|
|
56239
|
+
sync_logger.log `[${peerInfo.peerId}] <-- Fetching ${bestSlot - ourBestSlot} blocks (${bestHash})`;
|
|
56201
56240
|
const blocks = await handler.requestBlockSequence(sender, bestHash, Direction.DescIncl, numbers_tryAsU32(bestSlot - ourBestSlot));
|
|
56202
56241
|
blocks.reverse();
|
|
56203
56242
|
this.onNewBlocks(blocks, peerInfo.peerId);
|
|
56204
56243
|
}, (e) => {
|
|
56205
|
-
sync_logger.warn
|
|
56244
|
+
sync_logger.warn `[${peerInfo.peerId}] <-- requesting blocks to import: ${e}`;
|
|
56206
56245
|
});
|
|
56207
56246
|
return result_OK;
|
|
56208
56247
|
});
|
|
@@ -56276,7 +56315,7 @@ function setupPeerListeners(syncTask, network, streamManager) {
|
|
|
56276
56315
|
// whenever the peer wants to open a stream with us, let's handle that.
|
|
56277
56316
|
peer.addOnIncomingStream((stream) => {
|
|
56278
56317
|
handleAsyncErrors(() => streamManager.onIncomingStream(peer, stream), (e) => {
|
|
56279
|
-
network_logger.error
|
|
56318
|
+
network_logger.error `[${peer.id}:${stream.streamId}]🚰 Stream error: ${e}. Disconnecting peer.`;
|
|
56280
56319
|
peer.disconnect();
|
|
56281
56320
|
});
|
|
56282
56321
|
return result_OK;
|
|
@@ -56526,10 +56565,10 @@ class FuzzTarget {
|
|
|
56526
56565
|
async onSocketMessage(msg) {
|
|
56527
56566
|
// attempt to decode the messsage
|
|
56528
56567
|
const message = decoder_Decoder.decodeObject(messageCodec, msg, this.spec);
|
|
56529
|
-
handler_logger.log
|
|
56568
|
+
handler_logger.log `[${message.type}] incoming message`;
|
|
56530
56569
|
await processAndRespond(this.spec, message, this.msgHandler, this.sender).catch((e) => {
|
|
56531
|
-
handler_logger.error
|
|
56532
|
-
handler_logger.error
|
|
56570
|
+
handler_logger.error `Error while processing fuzz v0 message: ${e}`;
|
|
56571
|
+
handler_logger.error `${e}`;
|
|
56533
56572
|
this.sender.close();
|
|
56534
56573
|
});
|
|
56535
56574
|
return;
|
|
@@ -56570,17 +56609,17 @@ class FuzzTarget {
|
|
|
56570
56609
|
break;
|
|
56571
56610
|
}
|
|
56572
56611
|
case MessageType.State: {
|
|
56573
|
-
handler_logger.log
|
|
56612
|
+
handler_logger.log `--> Received unexpected 'State' message from the fuzzer. Closing.`;
|
|
56574
56613
|
sender.close();
|
|
56575
56614
|
return;
|
|
56576
56615
|
}
|
|
56577
56616
|
case MessageType.StateRoot: {
|
|
56578
|
-
handler_logger.log
|
|
56617
|
+
handler_logger.log `--> Received unexpected 'StateRoot' message from the fuzzer. Closing.`;
|
|
56579
56618
|
sender.close();
|
|
56580
56619
|
return;
|
|
56581
56620
|
}
|
|
56582
56621
|
default: {
|
|
56583
|
-
handler_logger.log
|
|
56622
|
+
handler_logger.log `--> Received unexpected message type ${JSON.stringify(message)} from the fuzzer. Closing.`;
|
|
56584
56623
|
sender.close();
|
|
56585
56624
|
try {
|
|
56586
56625
|
debug_assertNever(message);
|
|
@@ -56591,17 +56630,17 @@ class FuzzTarget {
|
|
|
56591
56630
|
}
|
|
56592
56631
|
}
|
|
56593
56632
|
if (response !== null) {
|
|
56594
|
-
handler_logger.trace
|
|
56633
|
+
handler_logger.trace `<-- responding with: ${response.type}`;
|
|
56595
56634
|
const encoded = encoder_Encoder.encodeObject(messageCodec, response, spec);
|
|
56596
56635
|
sender.send(encoded);
|
|
56597
56636
|
}
|
|
56598
56637
|
else {
|
|
56599
|
-
handler_logger.warn
|
|
56638
|
+
handler_logger.warn `<-- no response generated for: ${message.type}`;
|
|
56600
56639
|
}
|
|
56601
56640
|
}
|
|
56602
56641
|
}
|
|
56603
56642
|
onClose({ error }) {
|
|
56604
|
-
handler_logger.log
|
|
56643
|
+
handler_logger.log `Closing the handler. Reason: ${error !== undefined ? error.message : "close"}.`;
|
|
56605
56644
|
}
|
|
56606
56645
|
}
|
|
56607
56646
|
|
|
@@ -56855,14 +56894,14 @@ class handler_FuzzTarget {
|
|
|
56855
56894
|
// attempt to decode the messsage
|
|
56856
56895
|
try {
|
|
56857
56896
|
const message = decoder_Decoder.decodeObject(types_messageCodec, msg, this.spec);
|
|
56858
|
-
v1_handler_logger.log
|
|
56897
|
+
v1_handler_logger.log `[${message.type}] incoming message`;
|
|
56859
56898
|
await this.processAndRespond(message);
|
|
56860
56899
|
}
|
|
56861
56900
|
catch (e) {
|
|
56862
|
-
v1_handler_logger.error
|
|
56863
|
-
v1_handler_logger.error
|
|
56901
|
+
v1_handler_logger.error `Error while processing fuzz v1 message: ${e}`;
|
|
56902
|
+
v1_handler_logger.error `${e}`;
|
|
56864
56903
|
if (e instanceof Error) {
|
|
56865
|
-
v1_handler_logger.error
|
|
56904
|
+
v1_handler_logger.error `${e.stack ?? ""}`;
|
|
56866
56905
|
}
|
|
56867
56906
|
this.sender.close();
|
|
56868
56907
|
}
|
|
@@ -56873,7 +56912,7 @@ class handler_FuzzTarget {
|
|
|
56873
56912
|
case types_MessageType.PeerInfo: {
|
|
56874
56913
|
// only support V1
|
|
56875
56914
|
if (message.value.fuzzVersion !== 1) {
|
|
56876
|
-
v1_handler_logger.warn
|
|
56915
|
+
v1_handler_logger.warn `Unsupported fuzzer protocol version: ${message.value.fuzzVersion}. Closing`;
|
|
56877
56916
|
this.sender.close();
|
|
56878
56917
|
return;
|
|
56879
56918
|
}
|
|
@@ -56881,9 +56920,9 @@ class handler_FuzzTarget {
|
|
|
56881
56920
|
const ourPeerInfo = await this.msgHandler.getPeerInfo(message.value);
|
|
56882
56921
|
// Calculate session features (intersection of both peer features)
|
|
56883
56922
|
this.sessionFeatures = message.value.features & ourPeerInfo.features;
|
|
56884
|
-
v1_handler_logger.info
|
|
56885
|
-
v1_handler_logger.log
|
|
56886
|
-
v1_handler_logger.log
|
|
56923
|
+
v1_handler_logger.info `Handshake completed. Shared features: 0b${this.sessionFeatures.toString(2)}`;
|
|
56924
|
+
v1_handler_logger.log `Feature ancestry: ${(this.sessionFeatures & Features.Ancestry) !== 0}`;
|
|
56925
|
+
v1_handler_logger.log `Feature fork: ${(this.sessionFeatures & Features.Fork) !== 0}`;
|
|
56887
56926
|
response = {
|
|
56888
56927
|
type: types_MessageType.PeerInfo,
|
|
56889
56928
|
value: ourPeerInfo,
|
|
@@ -56923,22 +56962,22 @@ class handler_FuzzTarget {
|
|
|
56923
56962
|
break;
|
|
56924
56963
|
}
|
|
56925
56964
|
case types_MessageType.StateRoot: {
|
|
56926
|
-
v1_handler_logger.log
|
|
56965
|
+
v1_handler_logger.log `--> Received unexpected 'StateRoot' message from the fuzzer. Closing.`;
|
|
56927
56966
|
this.sender.close();
|
|
56928
56967
|
return;
|
|
56929
56968
|
}
|
|
56930
56969
|
case types_MessageType.State: {
|
|
56931
|
-
v1_handler_logger.log
|
|
56970
|
+
v1_handler_logger.log `--> Received unexpected 'State' message from the fuzzer. Closing.`;
|
|
56932
56971
|
this.sender.close();
|
|
56933
56972
|
return;
|
|
56934
56973
|
}
|
|
56935
56974
|
case types_MessageType.Error: {
|
|
56936
|
-
v1_handler_logger.log
|
|
56975
|
+
v1_handler_logger.log `--> Received unexpected 'Error' message from the fuzzer. Closing.`;
|
|
56937
56976
|
this.sender.close();
|
|
56938
56977
|
return;
|
|
56939
56978
|
}
|
|
56940
56979
|
default: {
|
|
56941
|
-
v1_handler_logger.log
|
|
56980
|
+
v1_handler_logger.log `--> Received unexpected message type ${JSON.stringify(message)} from the fuzzer. Closing.`;
|
|
56942
56981
|
this.sender.close();
|
|
56943
56982
|
try {
|
|
56944
56983
|
debug_assertNever(message);
|
|
@@ -56949,16 +56988,16 @@ class handler_FuzzTarget {
|
|
|
56949
56988
|
}
|
|
56950
56989
|
}
|
|
56951
56990
|
if (response !== null) {
|
|
56952
|
-
v1_handler_logger.trace
|
|
56991
|
+
v1_handler_logger.trace `<-- responding with: ${response.type}`;
|
|
56953
56992
|
const encoded = encoder_Encoder.encodeObject(types_messageCodec, response, this.spec);
|
|
56954
56993
|
this.sender.send(encoded);
|
|
56955
56994
|
}
|
|
56956
56995
|
else {
|
|
56957
|
-
v1_handler_logger.warn
|
|
56996
|
+
v1_handler_logger.warn `<-- no response generated for: ${message.type}`;
|
|
56958
56997
|
}
|
|
56959
56998
|
}
|
|
56960
56999
|
onClose({ error }) {
|
|
56961
|
-
v1_handler_logger.log
|
|
57000
|
+
v1_handler_logger.log `Closing the v1 handler. Reason: ${error !== undefined ? error.message : "close"}.`;
|
|
56962
57001
|
}
|
|
56963
57002
|
/** Check if a specific feature is enabled in the session */
|
|
56964
57003
|
hasFeature(feature) {
|
|
@@ -57004,7 +57043,7 @@ function startIpcServer(name, newMessageHandler) {
|
|
|
57004
57043
|
const logger = Logger.new(import.meta.filename, "ext-ipc");
|
|
57005
57044
|
// Create the IPC server
|
|
57006
57045
|
const server = (0,external_node_net_namespaceObject.createServer)((socket) => {
|
|
57007
|
-
logger.log
|
|
57046
|
+
logger.log `Client connected`;
|
|
57008
57047
|
const messageHandler = newMessageHandler(new IpcSender(socket));
|
|
57009
57048
|
// Handle incoming data from the client
|
|
57010
57049
|
socket.on("data", handleMessageFragmentation(async (data) => {
|
|
@@ -57016,23 +57055,23 @@ function startIpcServer(name, newMessageHandler) {
|
|
|
57016
57055
|
await messageHandler.onSocketMessage(data);
|
|
57017
57056
|
}
|
|
57018
57057
|
catch (e) {
|
|
57019
|
-
logger.error
|
|
57058
|
+
logger.error `Received invalid data on socket: ${e}. Closing connection.`;
|
|
57020
57059
|
socket.end();
|
|
57021
57060
|
}
|
|
57022
57061
|
finally {
|
|
57023
57062
|
socket.resume();
|
|
57024
57063
|
}
|
|
57025
57064
|
}, () => {
|
|
57026
|
-
logger.error
|
|
57065
|
+
logger.error `Received too much data on socket. Closing connection.`;
|
|
57027
57066
|
socket.end();
|
|
57028
57067
|
}));
|
|
57029
57068
|
// Handle client disconnection
|
|
57030
57069
|
socket.on("end", () => {
|
|
57031
|
-
logger.log
|
|
57070
|
+
logger.log `Client disconnected`;
|
|
57032
57071
|
messageHandler.onClose({});
|
|
57033
57072
|
});
|
|
57034
57073
|
socket.on("error", (error) => {
|
|
57035
|
-
logger.error
|
|
57074
|
+
logger.error `Socket error: ${error}`;
|
|
57036
57075
|
messageHandler.onClose({ error });
|
|
57037
57076
|
socket.end();
|
|
57038
57077
|
});
|
|
@@ -57047,14 +57086,14 @@ function startIpcServer(name, newMessageHandler) {
|
|
|
57047
57086
|
path: socketPath,
|
|
57048
57087
|
signal: controller.signal,
|
|
57049
57088
|
}, () => {
|
|
57050
|
-
logger.log
|
|
57089
|
+
logger.log `IPC server is listening at ${socketPath}`;
|
|
57051
57090
|
});
|
|
57052
57091
|
// Handle server errors
|
|
57053
57092
|
server.on("error", (err) => {
|
|
57054
57093
|
throw err;
|
|
57055
57094
|
});
|
|
57056
57095
|
return () => {
|
|
57057
|
-
logger.info
|
|
57096
|
+
logger.info `Closing IPC server.`;
|
|
57058
57097
|
// stop accepting new connections
|
|
57059
57098
|
server.close();
|
|
57060
57099
|
// abort the server
|
|
@@ -57199,7 +57238,7 @@ class JamnpIpcHandler {
|
|
|
57199
57238
|
// decode the message as `StreamEnvelope`
|
|
57200
57239
|
const envelope = decoder_Decoder.decodeObject(StreamEnvelope.Codec, msg);
|
|
57201
57240
|
const streamId = envelope.streamId;
|
|
57202
|
-
jamnp_handler_logger.log
|
|
57241
|
+
jamnp_handler_logger.log `[${streamId}] incoming message: ${envelope.type} ${envelope.data}`;
|
|
57203
57242
|
// check if this is a already known stream id
|
|
57204
57243
|
const streamHandler = this.streams.get(streamId);
|
|
57205
57244
|
const streamSender = new EnvelopeSender(streamId, this.sender);
|
|
@@ -57207,13 +57246,13 @@ class JamnpIpcHandler {
|
|
|
57207
57246
|
if (streamHandler === undefined) {
|
|
57208
57247
|
// closing or message of unknown stream - ignore.
|
|
57209
57248
|
if (envelope.type !== StreamEnvelopeType.Open) {
|
|
57210
|
-
jamnp_handler_logger.warn
|
|
57249
|
+
jamnp_handler_logger.warn `[${streamId}] (unknown) got invalid type ${envelope.type}.`;
|
|
57211
57250
|
return;
|
|
57212
57251
|
}
|
|
57213
57252
|
const newStream = decoder_Decoder.decodeObject(NewStream.Codec, envelope.data);
|
|
57214
57253
|
const handler = this.streamHandlers.get(newStream.streamByte);
|
|
57215
57254
|
if (handler !== undefined) {
|
|
57216
|
-
jamnp_handler_logger.log
|
|
57255
|
+
jamnp_handler_logger.log `[${streamId}] new stream for ${handler.kind}`;
|
|
57217
57256
|
// insert the stream
|
|
57218
57257
|
this.streams.set(streamId, handler);
|
|
57219
57258
|
// Just send back the same stream byte.
|
|
@@ -57234,7 +57273,7 @@ class JamnpIpcHandler {
|
|
|
57234
57273
|
if (envelope.type !== StreamEnvelopeType.Msg) {
|
|
57235
57274
|
// display a warning but only if the stream was not pending for confirmation.
|
|
57236
57275
|
if (!this.pendingStreams.delete(streamId)) {
|
|
57237
|
-
jamnp_handler_logger.warn
|
|
57276
|
+
jamnp_handler_logger.warn `[${streamId}] got invalid type ${envelope.type}.`;
|
|
57238
57277
|
}
|
|
57239
57278
|
return;
|
|
57240
57279
|
}
|
|
@@ -57243,7 +57282,7 @@ class JamnpIpcHandler {
|
|
|
57243
57282
|
}
|
|
57244
57283
|
/** Notify about termination of the underlying socket. */
|
|
57245
57284
|
onClose({ error }) {
|
|
57246
|
-
jamnp_handler_logger.log
|
|
57285
|
+
jamnp_handler_logger.log `Closing the handler. Reason: ${error !== undefined ? error.message : "close"}.`;
|
|
57247
57286
|
// Socket closed - we should probably clear everything.
|
|
57248
57287
|
for (const [streamId, handler] of this.streams.entries()) {
|
|
57249
57288
|
handler.onClose(streamId, error === undefined);
|
|
@@ -57260,7 +57299,7 @@ class JamnpIpcHandler {
|
|
|
57260
57299
|
}
|
|
57261
57300
|
/** Wait for the handler to be finished either via close or error. */
|
|
57262
57301
|
waitForEnd() {
|
|
57263
|
-
jamnp_handler_logger.log
|
|
57302
|
+
jamnp_handler_logger.log `Waiting for the handler to be closed.`;
|
|
57264
57303
|
return this.onEnd.listen;
|
|
57265
57304
|
}
|
|
57266
57305
|
}
|
|
@@ -57389,7 +57428,7 @@ class FuzzHandler {
|
|
|
57389
57428
|
async getSerializedState(value) {
|
|
57390
57429
|
const state = await this.api.getPostSerializedState(value);
|
|
57391
57430
|
if (state === null) {
|
|
57392
|
-
ipc_logger.warn
|
|
57431
|
+
ipc_logger.warn `Fuzzer requested non-existing state for: ${value}`;
|
|
57393
57432
|
return [];
|
|
57394
57433
|
}
|
|
57395
57434
|
return Array.from(state).map(([key, value]) => {
|
|
@@ -57415,7 +57454,7 @@ class FuzzHandler {
|
|
|
57415
57454
|
if (res.isOk) {
|
|
57416
57455
|
return res;
|
|
57417
57456
|
}
|
|
57418
|
-
ipc_logger.log
|
|
57457
|
+
ipc_logger.log `Rejecting block with error: ${res.error}. ${res.details}`;
|
|
57419
57458
|
return result_Result.error(ErrorMessage.create({ message: res.error }));
|
|
57420
57459
|
}
|
|
57421
57460
|
async importBlockV0(value) {
|
|
@@ -57423,11 +57462,11 @@ class FuzzHandler {
|
|
|
57423
57462
|
if (res.isOk) {
|
|
57424
57463
|
return res.ok;
|
|
57425
57464
|
}
|
|
57426
|
-
ipc_logger.warn
|
|
57465
|
+
ipc_logger.warn `Fuzzer sent incorrect block with error ${res.error}. ${res.details}`;
|
|
57427
57466
|
return this.api.getBestStateRootHash();
|
|
57428
57467
|
}
|
|
57429
57468
|
async getPeerInfo(value) {
|
|
57430
|
-
ipc_logger.info
|
|
57469
|
+
ipc_logger.info `Fuzzer ${value} connected.`;
|
|
57431
57470
|
return types_PeerInfo.create({
|
|
57432
57471
|
name: this.api.nodeName,
|
|
57433
57472
|
appVersion: this.api.nodeVersion,
|
|
@@ -57438,7 +57477,7 @@ class FuzzHandler {
|
|
|
57438
57477
|
});
|
|
57439
57478
|
}
|
|
57440
57479
|
async getPeerInfoV0(value) {
|
|
57441
|
-
ipc_logger.info
|
|
57480
|
+
ipc_logger.info `Fuzzer ${value} connected.`;
|
|
57442
57481
|
return PeerInfo.create({
|
|
57443
57482
|
name: this.api.nodeName,
|
|
57444
57483
|
appVersion: this.api.nodeVersion,
|
|
@@ -57471,7 +57510,7 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
|
|
|
57471
57510
|
Logger.configureAll(process.env.JAM_LOG ?? "", Level.LOG);
|
|
57472
57511
|
const machine = networkStateMachine();
|
|
57473
57512
|
const channel = MessageChannelStateMachine.receiveChannel(machine, external_node_worker_threads_namespaceObject.parentPort);
|
|
57474
|
-
channel.then((channel) => jam_network_main(channel)).catch((e) => jam_network_logger.error
|
|
57513
|
+
channel.then((channel) => jam_network_main(channel)).catch((e) => jam_network_logger.error `${e}`);
|
|
57475
57514
|
}
|
|
57476
57515
|
/**
|
|
57477
57516
|
* JAM networking worker.
|
|
@@ -57482,7 +57521,7 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
|
|
|
57482
57521
|
*/
|
|
57483
57522
|
async function jam_network_main(channel) {
|
|
57484
57523
|
await initAll();
|
|
57485
|
-
jam_network_logger.trace
|
|
57524
|
+
jam_network_logger.trace `🛜 Network starting ${channel.currentState()}`;
|
|
57486
57525
|
// Await the configuration object
|
|
57487
57526
|
// TODO [ToDr] The whole state machine needs to die.
|
|
57488
57527
|
const ready = channel.currentState().stateName !== "ready(network)"
|
|
@@ -57493,7 +57532,7 @@ async function jam_network_main(channel) {
|
|
|
57493
57532
|
const key = await ed25519_privateKey(config.key);
|
|
57494
57533
|
const lmdb = new LmdbRoot(config.genericConfig.dbPath);
|
|
57495
57534
|
const blocks = new LmdbBlocks(config.genericConfig.chainSpec, lmdb);
|
|
57496
|
-
jam_network_logger.info
|
|
57535
|
+
jam_network_logger.info `🛜 Listening at ${config.host}:${config.port}`;
|
|
57497
57536
|
const network = await setup({
|
|
57498
57537
|
host: config.host,
|
|
57499
57538
|
port: config.port,
|
|
@@ -57506,7 +57545,7 @@ async function jam_network_main(channel) {
|
|
|
57506
57545
|
ready.waitForState("finished").then(() => network.network.stop());
|
|
57507
57546
|
await network.network.start();
|
|
57508
57547
|
});
|
|
57509
|
-
jam_network_logger.info
|
|
57548
|
+
jam_network_logger.info `🛜 Network worker finished. Closing channel.`;
|
|
57510
57549
|
// Close the comms to gracefuly close the app.
|
|
57511
57550
|
finished.currentState().close(channel);
|
|
57512
57551
|
}
|
|
@@ -57552,8 +57591,8 @@ async function main_main(config, withRelPath) {
|
|
|
57552
57591
|
throw new Error("The main binary cannot be running as a Worker!");
|
|
57553
57592
|
}
|
|
57554
57593
|
await initAll();
|
|
57555
|
-
common_logger.info
|
|
57556
|
-
common_logger.info
|
|
57594
|
+
common_logger.info `🫐 Typeberry ${package_namespaceObject.rE}. GP: ${CURRENT_VERSION} (${CURRENT_SUITE})`;
|
|
57595
|
+
common_logger.info `🎸 Starting node: ${config.nodeName}.`;
|
|
57557
57596
|
const chainSpec = getChainSpec(config.node.flavor);
|
|
57558
57597
|
const { rootDb, dbPath, genesisHeaderHash } = openDatabase(config.nodeName, config.node.chainSpec.genesisHeader, withRelPath(config.node.databaseBasePath));
|
|
57559
57598
|
// Initialize the database with genesis state and block if there isn't one.
|
|
@@ -57596,30 +57635,30 @@ async function main_main(config, withRelPath) {
|
|
|
57596
57635
|
return importer.finish(port);
|
|
57597
57636
|
});
|
|
57598
57637
|
await importerFinished.currentState().waitForWorkerToFinish();
|
|
57599
|
-
common_logger.log
|
|
57638
|
+
common_logger.log `[main] ☠️ Closing the extensions`;
|
|
57600
57639
|
closeExtensions();
|
|
57601
|
-
common_logger.log
|
|
57640
|
+
common_logger.log `[main] ☠️ Closing the authorship module`;
|
|
57602
57641
|
closeAuthorship();
|
|
57603
|
-
common_logger.log
|
|
57642
|
+
common_logger.log `[main] ☠️ Closing the networking module`;
|
|
57604
57643
|
closeNetwork();
|
|
57605
|
-
common_logger.log
|
|
57644
|
+
common_logger.log `[main] 🛢️ Closing the database`;
|
|
57606
57645
|
await rootDb.close();
|
|
57607
|
-
common_logger.info
|
|
57646
|
+
common_logger.info `[main] ✅ Done.`;
|
|
57608
57647
|
},
|
|
57609
57648
|
};
|
|
57610
57649
|
return api;
|
|
57611
57650
|
}
|
|
57612
57651
|
const initAuthorship = async (importerReady, isAuthoring, config) => {
|
|
57613
57652
|
if (!isAuthoring) {
|
|
57614
|
-
common_logger.log
|
|
57653
|
+
common_logger.log `✍️ Authorship off: disabled`;
|
|
57615
57654
|
return () => Promise.resolve();
|
|
57616
57655
|
}
|
|
57617
|
-
common_logger.info
|
|
57656
|
+
common_logger.info `✍️ Starting block generator.`;
|
|
57618
57657
|
const { generator, finish } = await startBlockGenerator(config);
|
|
57619
57658
|
// relay blocks from generator to importer
|
|
57620
57659
|
importerReady.doUntil("finished", async (importer, port) => {
|
|
57621
57660
|
generator.currentState().onBlock.on((b) => {
|
|
57622
|
-
common_logger.log
|
|
57661
|
+
common_logger.log `✍️ Produced block. Size: [${b.length}]`;
|
|
57623
57662
|
importer.sendBlock(port, b);
|
|
57624
57663
|
});
|
|
57625
57664
|
});
|
|
@@ -57627,7 +57666,7 @@ const initAuthorship = async (importerReady, isAuthoring, config) => {
|
|
|
57627
57666
|
};
|
|
57628
57667
|
const initNetwork = async (importerReady, workerConfig, genesisHeaderHash, networkConfig, bestHeader) => {
|
|
57629
57668
|
if (networkConfig === null) {
|
|
57630
|
-
common_logger.log
|
|
57669
|
+
common_logger.log `🛜 Networking off: no config`;
|
|
57631
57670
|
return () => Promise.resolve();
|
|
57632
57671
|
}
|
|
57633
57672
|
const { key, host, port, bootnodes } = networkConfig;
|
|
@@ -59577,7 +59616,7 @@ class AccumulateExternalities {
|
|
|
59577
59616
|
/** https://graypaper.fluffylabs.dev/#/7e6ff6a/362802362d02?v=0.6.7 */
|
|
59578
59617
|
const validatorsManager = this.updatedState.getPrivilegedServices().validatorsManager;
|
|
59579
59618
|
if (validatorsManager !== this.currentServiceId) {
|
|
59580
|
-
accumulate_externalities_logger.trace
|
|
59619
|
+
accumulate_externalities_logger.trace `Current service id (${this.currentServiceId}) is not a validators manager. (expected: ${validatorsManager}) and cannot update validators data. Ignoring`;
|
|
59581
59620
|
return result_Result.error(UnprivilegedError);
|
|
59582
59621
|
}
|
|
59583
59622
|
this.updatedState.stateUpdate.validatorsData = validatorsData;
|
|
@@ -59592,11 +59631,11 @@ class AccumulateExternalities {
|
|
|
59592
59631
|
// NOTE `coreIndex` is already verified in the HC, so this is infallible.
|
|
59593
59632
|
const currentAuthManager = this.updatedState.getPrivilegedServices().authManager[coreIndex];
|
|
59594
59633
|
if (currentAuthManager !== this.currentServiceId) {
|
|
59595
|
-
accumulate_externalities_logger.trace
|
|
59634
|
+
accumulate_externalities_logger.trace `Current service id (${this.currentServiceId}) is not an auth manager of core ${coreIndex} (expected: ${currentAuthManager}) and cannot update authorization queue. Ignoring`;
|
|
59596
59635
|
return result_Result.error(UpdatePrivilegesError.UnprivilegedService);
|
|
59597
59636
|
}
|
|
59598
59637
|
if (authManager === null && Compatibility.isGreaterOrEqual(GpVersion.V0_7_1)) {
|
|
59599
|
-
accumulate_externalities_logger.trace
|
|
59638
|
+
accumulate_externalities_logger.trace `The new auth manager is not a valid service id. Ignoring`;
|
|
59600
59639
|
return result_Result.error(UpdatePrivilegesError.InvalidServiceId);
|
|
59601
59640
|
}
|
|
59602
59641
|
this.updatedState.stateUpdate.authorizationQueues.set(coreIndex, authQueue);
|
|
@@ -60477,7 +60516,7 @@ class Assign {
|
|
|
60477
60516
|
const memoryReadResult = memory.loadInto(res, authorizationQueueStart);
|
|
60478
60517
|
// error while reading the memory.
|
|
60479
60518
|
if (memoryReadResult.isError) {
|
|
60480
|
-
logger_logger.trace
|
|
60519
|
+
logger_logger.trace `ASSIGN() <- PANIC`;
|
|
60481
60520
|
return PvmExecution.Panic;
|
|
60482
60521
|
}
|
|
60483
60522
|
if (maybeCoreIndex >= this.chainSpec.coresCount) {
|
|
@@ -60492,18 +60531,18 @@ class Assign {
|
|
|
60492
60531
|
const result = this.partialState.updateAuthorizationQueue(coreIndex, fixedSizeAuthQueue, authManager);
|
|
60493
60532
|
if (result.isOk) {
|
|
60494
60533
|
regs.set(IN_OUT_REG, HostCallResult.OK);
|
|
60495
|
-
logger_logger.trace
|
|
60534
|
+
logger_logger.trace `ASSIGN(${coreIndex}, ${fixedSizeAuthQueue}) <- OK`;
|
|
60496
60535
|
return;
|
|
60497
60536
|
}
|
|
60498
60537
|
const e = result.error;
|
|
60499
60538
|
if (e === UpdatePrivilegesError.UnprivilegedService) {
|
|
60500
60539
|
regs.set(IN_OUT_REG, HostCallResult.HUH);
|
|
60501
|
-
logger_logger.trace
|
|
60540
|
+
logger_logger.trace `ASSIGN(${coreIndex}, ${fixedSizeAuthQueue}) <- HUH`;
|
|
60502
60541
|
return;
|
|
60503
60542
|
}
|
|
60504
60543
|
if (e === UpdatePrivilegesError.InvalidServiceId) {
|
|
60505
60544
|
regs.set(IN_OUT_REG, HostCallResult.WHO);
|
|
60506
|
-
logger_logger.trace
|
|
60545
|
+
logger_logger.trace `ASSIGN(${coreIndex}, ${fixedSizeAuthQueue}) <- HUH`;
|
|
60507
60546
|
return;
|
|
60508
60547
|
}
|
|
60509
60548
|
debug_assertNever(e);
|
|
@@ -60569,7 +60608,7 @@ class Bless {
|
|
|
60569
60608
|
decoder.resetTo(0);
|
|
60570
60609
|
const memoryReadResult = memory.loadInto(result, memIndex);
|
|
60571
60610
|
if (memoryReadResult.isError) {
|
|
60572
|
-
logger_logger.trace
|
|
60611
|
+
logger_logger.trace `BLESS(${manager}, ${validator}) <- PANIC`;
|
|
60573
60612
|
return PvmExecution.Panic;
|
|
60574
60613
|
}
|
|
60575
60614
|
const { serviceId, gas } = decoder.object(serviceIdAndGasCodec);
|
|
@@ -60582,24 +60621,24 @@ class Bless {
|
|
|
60582
60621
|
const authorizersDecoder = decoder_Decoder.fromBlob(res);
|
|
60583
60622
|
const memoryReadResult = memory.loadInto(res, authorization);
|
|
60584
60623
|
if (memoryReadResult.isError) {
|
|
60585
|
-
logger_logger.trace
|
|
60624
|
+
logger_logger.trace `BLESS(${manager}, ${validator}, ${autoAccumulateEntries}) <- PANIC`;
|
|
60586
60625
|
return PvmExecution.Panic;
|
|
60587
60626
|
}
|
|
60588
60627
|
const authorizers = tryAsPerCore(authorizersDecoder.sequenceFixLen(descriptors_codec.u32.asOpaque(), this.chainSpec.coresCount), this.chainSpec);
|
|
60589
60628
|
const updateResult = this.partialState.updatePrivilegedServices(manager, authorizers, validator, autoAccumulateEntries);
|
|
60590
60629
|
if (updateResult.isOk) {
|
|
60591
|
-
logger_logger.trace
|
|
60630
|
+
logger_logger.trace `BLESS(${manager}, ${authorizers}, ${validator}, ${autoAccumulateEntries}) <- OK`;
|
|
60592
60631
|
regs.set(bless_IN_OUT_REG, HostCallResult.OK);
|
|
60593
60632
|
return;
|
|
60594
60633
|
}
|
|
60595
60634
|
const e = updateResult.error;
|
|
60596
60635
|
if (e === UpdatePrivilegesError.UnprivilegedService) {
|
|
60597
|
-
logger_logger.trace
|
|
60636
|
+
logger_logger.trace `BLESS(${manager}, ${authorizers}, ${validator}, ${autoAccumulateEntries}) <- HUH`;
|
|
60598
60637
|
regs.set(bless_IN_OUT_REG, HostCallResult.HUH);
|
|
60599
60638
|
return;
|
|
60600
60639
|
}
|
|
60601
60640
|
if (e === UpdatePrivilegesError.InvalidServiceId) {
|
|
60602
|
-
logger_logger.trace
|
|
60641
|
+
logger_logger.trace `BLESS(${manager}, ${authorizers}, ${validator}, ${autoAccumulateEntries}) <- WHO`;
|
|
60603
60642
|
regs.set(bless_IN_OUT_REG, HostCallResult.WHO);
|
|
60604
60643
|
return;
|
|
60605
60644
|
}
|
|
@@ -60629,7 +60668,7 @@ class GasHostCall {
|
|
|
60629
60668
|
}
|
|
60630
60669
|
execute(gas, regs) {
|
|
60631
60670
|
const gasValue = gas.get();
|
|
60632
|
-
logger_logger.trace
|
|
60671
|
+
logger_logger.trace `GAS <- ${gasValue}`;
|
|
60633
60672
|
regs.set(7, numbers_tryAsU64(gasValue));
|
|
60634
60673
|
return Promise.resolve(undefined);
|
|
60635
60674
|
}
|
|
@@ -60661,7 +60700,7 @@ class Checkpoint {
|
|
|
60661
60700
|
async execute(gas, regs) {
|
|
60662
60701
|
await this.gasHostCall.execute(gas, regs);
|
|
60663
60702
|
this.partialState.checkpoint();
|
|
60664
|
-
logger_logger.trace
|
|
60703
|
+
logger_logger.trace `CHECKPOINT()`;
|
|
60665
60704
|
return;
|
|
60666
60705
|
}
|
|
60667
60706
|
}
|
|
@@ -60700,18 +60739,18 @@ class Designate {
|
|
|
60700
60739
|
const memoryReadResult = memory.loadInto(res, validatorsStart);
|
|
60701
60740
|
// error while reading the memory.
|
|
60702
60741
|
if (memoryReadResult.isError) {
|
|
60703
|
-
logger_logger.trace
|
|
60742
|
+
logger_logger.trace `DESIGNATE() <- PANIC`;
|
|
60704
60743
|
return PvmExecution.Panic;
|
|
60705
60744
|
}
|
|
60706
60745
|
const decoder = decoder_Decoder.fromBlob(res);
|
|
60707
60746
|
const validatorsData = decoder.sequenceFixLen(ValidatorData.Codec, this.chainSpec.validatorsCount);
|
|
60708
60747
|
const result = this.partialState.updateValidatorsData(tryAsPerValidator(validatorsData, this.chainSpec));
|
|
60709
60748
|
if (result.isError) {
|
|
60710
|
-
logger_logger.trace
|
|
60749
|
+
logger_logger.trace `DESIGNATE([${validatorsData[0]}, ${validatorsData[1]}, ...]) <- HUH`;
|
|
60711
60750
|
regs.set(designate_IN_OUT_REG, HostCallResult.HUH);
|
|
60712
60751
|
}
|
|
60713
60752
|
else {
|
|
60714
|
-
logger_logger.trace
|
|
60753
|
+
logger_logger.trace `DESIGNATE([${validatorsData[0]}, ${validatorsData[1]}, ...]) <- OK`;
|
|
60715
60754
|
regs.set(designate_IN_OUT_REG, HostCallResult.OK);
|
|
60716
60755
|
}
|
|
60717
60756
|
}
|
|
@@ -60752,17 +60791,17 @@ class Eject {
|
|
|
60752
60791
|
const previousCodeHash = bytes_Bytes.zero(hash_HASH_SIZE).asOpaque();
|
|
60753
60792
|
const memoryReadResult = memory.loadInto(previousCodeHash.raw, preimageHashStart);
|
|
60754
60793
|
if (memoryReadResult.isError) {
|
|
60755
|
-
logger_logger.trace
|
|
60794
|
+
logger_logger.trace `EJECT(${serviceId}) <- PANIC`;
|
|
60756
60795
|
return PvmExecution.Panic;
|
|
60757
60796
|
}
|
|
60758
60797
|
// cannot eject self
|
|
60759
60798
|
if (serviceId === this.currentServiceId) {
|
|
60760
60799
|
regs.set(eject_IN_OUT_REG, HostCallResult.WHO);
|
|
60761
|
-
logger_logger.trace
|
|
60800
|
+
logger_logger.trace `EJECT(${serviceId}, ${previousCodeHash}) <- WHO`;
|
|
60762
60801
|
return;
|
|
60763
60802
|
}
|
|
60764
60803
|
const result = this.partialState.eject(serviceId, previousCodeHash);
|
|
60765
|
-
logger_logger.trace
|
|
60804
|
+
logger_logger.trace `EJECT(${serviceId}, ${previousCodeHash}) <- ${resultToString(result)}`;
|
|
60766
60805
|
// All good!
|
|
60767
60806
|
if (result.isOk) {
|
|
60768
60807
|
regs.set(eject_IN_OUT_REG, HostCallResult.OK);
|
|
@@ -60814,11 +60853,11 @@ class Forget {
|
|
|
60814
60853
|
const memoryReadResult = memory.loadInto(hash.raw, hashStart);
|
|
60815
60854
|
// error while reading the memory.
|
|
60816
60855
|
if (memoryReadResult.isError) {
|
|
60817
|
-
logger_logger.trace
|
|
60856
|
+
logger_logger.trace `FORGET(${hash}, ${length}) <- PANIC`;
|
|
60818
60857
|
return PvmExecution.Panic;
|
|
60819
60858
|
}
|
|
60820
60859
|
const result = this.partialState.forgetPreimage(hash.asOpaque(), length);
|
|
60821
|
-
logger_logger.trace
|
|
60860
|
+
logger_logger.trace `FORGET(${hash}, ${length}) <- ${resultToString(result)}`;
|
|
60822
60861
|
if (result.isOk) {
|
|
60823
60862
|
regs.set(forget_IN_OUT_REG, HostCallResult.OK);
|
|
60824
60863
|
}
|
|
@@ -60871,11 +60910,11 @@ class New {
|
|
|
60871
60910
|
const memoryReadResult = memory.loadInto(codeHash.raw, codeHashStart);
|
|
60872
60911
|
// error while reading the memory.
|
|
60873
60912
|
if (memoryReadResult.isError) {
|
|
60874
|
-
logger_logger.trace
|
|
60913
|
+
logger_logger.trace `NEW(${codeHash}, ${codeLength}, ${gas}, ${allowance}, ${gratisStorage}) <- PANIC`;
|
|
60875
60914
|
return PvmExecution.Panic;
|
|
60876
60915
|
}
|
|
60877
60916
|
const assignedId = this.partialState.newService(codeHash.asOpaque(), codeLength, gas, allowance, gratisStorage);
|
|
60878
|
-
logger_logger.trace
|
|
60917
|
+
logger_logger.trace `NEW(${codeHash}, ${codeLength}, ${gas}, ${allowance}, ${gratisStorage}) <- ${resultToString(assignedId)}`;
|
|
60879
60918
|
if (assignedId.isOk) {
|
|
60880
60919
|
regs.set(new_IN_OUT_REG, numbers_tryAsU64(assignedId.ok));
|
|
60881
60920
|
return;
|
|
@@ -60930,11 +60969,11 @@ class Provide {
|
|
|
60930
60969
|
const preimage = bytes_BytesBlob.blobFrom(new Uint8Array(length));
|
|
60931
60970
|
const memoryReadResult = memory.loadInto(preimage.raw, preimageStart);
|
|
60932
60971
|
if (memoryReadResult.isError) {
|
|
60933
|
-
logger_logger.trace
|
|
60972
|
+
logger_logger.trace `PROVIDE(${serviceId}, ${preimage.toStringTruncated()}) <- PANIC`;
|
|
60934
60973
|
return PvmExecution.Panic;
|
|
60935
60974
|
}
|
|
60936
60975
|
const result = this.partialState.providePreimage(serviceId, preimage);
|
|
60937
|
-
logger_logger.trace
|
|
60976
|
+
logger_logger.trace `PROVIDE(${serviceId}, ${preimage.toStringTruncated()}) <- ${resultToString(result)}`;
|
|
60938
60977
|
if (result.isOk) {
|
|
60939
60978
|
regs.set(provide_IN_OUT_REG, HostCallResult.OK);
|
|
60940
60979
|
return;
|
|
@@ -60988,11 +61027,11 @@ class Query {
|
|
|
60988
61027
|
const memoryReadResult = memory.loadInto(hash.raw, hashStart);
|
|
60989
61028
|
// error while reading the memory.
|
|
60990
61029
|
if (memoryReadResult.isError) {
|
|
60991
|
-
logger_logger.trace
|
|
61030
|
+
logger_logger.trace `QUERY(${hash}, ${length}) <- PANIC`;
|
|
60992
61031
|
return PvmExecution.Panic;
|
|
60993
61032
|
}
|
|
60994
61033
|
const result = this.partialState.checkPreimageStatus(hash.asOpaque(), length);
|
|
60995
|
-
logger_logger.trace
|
|
61034
|
+
logger_logger.trace `QUERY(${hash}, ${length}) <- ${result}`;
|
|
60996
61035
|
const zero = numbers_tryAsU64(0n);
|
|
60997
61036
|
if (result === null) {
|
|
60998
61037
|
regs.set(IN_OUT_REG_1, HostCallResult.NONE);
|
|
@@ -61053,11 +61092,11 @@ class Solicit {
|
|
|
61053
61092
|
const hash = bytes_Bytes.zero(hash_HASH_SIZE);
|
|
61054
61093
|
const memoryReadResult = memory.loadInto(hash.raw, hashStart);
|
|
61055
61094
|
if (memoryReadResult.isError) {
|
|
61056
|
-
logger_logger.trace
|
|
61095
|
+
logger_logger.trace `SOLICIT(${hash}, ${length}) <- PANIC`;
|
|
61057
61096
|
return PvmExecution.Panic;
|
|
61058
61097
|
}
|
|
61059
61098
|
const result = this.partialState.requestPreimage(hash.asOpaque(), length);
|
|
61060
|
-
logger_logger.trace
|
|
61099
|
+
logger_logger.trace `SOLICIT(${hash}, ${length}) <- ${resultToString(result)}`;
|
|
61061
61100
|
if (result.isOk) {
|
|
61062
61101
|
regs.set(solicit_IN_OUT_REG, HostCallResult.OK);
|
|
61063
61102
|
return;
|
|
@@ -61129,11 +61168,11 @@ class Transfer {
|
|
|
61129
61168
|
const memoryReadResult = memory.loadInto(memo.raw, memoStart);
|
|
61130
61169
|
// page fault while reading the memory.
|
|
61131
61170
|
if (memoryReadResult.isError) {
|
|
61132
|
-
logger_logger.trace
|
|
61171
|
+
logger_logger.trace `TRANSFER(${destination}, ${amount}, ${onTransferGas}, ${memo}) <- PANIC`;
|
|
61133
61172
|
return PvmExecution.Panic;
|
|
61134
61173
|
}
|
|
61135
61174
|
const transferResult = this.partialState.transfer(destination, amount, onTransferGas, memo);
|
|
61136
|
-
logger_logger.trace
|
|
61175
|
+
logger_logger.trace `TRANSFER(${destination}, ${amount}, ${onTransferGas}, ${memo}) <- ${resultToString(transferResult)}`;
|
|
61137
61176
|
// All good!
|
|
61138
61177
|
if (transferResult.isOk) {
|
|
61139
61178
|
regs.set(transfer_IN_OUT_REG, HostCallResult.OK);
|
|
@@ -61192,11 +61231,11 @@ class Upgrade {
|
|
|
61192
61231
|
const codeHash = bytes_Bytes.zero(hash_HASH_SIZE);
|
|
61193
61232
|
const memoryReadResult = memory.loadInto(codeHash.raw, codeHashStart);
|
|
61194
61233
|
if (memoryReadResult.isError) {
|
|
61195
|
-
logger_logger.trace
|
|
61234
|
+
logger_logger.trace `UPGRADE(${codeHash}, ${gas}, ${allowance}) <- PANIC`;
|
|
61196
61235
|
return PvmExecution.Panic;
|
|
61197
61236
|
}
|
|
61198
61237
|
this.partialState.upgradeService(codeHash.asOpaque(), gas, allowance);
|
|
61199
|
-
logger_logger.trace
|
|
61238
|
+
logger_logger.trace `UPGRADE(${codeHash}, ${gas}, ${allowance})`;
|
|
61200
61239
|
regs.set(upgrade_IN_OUT_REG, HostCallResult.OK);
|
|
61201
61240
|
}
|
|
61202
61241
|
}
|
|
@@ -61230,11 +61269,11 @@ class Yield {
|
|
|
61230
61269
|
const hash = bytes_Bytes.zero(hash_HASH_SIZE);
|
|
61231
61270
|
const memoryReadResult = memory.loadInto(hash.raw, hashStart);
|
|
61232
61271
|
if (memoryReadResult.isError) {
|
|
61233
|
-
logger_logger.trace
|
|
61272
|
+
logger_logger.trace `YIELD() <- PANIC`;
|
|
61234
61273
|
return PvmExecution.Panic;
|
|
61235
61274
|
}
|
|
61236
61275
|
this.partialState.yield(hash);
|
|
61237
|
-
logger_logger.trace
|
|
61276
|
+
logger_logger.trace `YIELD(${hash})`;
|
|
61238
61277
|
regs.set(yield_IN_OUT_REG, HostCallResult.OK);
|
|
61239
61278
|
}
|
|
61240
61279
|
}
|
|
@@ -61276,10 +61315,10 @@ class Fetch {
|
|
|
61276
61315
|
const chunk = value === null ? new Uint8Array() : value.raw.subarray(Number(offset), Number(offset + length));
|
|
61277
61316
|
const storeResult = memory.storeFrom(output, chunk);
|
|
61278
61317
|
if (storeResult.isError) {
|
|
61279
|
-
logger_logger.trace
|
|
61318
|
+
logger_logger.trace `FETCH(${kind}) <- PANIC`;
|
|
61280
61319
|
return PvmExecution.Panic;
|
|
61281
61320
|
}
|
|
61282
|
-
logger_logger.trace
|
|
61321
|
+
logger_logger.trace `FETCH(${kind}) <- ${value?.toStringTruncated()}`;
|
|
61283
61322
|
// write result
|
|
61284
61323
|
regs.set(fetch_IN_OUT_REG, value === null ? HostCallResult.NONE : valueLength);
|
|
61285
61324
|
}
|
|
@@ -61438,10 +61477,10 @@ class Info {
|
|
|
61438
61477
|
const chunk = encodedInfo.raw.subarray(Number(offset), Number(offset + length));
|
|
61439
61478
|
const writeResult = memory.storeFrom(outputStart, chunk);
|
|
61440
61479
|
if (writeResult.isError) {
|
|
61441
|
-
logger_logger.trace
|
|
61480
|
+
logger_logger.trace `INFO(${serviceId}) <- PANIC`;
|
|
61442
61481
|
return PvmExecution.Panic;
|
|
61443
61482
|
}
|
|
61444
|
-
logger_logger.trace
|
|
61483
|
+
logger_logger.trace `INFO(${serviceId}) <- ${bytes_BytesBlob.blobFrom(chunk)}`;
|
|
61445
61484
|
if (accountInfo === null) {
|
|
61446
61485
|
regs.set(info_IN_OUT_REG, HostCallResult.NONE);
|
|
61447
61486
|
return;
|
|
@@ -61502,7 +61541,7 @@ class LogHostCall {
|
|
|
61502
61541
|
memory.loadInto(target, targetStart);
|
|
61503
61542
|
}
|
|
61504
61543
|
memory.loadInto(message, msgStart);
|
|
61505
|
-
logger_logger.trace
|
|
61544
|
+
logger_logger.trace `SERVICE [${this.currentServiceId}] [${lvl}] ${decoder.decode(target)} ${decoder.decode(message)}`;
|
|
61506
61545
|
return Promise.resolve(undefined);
|
|
61507
61546
|
}
|
|
61508
61547
|
}
|
|
@@ -61542,12 +61581,12 @@ class Lookup {
|
|
|
61542
61581
|
const preImageHash = bytes_Bytes.zero(hash_HASH_SIZE);
|
|
61543
61582
|
const memoryReadResult = memory.loadInto(preImageHash.raw, hashAddress);
|
|
61544
61583
|
if (memoryReadResult.isError) {
|
|
61545
|
-
logger_logger.trace
|
|
61584
|
+
logger_logger.trace `LOOKUP(${serviceId}, ${preImageHash}) <- PANIC`;
|
|
61546
61585
|
return PvmExecution.Panic;
|
|
61547
61586
|
}
|
|
61548
61587
|
// v
|
|
61549
61588
|
const preImage = this.account.lookup(serviceId, preImageHash);
|
|
61550
|
-
logger_logger.trace
|
|
61589
|
+
logger_logger.trace `LOOKUP(${serviceId}, ${preImageHash}) <- ${preImage?.toStringTruncated()}...`;
|
|
61551
61590
|
const preImageLength = preImage === null ? numbers_tryAsU64(0) : numbers_tryAsU64(preImage.raw.length);
|
|
61552
61591
|
const preimageBlobOffset = regs.get(10);
|
|
61553
61592
|
const lengthToWrite = regs.get(11);
|
|
@@ -61609,7 +61648,7 @@ class Read {
|
|
|
61609
61648
|
const rawKey = bytes_BytesBlob.blobFrom(new Uint8Array(storageKeyLengthClamped));
|
|
61610
61649
|
const memoryReadResult = memory.loadInto(rawKey.raw, storageKeyStartAddress);
|
|
61611
61650
|
if (memoryReadResult.isError) {
|
|
61612
|
-
logger_logger.trace
|
|
61651
|
+
logger_logger.trace `READ(${serviceId}, ${rawKey}) <- PANIC`;
|
|
61613
61652
|
return PvmExecution.Panic;
|
|
61614
61653
|
}
|
|
61615
61654
|
// v
|
|
@@ -61627,15 +61666,15 @@ class Read {
|
|
|
61627
61666
|
const chunk = value === null ? new Uint8Array(0) : value.raw.subarray(Number(offset), Number(offset + blobLength));
|
|
61628
61667
|
const memoryWriteResult = memory.storeFrom(destinationAddress, chunk);
|
|
61629
61668
|
if (memoryWriteResult.isError) {
|
|
61630
|
-
logger_logger.trace
|
|
61669
|
+
logger_logger.trace `READ(${serviceId}, ${rawKey}) <- PANIC`;
|
|
61631
61670
|
return PvmExecution.Panic;
|
|
61632
61671
|
}
|
|
61633
61672
|
if (value === null) {
|
|
61634
|
-
logger_logger.trace
|
|
61673
|
+
logger_logger.trace `READ(${serviceId}, ${rawKey}) <- NONE`;
|
|
61635
61674
|
regs.set(read_IN_OUT_REG, HostCallResult.NONE);
|
|
61636
61675
|
return;
|
|
61637
61676
|
}
|
|
61638
|
-
logger_logger.trace
|
|
61677
|
+
logger_logger.trace `READ(${serviceId}, ${rawKey}) <- ${bytes_BytesBlob.blobFrom(chunk).toStringTruncated()}`;
|
|
61639
61678
|
regs.set(read_IN_OUT_REG, valueLength);
|
|
61640
61679
|
}
|
|
61641
61680
|
}
|
|
@@ -61678,7 +61717,7 @@ class Write {
|
|
|
61678
61717
|
const rawStorageKey = new Uint8Array(storageKeyLengthClamped);
|
|
61679
61718
|
const keyLoadingResult = memory.loadInto(rawStorageKey, storageKeyStartAddress);
|
|
61680
61719
|
if (keyLoadingResult.isError) {
|
|
61681
|
-
logger_logger.trace
|
|
61720
|
+
logger_logger.trace `WRITE() <- PANIC`;
|
|
61682
61721
|
return PvmExecution.Panic;
|
|
61683
61722
|
}
|
|
61684
61723
|
// k
|
|
@@ -61688,14 +61727,14 @@ class Write {
|
|
|
61688
61727
|
const valueLoadingResult = memory.loadInto(value, valueStart);
|
|
61689
61728
|
// Note [MaSo] this is ok to return bcs if valueLength is 0, then this panic won't happen
|
|
61690
61729
|
if (valueLoadingResult.isError) {
|
|
61691
|
-
logger_logger.trace
|
|
61730
|
+
logger_logger.trace `WRITE(${storageKey}) <- PANIC`;
|
|
61692
61731
|
return PvmExecution.Panic;
|
|
61693
61732
|
}
|
|
61694
61733
|
/** https://graypaper.fluffylabs.dev/#/9a08063/33af0133b201?v=0.6.6 */
|
|
61695
61734
|
const maybeValue = valueLength === 0n ? null : bytes_BytesBlob.blobFrom(value);
|
|
61696
61735
|
// a
|
|
61697
61736
|
const result = this.account.write(storageKey, maybeValue);
|
|
61698
|
-
logger_logger.trace
|
|
61737
|
+
logger_logger.trace `WRITE(${storageKey}, ${maybeValue?.toStringTruncated()}) <- ${resultToString(result)}`;
|
|
61699
61738
|
if (result.isError) {
|
|
61700
61739
|
regs.set(write_IN_OUT_REG, HostCallResult.FULL);
|
|
61701
61740
|
return;
|
|
@@ -61887,18 +61926,18 @@ class Accumulate {
|
|
|
61887
61926
|
async pvmAccumulateInvocation(slot, serviceId, operands, gas, entropy, inputStateUpdate) {
|
|
61888
61927
|
const service = this.state.getService(serviceId);
|
|
61889
61928
|
if (service === null) {
|
|
61890
|
-
accumulate_logger.log
|
|
61929
|
+
accumulate_logger.log `Service with id ${serviceId} not found.`;
|
|
61891
61930
|
return result_Result.error(PvmInvocationError.NoService);
|
|
61892
61931
|
}
|
|
61893
61932
|
const codeHash = service.getInfo().codeHash;
|
|
61894
61933
|
// TODO [ToDr] Should we check that the preimage is still available?
|
|
61895
61934
|
const code = service.getPreimage(codeHash.asOpaque());
|
|
61896
61935
|
if (code === null) {
|
|
61897
|
-
accumulate_logger.log
|
|
61936
|
+
accumulate_logger.log `Code with hash ${codeHash} not found for service ${serviceId}.`;
|
|
61898
61937
|
return result_Result.error(PvmInvocationError.NoPreimage);
|
|
61899
61938
|
}
|
|
61900
61939
|
if (code.length > W_C) {
|
|
61901
|
-
accumulate_logger.log
|
|
61940
|
+
accumulate_logger.log `Code with hash ${codeHash} is too long for service ${serviceId}.`;
|
|
61902
61941
|
return result_Result.error(PvmInvocationError.PreimageTooLong);
|
|
61903
61942
|
}
|
|
61904
61943
|
const nextServiceId = generateNextServiceId({ serviceId, entropy, timeslot: slot }, this.chainSpec);
|
|
@@ -61920,10 +61959,10 @@ class Accumulate {
|
|
|
61920
61959
|
if (result.hasStatus()) {
|
|
61921
61960
|
const status = result.status;
|
|
61922
61961
|
if (status === status_Status.OOG || status === status_Status.PANIC) {
|
|
61923
|
-
accumulate_logger.trace
|
|
61962
|
+
accumulate_logger.trace `[${serviceId}] accumulate finished with ${status_Status[status]} reverting to checkpoint.`;
|
|
61924
61963
|
return result_Result.ok({ stateUpdate: checkpoint, consumedGas: common_tryAsServiceGas(result.consumedGas) });
|
|
61925
61964
|
}
|
|
61926
|
-
accumulate_logger.trace
|
|
61965
|
+
accumulate_logger.trace `[${serviceId}] accumulate finished with ${status_Status[status]}`;
|
|
61927
61966
|
}
|
|
61928
61967
|
/**
|
|
61929
61968
|
* PVM invocation returned a hash so we override whatever `yield` host call
|
|
@@ -61948,14 +61987,14 @@ class Accumulate {
|
|
|
61948
61987
|
* https://graypaper.fluffylabs.dev/#/7e6ff6a/18d70118d701?v=0.6.7
|
|
61949
61988
|
*/
|
|
61950
61989
|
async accumulateSingleService(serviceId, operands, gasCost, slot, entropy, inputStateUpdate) {
|
|
61951
|
-
accumulate_logger.log
|
|
61990
|
+
accumulate_logger.log `Accumulating service ${serviceId}, items: ${operands.length} at slot: ${slot}.`;
|
|
61952
61991
|
const result = await this.pvmAccumulateInvocation(slot, serviceId, operands, gasCost, entropy, inputStateUpdate);
|
|
61953
61992
|
if (result.isError) {
|
|
61954
61993
|
// https://graypaper.fluffylabs.dev/#/7e6ff6a/2fb6012fb601?v=0.6.7
|
|
61955
|
-
accumulate_logger.log
|
|
61994
|
+
accumulate_logger.log `Accumulation failed for ${serviceId}.`;
|
|
61956
61995
|
return { stateUpdate: null, consumedGas: 0n };
|
|
61957
61996
|
}
|
|
61958
|
-
accumulate_logger.log
|
|
61997
|
+
accumulate_logger.log `Accumulation successful for ${serviceId}. Consumed: ${result.ok.consumedGas}`;
|
|
61959
61998
|
return result.ok;
|
|
61960
61999
|
}
|
|
61961
62000
|
/**
|
|
@@ -62017,7 +62056,7 @@ class Accumulate {
|
|
|
62017
62056
|
if (Compatibility.is(GpVersion.V0_7_0) && serviceId === currentManager) {
|
|
62018
62057
|
const newV = currentState.privilegedServices?.validatorsManager;
|
|
62019
62058
|
if (currentState.privilegedServices !== null && newV !== undefined && serviceIds.includes(newV)) {
|
|
62020
|
-
accumulate_logger.info
|
|
62059
|
+
accumulate_logger.info `Entering completely incorrect code that probably reverts validatorsManager change. This is valid in 0.7.0 only and incorrect in 0.7.1+`;
|
|
62021
62060
|
// Since serviceIds already contains newV, this service gets accumulated twice.
|
|
62022
62061
|
// To avoid double-counting, we skip stats and gas cost tracking here.
|
|
62023
62062
|
// We need this accumulation to get the correct `validatorsManager`
|
|
@@ -62200,13 +62239,13 @@ class DeferredTransfers {
|
|
|
62200
62239
|
const isCodeCorrect = code !== null && code.length <= W_C;
|
|
62201
62240
|
if (!hasTransfers || !isCodeCorrect) {
|
|
62202
62241
|
if (code === null) {
|
|
62203
|
-
deferred_transfers_logger.trace
|
|
62242
|
+
deferred_transfers_logger.trace `Skipping ON_TRANSFER execution for service ${serviceId} because code is null`;
|
|
62204
62243
|
}
|
|
62205
62244
|
else if (!hasTransfers) {
|
|
62206
|
-
deferred_transfers_logger.trace
|
|
62245
|
+
deferred_transfers_logger.trace `Skipping ON_TRANSFER execution for service ${serviceId} because there are no transfers`;
|
|
62207
62246
|
}
|
|
62208
62247
|
else {
|
|
62209
|
-
deferred_transfers_logger.trace
|
|
62248
|
+
deferred_transfers_logger.trace `Skipping ON_TRANSFER execution for service ${serviceId} because code is too long`;
|
|
62210
62249
|
}
|
|
62211
62250
|
}
|
|
62212
62251
|
else {
|
|
@@ -62834,7 +62873,7 @@ function verifyRefineContexts(minLookupSlot, contexts, recentBlocksPartialUpdate
|
|
|
62834
62873
|
headerChain.isAncestor(context.lookupAnchorSlot, context.lookupAnchor, context.anchor);
|
|
62835
62874
|
if (!isInChain) {
|
|
62836
62875
|
if (process.env.SKIP_LOOKUP_ANCHOR_CHECK !== undefined) {
|
|
62837
|
-
verify_contextual_logger.warn
|
|
62876
|
+
verify_contextual_logger.warn `Lookup anchor check for ${context.lookupAnchor} would fail, but override is active.`;
|
|
62838
62877
|
}
|
|
62839
62878
|
else {
|
|
62840
62879
|
return result_Result.error(ReportsError.SegmentRootLookupInvalid, `Lookup anchor is not found in chain. Hash: ${context.lookupAnchor} (slot: ${context.lookupAnchorSlot})`);
|
|
@@ -63721,7 +63760,7 @@ class OnChain {
|
|
|
63721
63760
|
reports: availableReports,
|
|
63722
63761
|
entropy: entropy[0],
|
|
63723
63762
|
});
|
|
63724
|
-
chain_stf_logger.log
|
|
63763
|
+
chain_stf_logger.log `${timerAccumulate()}`;
|
|
63725
63764
|
if (accumulateResult.isError) {
|
|
63726
63765
|
return stfError(StfErrorKind.Accumulate, accumulateResult);
|
|
63727
63766
|
}
|
|
@@ -63852,7 +63891,7 @@ class Importer {
|
|
|
63852
63891
|
this.stf = new OnChain(spec, state, blocks, hasher);
|
|
63853
63892
|
this.state = state;
|
|
63854
63893
|
this.currentHash = currentBestHeaderHash;
|
|
63855
|
-
logger.info
|
|
63894
|
+
logger.info `😎 Best time slot: ${state.timeslot} (header hash: ${currentBestHeaderHash})`;
|
|
63856
63895
|
}
|
|
63857
63896
|
async importBlock(block, omitSealVerification) {
|
|
63858
63897
|
const timer = measure("importBlock");
|
|
@@ -63860,20 +63899,20 @@ class Importer {
|
|
|
63860
63899
|
const maybeBestHeader = await this.importBlockInternal(block, omitSealVerification);
|
|
63861
63900
|
if (maybeBestHeader.isOk) {
|
|
63862
63901
|
const bestHeader = maybeBestHeader.ok;
|
|
63863
|
-
this.logger.info
|
|
63864
|
-
this.logger.log
|
|
63902
|
+
this.logger.info `🧊 Best block: #${timeSlot} (${bestHeader.hash})`;
|
|
63903
|
+
this.logger.log `${timer()}`;
|
|
63865
63904
|
return maybeBestHeader;
|
|
63866
63905
|
}
|
|
63867
|
-
this.logger.log
|
|
63868
|
-
this.logger.log
|
|
63906
|
+
this.logger.log `❌ Rejected block #${timeSlot}: ${resultToString(maybeBestHeader)}`;
|
|
63907
|
+
this.logger.log `${timer()}`;
|
|
63869
63908
|
return maybeBestHeader;
|
|
63870
63909
|
}
|
|
63871
63910
|
async importBlockInternal(block, omitSealVerification = false) {
|
|
63872
63911
|
const logger = this.logger;
|
|
63873
|
-
logger.log
|
|
63912
|
+
logger.log `🧱 Attempting to import a new block`;
|
|
63874
63913
|
const timerVerify = measure("import:verify");
|
|
63875
63914
|
const hash = await this.verifier.verifyBlock(block);
|
|
63876
|
-
logger.log
|
|
63915
|
+
logger.log `${timerVerify()}`;
|
|
63877
63916
|
if (hash.isError) {
|
|
63878
63917
|
return importerError(ImporterErrorKind.Verifier, hash);
|
|
63879
63918
|
}
|
|
@@ -63893,10 +63932,10 @@ class Importer {
|
|
|
63893
63932
|
}
|
|
63894
63933
|
const timeSlot = block.header.view().timeSlotIndex.materialize();
|
|
63895
63934
|
const headerHash = hash.ok;
|
|
63896
|
-
logger.log
|
|
63935
|
+
logger.log `🧱 Verified block: Got hash ${headerHash} for block at slot ${timeSlot}.`;
|
|
63897
63936
|
const timerStf = measure("import:stf");
|
|
63898
63937
|
const res = await this.stf.transition(block, headerHash, omitSealVerification);
|
|
63899
|
-
logger.log
|
|
63938
|
+
logger.log `${timerStf()}`;
|
|
63900
63939
|
if (res.isError) {
|
|
63901
63940
|
return importerError(ImporterErrorKind.Stf, res);
|
|
63902
63941
|
}
|
|
@@ -63905,7 +63944,7 @@ class Importer {
|
|
|
63905
63944
|
const timerState = measure("import:state");
|
|
63906
63945
|
const updateResult = await this.states.updateAndSetState(headerHash, this.state, update);
|
|
63907
63946
|
if (updateResult.isError) {
|
|
63908
|
-
logger.error
|
|
63947
|
+
logger.error `🧱 Unable to update state: ${resultToString(updateResult)}`;
|
|
63909
63948
|
return importerError(ImporterErrorKind.Update, updateResult);
|
|
63910
63949
|
}
|
|
63911
63950
|
const newState = this.states.getState(headerHash);
|
|
@@ -63916,17 +63955,17 @@ class Importer {
|
|
|
63916
63955
|
// the state of a parent block to support forks and create a fresh STF.
|
|
63917
63956
|
this.state.updateBackend(newState.backend);
|
|
63918
63957
|
this.currentHash = headerHash;
|
|
63919
|
-
logger.log
|
|
63958
|
+
logger.log `${timerState()}`;
|
|
63920
63959
|
// insert new state and the block to DB.
|
|
63921
63960
|
const timerDb = measure("import:db");
|
|
63922
63961
|
const writeBlocks = this.blocks.insertBlock(new WithHash(headerHash, block));
|
|
63923
63962
|
// Computation of the state root may happen asynchronously,
|
|
63924
63963
|
// but we still need to wait for it before next block can be imported
|
|
63925
63964
|
const stateRoot = await this.states.getStateRoot(newState);
|
|
63926
|
-
logger.log
|
|
63965
|
+
logger.log `🧱 Storing post-state-root for ${headerHash}: ${stateRoot}.`;
|
|
63927
63966
|
const writeStateRoot = this.blocks.setPostStateRoot(headerHash, stateRoot);
|
|
63928
63967
|
await Promise.all([writeBlocks, writeStateRoot]);
|
|
63929
|
-
logger.log
|
|
63968
|
+
logger.log `${timerDb()}`;
|
|
63930
63969
|
// finally update the best block
|
|
63931
63970
|
await this.blocks.setBestHeaderHash(headerHash);
|
|
63932
63971
|
return result_Result.ok(new WithHash(headerHash, block.header.view()));
|
|
@@ -63974,7 +64013,7 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
|
|
|
63974
64013
|
Logger.configureAll(process.env.JAM_LOG ?? "", Level.LOG);
|
|
63975
64014
|
const machine = importerStateMachine();
|
|
63976
64015
|
const channel = MessageChannelStateMachine.receiveChannel(machine, external_node_worker_threads_namespaceObject.parentPort);
|
|
63977
|
-
channel.then((channel) => importer_main(channel)).catch((e) => importer_logger.error
|
|
64016
|
+
channel.then((channel) => importer_main(channel)).catch((e) => importer_logger.error `${e}`);
|
|
63978
64017
|
}
|
|
63979
64018
|
const keccakHasher = KeccakHasher.create();
|
|
63980
64019
|
async function createImporter(config) {
|
|
@@ -63996,7 +64035,7 @@ async function createImporter(config) {
|
|
|
63996
64035
|
*/
|
|
63997
64036
|
async function importer_main(channel) {
|
|
63998
64037
|
const wasmPromise = initAll();
|
|
63999
|
-
importer_logger.info
|
|
64038
|
+
importer_logger.info `📥 Importer starting ${channel.currentState()}`;
|
|
64000
64039
|
// Await the configuration object
|
|
64001
64040
|
const ready = await channel.waitForState("ready(importer)");
|
|
64002
64041
|
let closeDb = async () => { };
|
|
@@ -64008,7 +64047,7 @@ async function importer_main(channel) {
|
|
|
64008
64047
|
};
|
|
64009
64048
|
// TODO [ToDr] this is shit, since we have circular dependency.
|
|
64010
64049
|
worker.setImporter(importer);
|
|
64011
|
-
importer_logger.info
|
|
64050
|
+
importer_logger.info `📥 Importer waiting for blocks.`;
|
|
64012
64051
|
worker.onBlock.on(async (block) => {
|
|
64013
64052
|
const res = await importer.importBlock(block, config.omitSealVerification);
|
|
64014
64053
|
if (res.isOk) {
|
|
@@ -64017,7 +64056,7 @@ async function importer_main(channel) {
|
|
|
64017
64056
|
});
|
|
64018
64057
|
await wasmPromise;
|
|
64019
64058
|
});
|
|
64020
|
-
importer_logger.info
|
|
64059
|
+
importer_logger.info `📥 Importer finished. Closing channel.`;
|
|
64021
64060
|
// close the database
|
|
64022
64061
|
await closeDb();
|
|
64023
64062
|
// Close the comms to gracefuly close the app.
|
|
@@ -64038,8 +64077,8 @@ async function importer_main(channel) {
|
|
|
64038
64077
|
const zeroHash = bytes_Bytes.zero(hash_HASH_SIZE).asOpaque();
|
|
64039
64078
|
async function mainImporter(config, withRelPath) {
|
|
64040
64079
|
await initAll();
|
|
64041
|
-
common_logger.info
|
|
64042
|
-
common_logger.info
|
|
64080
|
+
common_logger.info `🫐 Typeberry ${package_namespaceObject.rE}. GP: ${CURRENT_VERSION} (${CURRENT_SUITE})`;
|
|
64081
|
+
common_logger.info `🎸 Starting importer: ${config.nodeName}.`;
|
|
64043
64082
|
const chainSpec = getChainSpec(config.node.flavor);
|
|
64044
64083
|
const { rootDb, dbPath, genesisHeaderHash } = openDatabase(config.nodeName, config.node.chainSpec.genesisHeader, withRelPath(config.node.databaseBasePath));
|
|
64045
64084
|
// Initialize the database with genesis state and block if there isn't one.
|
|
@@ -64066,9 +64105,9 @@ async function mainImporter(config, withRelPath) {
|
|
|
64066
64105
|
return importer.getBestStateRootHash() ?? zeroHash;
|
|
64067
64106
|
},
|
|
64068
64107
|
async close() {
|
|
64069
|
-
common_logger.log
|
|
64108
|
+
common_logger.log `[main] 🛢️ Closing the database`;
|
|
64070
64109
|
await lmdb.close();
|
|
64071
|
-
common_logger.info
|
|
64110
|
+
common_logger.info `[main] ✅ Done.`;
|
|
64072
64111
|
},
|
|
64073
64112
|
};
|
|
64074
64113
|
return api;
|
|
@@ -64095,7 +64134,7 @@ function getFuzzDetails() {
|
|
|
64095
64134
|
};
|
|
64096
64135
|
}
|
|
64097
64136
|
async function mainFuzz(fuzzConfig, withRelPath) {
|
|
64098
|
-
main_fuzz_logger.info
|
|
64137
|
+
main_fuzz_logger.info `💨 Fuzzer V${fuzzConfig.version} starting up.`;
|
|
64099
64138
|
const { jamNodeConfig: config } = fuzzConfig;
|
|
64100
64139
|
let runningNode = null;
|
|
64101
64140
|
const fuzzSeed = BigInt(Date.now());
|
|
@@ -64165,20 +64204,20 @@ async function mainFuzz(fuzzConfig, withRelPath) {
|
|
|
64165
64204
|
|
|
64166
64205
|
const importBlocks = async (node, blocksToImport) => {
|
|
64167
64206
|
const logger = Logger.new(import.meta.filename, "jam");
|
|
64168
|
-
logger.info
|
|
64207
|
+
logger.info `📖 Reading ${blocksToImport.length} blocks`;
|
|
64169
64208
|
const reader = startBlocksReader({
|
|
64170
64209
|
files: blocksToImport,
|
|
64171
64210
|
chainSpec: node.chainSpec,
|
|
64172
64211
|
});
|
|
64173
64212
|
for (const block of reader) {
|
|
64174
|
-
logger.log
|
|
64213
|
+
logger.log `📖 Importing block: #${block.header.view().timeSlotIndex.materialize()}`;
|
|
64175
64214
|
const res = await node.importBlock(block);
|
|
64176
64215
|
if (res.isError) {
|
|
64177
|
-
logger.error
|
|
64216
|
+
logger.error `📖 ${resultToString(res)}`;
|
|
64178
64217
|
}
|
|
64179
64218
|
}
|
|
64180
64219
|
// close the importer.
|
|
64181
|
-
logger.info
|
|
64220
|
+
logger.info `All blocks scheduled to be imported.`;
|
|
64182
64221
|
return await node.close();
|
|
64183
64222
|
};
|
|
64184
64223
|
function* startBlocksReader(options) {
|
|
@@ -64375,6 +64414,7 @@ function parseFuzzVersion(v) {
|
|
|
64375
64414
|
|
|
64376
64415
|
|
|
64377
64416
|
|
|
64417
|
+
|
|
64378
64418
|
const prepareConfigFile = (args) => {
|
|
64379
64419
|
const nodeConfig = loadConfig(args.args.configPath);
|
|
64380
64420
|
const nodeName = args.command === Command.Dev ? `${args.args.nodeName}-${args.args.index}` : args.args.nodeName;
|
|
@@ -64401,14 +64441,8 @@ const prepareConfigFile = (args) => {
|
|
|
64401
64441
|
};
|
|
64402
64442
|
if (import.meta.url === (0,external_node_url_namespaceObject.pathToFileURL)(process.argv[1]).href) {
|
|
64403
64443
|
Logger.configureAll(process.env.JAM_LOG ?? "", Level.LOG);
|
|
64404
|
-
const relPath = `${import.meta.dirname}/../..`;
|
|
64405
|
-
const withRelPath = (p) => {
|
|
64406
|
-
if (p.startsWith("/")) {
|
|
64407
|
-
return p;
|
|
64408
|
-
}
|
|
64409
|
-
return `${relPath}/${p}`;
|
|
64410
|
-
};
|
|
64411
64444
|
let args;
|
|
64445
|
+
const withRelPath = workspacePathFix(`${import.meta.dirname}/../..`);
|
|
64412
64446
|
try {
|
|
64413
64447
|
const parsed = parseArgs(process.argv.slice(2), withRelPath);
|
|
64414
64448
|
if (parsed === null) {
|