@typeberry/jam 0.1.1-4a6ffa9 → 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 +103 -94
- package/block-generator/index.js.map +1 -1
- package/importer/index.js +185 -176
- package/importer/index.js.map +1 -1
- package/index.js +342 -333
- package/index.js.map +1 -1
- package/jam-network/index.js +169 -162
- package/jam-network/index.js.map +1 -1
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -35178,6 +35178,23 @@ function parseLevel(lvl) {
|
|
|
35178
35178
|
;// CONCATENATED MODULE: ./packages/core/logger/console.ts
|
|
35179
35179
|
// biome-ignore-all lint/suspicious/noConsole: logger
|
|
35180
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
|
+
}
|
|
35181
35198
|
/** An optimized logger that ignores `TRACE`, `DEBUG` and `LOG` messages.
|
|
35182
35199
|
*
|
|
35183
35200
|
* Use the `create` method to instantiate the right instance of a more specialized logger.
|
|
@@ -35208,109 +35225,91 @@ class ConsoleTransport {
|
|
|
35208
35225
|
constructor(options) {
|
|
35209
35226
|
this.options = options;
|
|
35210
35227
|
}
|
|
35211
|
-
insane(
|
|
35228
|
+
insane(_levelAndName, _strings, _data) {
|
|
35212
35229
|
/* no-op */
|
|
35213
35230
|
}
|
|
35214
|
-
trace(
|
|
35231
|
+
trace(_levelAndName, _strings, _data) {
|
|
35215
35232
|
/* no-op */
|
|
35216
35233
|
}
|
|
35217
|
-
log(
|
|
35234
|
+
log(_levelAndName, _strings, _data) {
|
|
35218
35235
|
/* no-op */
|
|
35219
35236
|
}
|
|
35220
|
-
info(
|
|
35237
|
+
info(_levelAndName, _strings, _data) {
|
|
35221
35238
|
/* no-op */
|
|
35222
35239
|
}
|
|
35223
|
-
warn(
|
|
35224
|
-
|
|
35240
|
+
warn(levelAndName, strings, data) {
|
|
35241
|
+
print(Level.WARN, levelAndName, strings, data);
|
|
35225
35242
|
}
|
|
35226
|
-
error(
|
|
35227
|
-
|
|
35228
|
-
}
|
|
35229
|
-
push(level, moduleName, val) {
|
|
35230
|
-
const shortModule = moduleName.replace(this.options.workingDir, "");
|
|
35231
|
-
const configuredLevel = findLevel(this.options, moduleName);
|
|
35232
|
-
const lvlText = Level[level].padEnd(5);
|
|
35233
|
-
if (level < configuredLevel) {
|
|
35234
|
-
return;
|
|
35235
|
-
}
|
|
35236
|
-
const msg = `${lvlText} [${shortModule}] ${val}`;
|
|
35237
|
-
if (level === Level.WARN) {
|
|
35238
|
-
console.warn(msg);
|
|
35239
|
-
}
|
|
35240
|
-
else if (level === Level.ERROR) {
|
|
35241
|
-
console.error(msg);
|
|
35242
|
-
}
|
|
35243
|
-
else {
|
|
35244
|
-
console.info(msg);
|
|
35245
|
-
}
|
|
35243
|
+
error(levelAndName, strings, data) {
|
|
35244
|
+
print(Level.ERROR, levelAndName, strings, data);
|
|
35246
35245
|
}
|
|
35247
35246
|
}
|
|
35248
35247
|
/**
|
|
35249
35248
|
* Insane version of console logger - supports insane level.
|
|
35250
35249
|
*/
|
|
35251
35250
|
class InsaneConsoleLogger extends ConsoleTransport {
|
|
35252
|
-
insane(
|
|
35253
|
-
|
|
35251
|
+
insane(levelAndName, strings, data) {
|
|
35252
|
+
print(Level.INSANE, levelAndName, strings, data);
|
|
35254
35253
|
}
|
|
35255
|
-
trace(
|
|
35256
|
-
|
|
35254
|
+
trace(levelAndName, strings, data) {
|
|
35255
|
+
print(Level.TRACE, levelAndName, strings, data);
|
|
35257
35256
|
}
|
|
35258
|
-
log(
|
|
35259
|
-
|
|
35257
|
+
log(levelAndName, strings, data) {
|
|
35258
|
+
print(Level.LOG, levelAndName, strings, data);
|
|
35260
35259
|
}
|
|
35261
|
-
info(
|
|
35262
|
-
|
|
35260
|
+
info(levelAndName, strings, data) {
|
|
35261
|
+
print(Level.INFO, levelAndName, strings, data);
|
|
35263
35262
|
}
|
|
35264
35263
|
}
|
|
35265
35264
|
/**
|
|
35266
35265
|
* A basic version of console logger - printing everything.
|
|
35267
35266
|
*/
|
|
35268
35267
|
class TraceConsoleTransport extends ConsoleTransport {
|
|
35269
|
-
insane(
|
|
35268
|
+
insane(_levelAndName, _strings, _data) {
|
|
35270
35269
|
/* no-op */
|
|
35271
35270
|
}
|
|
35272
|
-
trace(
|
|
35273
|
-
|
|
35271
|
+
trace(levelAndName, strings, data) {
|
|
35272
|
+
print(Level.TRACE, levelAndName, strings, data);
|
|
35274
35273
|
}
|
|
35275
|
-
log(
|
|
35276
|
-
|
|
35274
|
+
log(levelAndName, strings, data) {
|
|
35275
|
+
print(Level.LOG, levelAndName, strings, data);
|
|
35277
35276
|
}
|
|
35278
|
-
info(
|
|
35279
|
-
|
|
35277
|
+
info(levelAndName, strings, data) {
|
|
35278
|
+
print(Level.INFO, levelAndName, strings, data);
|
|
35280
35279
|
}
|
|
35281
35280
|
}
|
|
35282
35281
|
/**
|
|
35283
35282
|
* An optimized version of the logger - completely ignores `TRACE` level calls.
|
|
35284
35283
|
*/
|
|
35285
35284
|
class LogConsoleTransport extends ConsoleTransport {
|
|
35286
|
-
insane(
|
|
35285
|
+
insane(_levelAndName, _strings, _data) {
|
|
35287
35286
|
/* no-op */
|
|
35288
35287
|
}
|
|
35289
|
-
trace(
|
|
35288
|
+
trace(_levelAndName, _strings, _data) {
|
|
35290
35289
|
/* no-op */
|
|
35291
35290
|
}
|
|
35292
|
-
log(
|
|
35293
|
-
|
|
35291
|
+
log(levelAndName, strings, data) {
|
|
35292
|
+
print(Level.LOG, levelAndName, strings, data);
|
|
35294
35293
|
}
|
|
35295
|
-
info(
|
|
35296
|
-
|
|
35294
|
+
info(levelAndName, strings, data) {
|
|
35295
|
+
print(Level.INFO, levelAndName, strings, data);
|
|
35297
35296
|
}
|
|
35298
35297
|
}
|
|
35299
35298
|
/**
|
|
35300
35299
|
* An optimized version of the logger - completely ignores `TRACE` & `DEBUG` level calls.
|
|
35301
35300
|
*/
|
|
35302
35301
|
class InfoConsoleTransport extends ConsoleTransport {
|
|
35303
|
-
insane(
|
|
35302
|
+
insane(_levelAndName, _strings, _data) {
|
|
35304
35303
|
/* no-op */
|
|
35305
35304
|
}
|
|
35306
|
-
trace(
|
|
35305
|
+
trace(_levelAndName, _strings, _data) {
|
|
35307
35306
|
/* no-op */
|
|
35308
35307
|
}
|
|
35309
|
-
log(
|
|
35308
|
+
log(_levelAndName, _strings, _data) {
|
|
35310
35309
|
/* no-op */
|
|
35311
35310
|
}
|
|
35312
|
-
info(
|
|
35313
|
-
|
|
35311
|
+
info(levelAndName, strings, data) {
|
|
35312
|
+
print(Level.INFO, levelAndName, strings, data);
|
|
35314
35313
|
}
|
|
35315
35314
|
}
|
|
35316
35315
|
|
|
@@ -35347,11 +35346,6 @@ class Logger {
|
|
|
35347
35346
|
const module = moduleName ?? fName;
|
|
35348
35347
|
return new Logger(module.padStart(8, " "), GLOBAL_CONFIG);
|
|
35349
35348
|
}
|
|
35350
|
-
/**
|
|
35351
|
-
* Return currently configured level for given module. */
|
|
35352
|
-
static getLevel(moduleName) {
|
|
35353
|
-
return findLevel(GLOBAL_CONFIG.options, moduleName);
|
|
35354
|
-
}
|
|
35355
35349
|
/**
|
|
35356
35350
|
* Global configuration of all loggers.
|
|
35357
35351
|
*
|
|
@@ -35382,33 +35376,46 @@ class Logger {
|
|
|
35382
35376
|
const options = parseLoggerOptions(input, defaultLevel, workingDir);
|
|
35383
35377
|
Logger.configureAllFromOptions(options);
|
|
35384
35378
|
}
|
|
35379
|
+
cachedLevelAndName;
|
|
35385
35380
|
constructor(moduleName, config) {
|
|
35386
35381
|
this.moduleName = moduleName;
|
|
35387
35382
|
this.config = config;
|
|
35388
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
|
+
}
|
|
35389
35396
|
/** Log a message with `INSANE` level. */
|
|
35390
|
-
insane(
|
|
35391
|
-
this.config.transport.insane(this.
|
|
35397
|
+
insane(strings, ...data) {
|
|
35398
|
+
this.config.transport.insane(this.getLevelAndName(), strings, data);
|
|
35392
35399
|
}
|
|
35393
35400
|
/** Log a message with `TRACE` level. */
|
|
35394
|
-
trace(
|
|
35395
|
-
this.config.transport.trace(this.
|
|
35401
|
+
trace(strings, ...data) {
|
|
35402
|
+
this.config.transport.trace(this.getLevelAndName(), strings, data);
|
|
35396
35403
|
}
|
|
35397
35404
|
/** Log a message with `DEBUG`/`LOG` level. */
|
|
35398
|
-
log(
|
|
35399
|
-
this.config.transport.log(this.
|
|
35405
|
+
log(strings, ...data) {
|
|
35406
|
+
this.config.transport.log(this.getLevelAndName(), strings, data);
|
|
35400
35407
|
}
|
|
35401
35408
|
/** Log a message with `INFO` level. */
|
|
35402
|
-
info(
|
|
35403
|
-
this.config.transport.info(this.
|
|
35409
|
+
info(strings, ...data) {
|
|
35410
|
+
this.config.transport.info(this.getLevelAndName(), strings, data);
|
|
35404
35411
|
}
|
|
35405
35412
|
/** Log a message with `WARN` level. */
|
|
35406
|
-
warn(
|
|
35407
|
-
this.config.transport.warn(this.
|
|
35413
|
+
warn(strings, ...data) {
|
|
35414
|
+
this.config.transport.warn(this.getLevelAndName(), strings, data);
|
|
35408
35415
|
}
|
|
35409
35416
|
/** Log a message with `ERROR` level. */
|
|
35410
|
-
error(
|
|
35411
|
-
this.config.transport.error(this.
|
|
35417
|
+
error(strings, ...data) {
|
|
35418
|
+
this.config.transport.error(this.getLevelAndName(), strings, data);
|
|
35412
35419
|
}
|
|
35413
35420
|
}
|
|
35414
35421
|
|
|
@@ -35498,15 +35505,15 @@ class NodeConfiguration {
|
|
|
35498
35505
|
}
|
|
35499
35506
|
function loadConfig(configPath) {
|
|
35500
35507
|
if (configPath === DEFAULT_CONFIG) {
|
|
35501
|
-
logger.log
|
|
35508
|
+
logger.log `🔧 Loading DEFAULT config`;
|
|
35502
35509
|
return parseFromJson(configs.default, NodeConfiguration.fromJson);
|
|
35503
35510
|
}
|
|
35504
35511
|
if (configPath === DEV_CONFIG) {
|
|
35505
|
-
logger.log
|
|
35512
|
+
logger.log `🔧 Loading DEV config`;
|
|
35506
35513
|
return parseFromJson(configs.dev, NodeConfiguration.fromJson);
|
|
35507
35514
|
}
|
|
35508
35515
|
try {
|
|
35509
|
-
logger.log
|
|
35516
|
+
logger.log `🔧 Loading config from ${configPath}`;
|
|
35510
35517
|
const configFile = external_node_fs_default().readFileSync(configPath, "utf8");
|
|
35511
35518
|
const parsed = JSON.parse(configFile);
|
|
35512
35519
|
return parseFromJson(parsed, NodeConfiguration.fromJson);
|
|
@@ -39212,7 +39219,7 @@ class LmdbStates {
|
|
|
39212
39219
|
await Promise.all([valuesWrite, statesWrite]);
|
|
39213
39220
|
}
|
|
39214
39221
|
catch (e) {
|
|
39215
|
-
states_logger.error
|
|
39222
|
+
states_logger.error `${e}`;
|
|
39216
39223
|
return result_Result.error(StateUpdateError.Commit);
|
|
39217
39224
|
}
|
|
39218
39225
|
return result_Result.ok(result_OK);
|
|
@@ -39281,7 +39288,7 @@ function openDatabase(nodeName, genesisHeader, databaseBasePath, { readOnly = fa
|
|
|
39281
39288
|
const genesisHeaderHash = hashBytes(genesisHeader).asOpaque();
|
|
39282
39289
|
const genesisHeaderHashNibbles = genesisHeaderHash.toString().substring(2, 10);
|
|
39283
39290
|
const dbPath = `${databaseBasePath}/${nodeNameHash}/${genesisHeaderHashNibbles}`;
|
|
39284
|
-
common_logger.info
|
|
39291
|
+
common_logger.info `🛢️ Opening database at ${dbPath}`;
|
|
39285
39292
|
try {
|
|
39286
39293
|
return {
|
|
39287
39294
|
dbPath,
|
|
@@ -39303,21 +39310,21 @@ async function initializeDatabase(spec, genesisHeaderHash, rootDb, config, ances
|
|
|
39303
39310
|
const states = new LmdbStates(spec, rootDb);
|
|
39304
39311
|
const header = blocks.getBestHeaderHash();
|
|
39305
39312
|
const state = blocks.getPostStateRoot(header);
|
|
39306
|
-
common_logger.log
|
|
39307
|
-
common_logger.log
|
|
39313
|
+
common_logger.log `🛢️ Best header hash: ${header}`;
|
|
39314
|
+
common_logger.log `🛢️ Best state root: ${state}`;
|
|
39308
39315
|
// DB seems already initialized, just go with what we have.
|
|
39309
39316
|
const isDbInitialized = state !== null && !state.isEqualTo(bytes_Bytes.zero(hash_HASH_SIZE)) && !header.isEqualTo(bytes_Bytes.zero(hash_HASH_SIZE));
|
|
39310
39317
|
if (isDbInitialized) {
|
|
39311
39318
|
await rootDb.db.close();
|
|
39312
39319
|
return;
|
|
39313
39320
|
}
|
|
39314
|
-
common_logger.log
|
|
39321
|
+
common_logger.log `🛢️ Database looks fresh. Initializing.`;
|
|
39315
39322
|
// looks like a fresh db, initialize the state.
|
|
39316
39323
|
const genesisHeader = decoder_Decoder.decodeObject(Header.Codec, config.genesisHeader, spec);
|
|
39317
39324
|
const genesisExtrinsic = emptyBlock().extrinsic;
|
|
39318
39325
|
const genesisBlock = Block.create({ header: genesisHeader, extrinsic: genesisExtrinsic });
|
|
39319
39326
|
const blockView = blockAsView(genesisBlock, spec);
|
|
39320
|
-
common_logger.log
|
|
39327
|
+
common_logger.log `🧬 Writing genesis block #${genesisHeader.timeSlotIndex}: ${genesisHeaderHash}`;
|
|
39321
39328
|
const { genesisStateSerialized, genesisStateRootHash } = loadGenesisState(spec, config.genesisState);
|
|
39322
39329
|
// write to db
|
|
39323
39330
|
await blocks.insertBlock(new WithHash(genesisHeaderHash, blockView));
|
|
@@ -39335,7 +39342,7 @@ function loadGenesisState(spec, data) {
|
|
|
39335
39342
|
const stateEntries = state_entries_StateEntries.fromEntriesUnsafe(data.entries());
|
|
39336
39343
|
const state = serialized_state_SerializedState.fromStateEntries(spec, stateEntries);
|
|
39337
39344
|
const genesisStateRootHash = stateEntries.getRootHash();
|
|
39338
|
-
common_logger.info
|
|
39345
|
+
common_logger.info `🧬 Genesis state root: ${genesisStateRootHash}`;
|
|
39339
39346
|
return {
|
|
39340
39347
|
genesisState: state,
|
|
39341
39348
|
genesisStateSerialized: stateEntries,
|
|
@@ -39474,7 +39481,7 @@ class TypedPort {
|
|
|
39474
39481
|
this.dispatchPortMessage(msg);
|
|
39475
39482
|
}
|
|
39476
39483
|
catch (e) {
|
|
39477
|
-
port_logger.error
|
|
39484
|
+
port_logger.error `[${this.constructor.name}] Failed to dispatch a message: ${e}: ${msg}`;
|
|
39478
39485
|
throw e;
|
|
39479
39486
|
}
|
|
39480
39487
|
});
|
|
@@ -39548,7 +39555,7 @@ class TypedPort {
|
|
|
39548
39555
|
this.port.postMessage(msg, transferList);
|
|
39549
39556
|
}
|
|
39550
39557
|
catch (e) {
|
|
39551
|
-
port_logger.error
|
|
39558
|
+
port_logger.error `[${this.constructor.name}] Failed to post a message: ${e}: ${msg}`;
|
|
39552
39559
|
throw e;
|
|
39553
39560
|
}
|
|
39554
39561
|
}
|
|
@@ -39579,7 +39586,7 @@ class TypedPort {
|
|
|
39579
39586
|
cleanup(reason) {
|
|
39580
39587
|
// resolve all pending requests with an error.
|
|
39581
39588
|
const responseListeners = this.responseListeners.eventNames();
|
|
39582
|
-
for (const ev
|
|
39589
|
+
for (const ev of responseListeners) {
|
|
39583
39590
|
this.responseListeners.emit(ev, new Error(`port is ${reason}`));
|
|
39584
39591
|
}
|
|
39585
39592
|
}
|
|
@@ -39628,7 +39635,7 @@ class MessageChannelStateMachine {
|
|
|
39628
39635
|
this.dispatchSignal(name, data);
|
|
39629
39636
|
}
|
|
39630
39637
|
catch (e) {
|
|
39631
|
-
channel_logger.error
|
|
39638
|
+
channel_logger.error `[${this.constructor.name}] Unable to dispatch signal (${name}): ${e}. ${this.stateInfo(remoteState)}`;
|
|
39632
39639
|
throw e;
|
|
39633
39640
|
}
|
|
39634
39641
|
});
|
|
@@ -39637,7 +39644,7 @@ class MessageChannelStateMachine {
|
|
|
39637
39644
|
await this.dispatchRequest(name, data, msg);
|
|
39638
39645
|
}
|
|
39639
39646
|
catch (e) {
|
|
39640
|
-
channel_logger.error
|
|
39647
|
+
channel_logger.error `[${this.constructor.name}] Unable to dispatch request (${name}): ${e}. ${this.stateInfo(remoteState)}`;
|
|
39641
39648
|
throw e;
|
|
39642
39649
|
}
|
|
39643
39650
|
});
|
|
@@ -39723,7 +39730,7 @@ class MessageChannelStateMachine {
|
|
|
39723
39730
|
this.machine.transition(res.transitionTo.state, res.transitionTo.data);
|
|
39724
39731
|
}
|
|
39725
39732
|
if (didStateChangeInMeantime) {
|
|
39726
|
-
channel_logger.warn
|
|
39733
|
+
channel_logger.warn `Ignoring obsolete response for an old request: "${name}"`;
|
|
39727
39734
|
return;
|
|
39728
39735
|
}
|
|
39729
39736
|
return this.port.respond(prevState.stateName, msg, res.response);
|
|
@@ -39739,7 +39746,7 @@ class MessageChannelStateMachine {
|
|
|
39739
39746
|
}
|
|
39740
39747
|
}
|
|
39741
39748
|
transitionTo() {
|
|
39742
|
-
channel_logger.trace
|
|
39749
|
+
channel_logger.trace `[${this.machine.name}] transitioned to ${this.currentState()}`;
|
|
39743
39750
|
return this;
|
|
39744
39751
|
}
|
|
39745
39752
|
/**
|
|
@@ -39759,7 +39766,7 @@ class MessageChannelStateMachine {
|
|
|
39759
39766
|
await promise;
|
|
39760
39767
|
}
|
|
39761
39768
|
catch (e) {
|
|
39762
|
-
channel_logger.error
|
|
39769
|
+
channel_logger.error `${e}`;
|
|
39763
39770
|
}
|
|
39764
39771
|
return new MessageChannelStateMachine(machine, port);
|
|
39765
39772
|
}
|
|
@@ -39962,7 +39969,7 @@ class State {
|
|
|
39962
39969
|
* actions.
|
|
39963
39970
|
*/
|
|
39964
39971
|
onActivation(data) {
|
|
39965
|
-
state_logger.trace
|
|
39972
|
+
state_logger.trace `[${this.constructor.name}] Changing state to: ${this}`;
|
|
39966
39973
|
this.data = data;
|
|
39967
39974
|
}
|
|
39968
39975
|
/**
|
|
@@ -40060,7 +40067,7 @@ async function spawnWorkerGeneric(bootstrapPath, logger, mainReadyName, mainRead
|
|
|
40060
40067
|
const worker = new external_node_worker_threads_namespaceObject.Worker(bootstrapPath);
|
|
40061
40068
|
const machine = stateMachineMain(`main->${mainReadyName}`, mainReadyName, mainReadyState);
|
|
40062
40069
|
const channel = await MessageChannelStateMachine.createAndTransferChannel(machine, worker);
|
|
40063
|
-
logger.trace
|
|
40070
|
+
logger.trace `[${machine.name}] Worker spawned ${channel.currentState()}`;
|
|
40064
40071
|
return channel;
|
|
40065
40072
|
}
|
|
40066
40073
|
|
|
@@ -40173,7 +40180,7 @@ class MainReady extends State {
|
|
|
40173
40180
|
if (res instanceof Uint8Array) {
|
|
40174
40181
|
return bytes_Bytes.fromBlob(res, hash_HASH_SIZE).asOpaque();
|
|
40175
40182
|
}
|
|
40176
|
-
state_machine_logger.error
|
|
40183
|
+
state_machine_logger.error `Invalid response for getBestStateRootHash. Expected Uint8Array, got: ${res}`;
|
|
40177
40184
|
return bytes_Bytes.zero(hash_HASH_SIZE).asOpaque();
|
|
40178
40185
|
}
|
|
40179
40186
|
finish(channel) {
|
|
@@ -40221,7 +40228,7 @@ class ImporterReady extends State {
|
|
|
40221
40228
|
}
|
|
40222
40229
|
async getStateEntries(hash) {
|
|
40223
40230
|
if (this.importer === null) {
|
|
40224
|
-
state_machine_logger.error
|
|
40231
|
+
state_machine_logger.error `${this.constructor.name} importer not initialized yet!`;
|
|
40225
40232
|
await new Promise((resolve) => {
|
|
40226
40233
|
this.onImporter.once(resolve);
|
|
40227
40234
|
});
|
|
@@ -40235,7 +40242,7 @@ class ImporterReady extends State {
|
|
|
40235
40242
|
response: encoded.raw,
|
|
40236
40243
|
};
|
|
40237
40244
|
}
|
|
40238
|
-
state_machine_logger.error
|
|
40245
|
+
state_machine_logger.error `${this.constructor.name} got invalid request type: ${JSON.stringify(hash)}.`;
|
|
40239
40246
|
return {
|
|
40240
40247
|
response: null,
|
|
40241
40248
|
};
|
|
@@ -40255,7 +40262,7 @@ class ImporterReady extends State {
|
|
|
40255
40262
|
}
|
|
40256
40263
|
async importBlock(block) {
|
|
40257
40264
|
if (this.importer === null) {
|
|
40258
|
-
state_machine_logger.error
|
|
40265
|
+
state_machine_logger.error `${this.constructor.name} importer not initialized yet!`;
|
|
40259
40266
|
await new Promise((resolve) => {
|
|
40260
40267
|
this.onImporter.once(resolve);
|
|
40261
40268
|
});
|
|
@@ -40275,8 +40282,8 @@ class ImporterReady extends State {
|
|
|
40275
40282
|
}
|
|
40276
40283
|
}
|
|
40277
40284
|
catch (e) {
|
|
40278
|
-
state_machine_logger.error
|
|
40279
|
-
state_machine_logger.error
|
|
40285
|
+
state_machine_logger.error `Failed to import block: ${e}`;
|
|
40286
|
+
state_machine_logger.error `${e instanceof Error ? e.stack : ""}`;
|
|
40280
40287
|
response = result_Result.error(`${e}`);
|
|
40281
40288
|
}
|
|
40282
40289
|
const encoded = encoder_Encoder.encodeObject(importBlockResultCodec, response);
|
|
@@ -40284,7 +40291,7 @@ class ImporterReady extends State {
|
|
|
40284
40291
|
response: encoded.raw,
|
|
40285
40292
|
};
|
|
40286
40293
|
}
|
|
40287
|
-
state_machine_logger.error
|
|
40294
|
+
state_machine_logger.error `${this.constructor.name} got invalid request type: ${JSON.stringify(block)}.`;
|
|
40288
40295
|
return {
|
|
40289
40296
|
response: null,
|
|
40290
40297
|
};
|
|
@@ -40296,7 +40303,7 @@ class ImporterReady extends State {
|
|
|
40296
40303
|
this.onBlock.emit(blockView);
|
|
40297
40304
|
}
|
|
40298
40305
|
else {
|
|
40299
|
-
state_machine_logger.error
|
|
40306
|
+
state_machine_logger.error `${this.constructor.name} got invalid signal type: ${JSON.stringify(block)}.`;
|
|
40300
40307
|
}
|
|
40301
40308
|
}
|
|
40302
40309
|
async endWork() {
|
|
@@ -40395,7 +40402,7 @@ class state_machine_MainReady extends State {
|
|
|
40395
40402
|
this.onNewBlocks.emit(blocks);
|
|
40396
40403
|
}
|
|
40397
40404
|
else {
|
|
40398
|
-
jam_network_state_machine_logger.error
|
|
40405
|
+
jam_network_state_machine_logger.error `${this.constructor.name} got invalid signal type: ${JSON.stringify(block)}.`;
|
|
40399
40406
|
}
|
|
40400
40407
|
}
|
|
40401
40408
|
announceHeader(port, header) {
|
|
@@ -40433,7 +40440,7 @@ class NetworkReady extends State {
|
|
|
40433
40440
|
this.onNewHeader.emit(decoded);
|
|
40434
40441
|
}
|
|
40435
40442
|
else {
|
|
40436
|
-
jam_network_state_machine_logger.error
|
|
40443
|
+
jam_network_state_machine_logger.error `${this.constructor.name} got invalid signal type: ${JSON.stringify(header)}.`;
|
|
40437
40444
|
}
|
|
40438
40445
|
}
|
|
40439
40446
|
sendBlocks(port, blocks) {
|
|
@@ -42141,12 +42148,14 @@ class WriteablePage extends MemoryPage {
|
|
|
42141
42148
|
|
|
42142
42149
|
|
|
42143
42150
|
|
|
42151
|
+
|
|
42152
|
+
|
|
42144
42153
|
var AccessType;
|
|
42145
42154
|
(function (AccessType) {
|
|
42146
42155
|
AccessType[AccessType["READ"] = 0] = "READ";
|
|
42147
42156
|
AccessType[AccessType["WRITE"] = 1] = "WRITE";
|
|
42148
42157
|
})(AccessType || (AccessType = {}));
|
|
42149
|
-
|
|
42158
|
+
const memory_logger = Logger.new(import.meta.filename, "pvm:mem");
|
|
42150
42159
|
class Memory {
|
|
42151
42160
|
sbrkIndex;
|
|
42152
42161
|
virtualSbrkIndex;
|
|
@@ -42177,7 +42186,7 @@ class Memory {
|
|
|
42177
42186
|
if (bytes.length === 0) {
|
|
42178
42187
|
return result_Result.ok(result_OK);
|
|
42179
42188
|
}
|
|
42180
|
-
|
|
42189
|
+
memory_logger.insane `MEM[${address}] <- ${bytes_BytesBlob.blobFrom(bytes)}`;
|
|
42181
42190
|
const pagesResult = this.getPages(address, bytes.length, AccessType.WRITE);
|
|
42182
42191
|
if (pagesResult.isError) {
|
|
42183
42192
|
return result_Result.error(pagesResult.error);
|
|
@@ -42244,7 +42253,7 @@ class Memory {
|
|
|
42244
42253
|
currentPosition += bytesToRead;
|
|
42245
42254
|
bytesLeft -= bytesToRead;
|
|
42246
42255
|
}
|
|
42247
|
-
|
|
42256
|
+
memory_logger.insane `MEM[${startAddress}] => ${bytes_BytesBlob.blobFrom(result)}`;
|
|
42248
42257
|
return result_Result.ok(result_OK);
|
|
42249
42258
|
}
|
|
42250
42259
|
sbrk(length) {
|
|
@@ -44174,7 +44183,7 @@ class ProgramDecoder {
|
|
|
44174
44183
|
return result_Result.ok(new ProgramDecoder(program));
|
|
44175
44184
|
}
|
|
44176
44185
|
catch (e) {
|
|
44177
|
-
program_decoder_logger.error
|
|
44186
|
+
program_decoder_logger.error `Invalid program: ${e}`;
|
|
44178
44187
|
return result_Result.error(ProgramDecoderError.InvalidProgramError);
|
|
44179
44188
|
}
|
|
44180
44189
|
}
|
|
@@ -44340,7 +44349,7 @@ class Interpreter {
|
|
|
44340
44349
|
const argsType = instructionArgumentTypeMap[currentInstruction] ?? ArgumentType.NO_ARGUMENTS;
|
|
44341
44350
|
const argsResult = this.argsDecodingResults[argsType];
|
|
44342
44351
|
this.argsDecoder.fillArgs(this.pc, argsResult);
|
|
44343
|
-
interpreter_logger.insane
|
|
44352
|
+
interpreter_logger.insane `[PC: ${this.pc}] ${Instruction[currentInstruction]}`;
|
|
44344
44353
|
if (!isValidInstruction) {
|
|
44345
44354
|
this.instructionResult.status = pvm_interpreter_result_Result.PANIC;
|
|
44346
44355
|
}
|
|
@@ -44412,7 +44421,7 @@ class Interpreter {
|
|
|
44412
44421
|
this.status = status_Status.HOST;
|
|
44413
44422
|
break;
|
|
44414
44423
|
}
|
|
44415
|
-
interpreter_logger.insane
|
|
44424
|
+
interpreter_logger.insane `[PC: ${this.pc}] Status: ${pvm_interpreter_result_Result[this.instructionResult.status]}`;
|
|
44416
44425
|
return this.status;
|
|
44417
44426
|
}
|
|
44418
44427
|
this.pc = this.instructionResult.nextPc;
|
|
@@ -44659,7 +44668,7 @@ class host_calls_manager_HostCallsManager {
|
|
|
44659
44668
|
return `r${idx}=${value} (0x${value.toString(16)})`;
|
|
44660
44669
|
})
|
|
44661
44670
|
.join(", ");
|
|
44662
|
-
host_calls_manager_logger.insane
|
|
44671
|
+
host_calls_manager_logger.insane `[${currentServiceId}] ${context} ${name}${requested}. Gas: ${gas}. Regs: ${registerValues}.`;
|
|
44663
44672
|
}
|
|
44664
44673
|
}
|
|
44665
44674
|
class NoopMissing {
|
|
@@ -45267,7 +45276,7 @@ class block_generator_state_machine_MainReady extends State {
|
|
|
45267
45276
|
this.onBlock.emit(block);
|
|
45268
45277
|
}
|
|
45269
45278
|
else {
|
|
45270
|
-
block_generator_state_machine_logger.error
|
|
45279
|
+
block_generator_state_machine_logger.error `${this.constructor.name} got invalid signal type: ${JSON.stringify(block)}.`;
|
|
45271
45280
|
}
|
|
45272
45281
|
}
|
|
45273
45282
|
finish(channel) {
|
|
@@ -45322,12 +45331,12 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
|
|
|
45322
45331
|
channel
|
|
45323
45332
|
.then((channel) => main(channel))
|
|
45324
45333
|
.catch((e) => {
|
|
45325
|
-
block_generator_logger.error
|
|
45334
|
+
block_generator_logger.error `${e}`;
|
|
45326
45335
|
if (e.stack !== undefined) {
|
|
45327
|
-
block_generator_logger.error
|
|
45336
|
+
block_generator_logger.error `${e.stack}`;
|
|
45328
45337
|
}
|
|
45329
45338
|
if (e.cause !== undefined) {
|
|
45330
|
-
block_generator_logger.error
|
|
45339
|
+
block_generator_logger.error `${e.cause}`;
|
|
45331
45340
|
}
|
|
45332
45341
|
});
|
|
45333
45342
|
}
|
|
@@ -45335,7 +45344,7 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
|
|
|
45335
45344
|
* The `BlockGenerator` should periodically create new blocks and send them as signals to the main thread.
|
|
45336
45345
|
*/
|
|
45337
45346
|
async function main(channel) {
|
|
45338
|
-
block_generator_logger.info
|
|
45347
|
+
block_generator_logger.info `🎁 Block Generator running ${channel.currentState()}`;
|
|
45339
45348
|
// Await the configuration object
|
|
45340
45349
|
const ready = await channel.waitForState("ready(generator)");
|
|
45341
45350
|
const config = ready.currentState().getConfig();
|
|
@@ -45350,11 +45359,11 @@ async function main(channel) {
|
|
|
45350
45359
|
await (0,promises_namespaceObject.setTimeout)(config.chainSpec.slotDuration * 1000);
|
|
45351
45360
|
counter += 1;
|
|
45352
45361
|
const newBlock = await generator.nextEncodedBlock();
|
|
45353
|
-
block_generator_logger.trace
|
|
45362
|
+
block_generator_logger.trace `Sending block ${counter}`;
|
|
45354
45363
|
worker.sendBlock(port, newBlock);
|
|
45355
45364
|
}
|
|
45356
45365
|
});
|
|
45357
|
-
block_generator_logger.info
|
|
45366
|
+
block_generator_logger.info `Block Generator finished. Closing channel.`;
|
|
45358
45367
|
// Close the comms to gracefully close the app.
|
|
45359
45368
|
finished.currentState().close(channel);
|
|
45360
45369
|
}
|
|
@@ -45469,11 +45478,11 @@ class PeersManagement {
|
|
|
45469
45478
|
_onPeerDisconnected = [];
|
|
45470
45479
|
peers = new Map();
|
|
45471
45480
|
peerConnected(peer) {
|
|
45472
|
-
peers_logger.info
|
|
45481
|
+
peers_logger.info `💡 Peer ${displayId(peer)} connected.`;
|
|
45473
45482
|
const oldPeerData = this.peers.get(peer.id);
|
|
45474
45483
|
if (oldPeerData !== undefined) {
|
|
45475
45484
|
// TODO [ToDr] replacing old connection?
|
|
45476
|
-
peers_logger.warn
|
|
45485
|
+
peers_logger.warn `Replacing older connection.`;
|
|
45477
45486
|
}
|
|
45478
45487
|
this.peers.set(peer.id, peer);
|
|
45479
45488
|
for (const callback of this._onPeerConnected) {
|
|
@@ -45481,7 +45490,7 @@ class PeersManagement {
|
|
|
45481
45490
|
}
|
|
45482
45491
|
}
|
|
45483
45492
|
peerDisconnected(peer) {
|
|
45484
|
-
peers_logger.info
|
|
45493
|
+
peers_logger.info `⚡︎Peer ${displayId(peer)} disconnected.`;
|
|
45485
45494
|
this.peers.delete(peer.id);
|
|
45486
45495
|
for (const callback of this._onPeerDisconnected) {
|
|
45487
45496
|
callback(peer);
|
|
@@ -54273,23 +54282,23 @@ var VerifyCertError;
|
|
|
54273
54282
|
VerifyCertError[VerifyCertError["IncorrectSignature"] = 4] = "IncorrectSignature";
|
|
54274
54283
|
})(VerifyCertError || (VerifyCertError = {}));
|
|
54275
54284
|
async function verifyCertificate(certs) {
|
|
54276
|
-
certificate_logger.log
|
|
54285
|
+
certificate_logger.log `Incoming peer. Verifying certificate`;
|
|
54277
54286
|
// Must present exactly one cert
|
|
54278
54287
|
if (certs.length !== 1) {
|
|
54279
|
-
certificate_logger.log
|
|
54288
|
+
certificate_logger.log `Rejecting peer: expected exactly one certificate, got: ${certs.length}`;
|
|
54280
54289
|
return result_Result.error(VerifyCertError.NoCertificate);
|
|
54281
54290
|
}
|
|
54282
54291
|
// Parse with Node's X509Certificate (accepts PEM or DER)
|
|
54283
54292
|
const xc = new (external_node_crypto_default()).X509Certificate(certs[0]);
|
|
54284
54293
|
// Must be Ed25519 key
|
|
54285
54294
|
if (xc.publicKey.asymmetricKeyType !== CURVE_NAME.toLowerCase()) {
|
|
54286
|
-
certificate_logger.log
|
|
54295
|
+
certificate_logger.log `Rejecting peer using non-ed25519 certificate: ${xc.publicKey.asymmetricKeyType}`;
|
|
54287
54296
|
return result_Result.error(VerifyCertError.NotEd25519);
|
|
54288
54297
|
}
|
|
54289
54298
|
// Extract raw public key via JWK export
|
|
54290
54299
|
const jwk = xc.publicKey.export({ format: "jwk" });
|
|
54291
54300
|
if (jwk.kty !== KEY_TYPE || jwk.crv !== CURVE_NAME) {
|
|
54292
|
-
certificate_logger.log
|
|
54301
|
+
certificate_logger.log `Public key type mismatch: ${jwk.kty}, ${jwk.crv}`;
|
|
54293
54302
|
return result_Result.error(VerifyCertError.PublicKeyTypeMismatch);
|
|
54294
54303
|
}
|
|
54295
54304
|
// SAN must be exactly 'e'+base32(rawPub)
|
|
@@ -54297,7 +54306,7 @@ async function verifyCertificate(certs) {
|
|
|
54297
54306
|
const sanField = xc.subjectAltName ?? "";
|
|
54298
54307
|
const m = sanField.match(/DNS:([^,]+)/);
|
|
54299
54308
|
if (m === null || m[1] !== expectedSan) {
|
|
54300
|
-
certificate_logger.log
|
|
54309
|
+
certificate_logger.log `AltName mismatch. Expected: '${expectedSan}', got: '${m?.[1]}'`;
|
|
54301
54310
|
return result_Result.error(VerifyCertError.AltNameMismatch);
|
|
54302
54311
|
}
|
|
54303
54312
|
const key = Buffer.from(jwk.x ?? "", "base64url");
|
|
@@ -54564,19 +54573,19 @@ class QuicNetwork {
|
|
|
54564
54573
|
}
|
|
54565
54574
|
this.started = true;
|
|
54566
54575
|
await this.socket.start({ host: this.listen.host, port: this.listen.port });
|
|
54567
|
-
quic_network_logger.info
|
|
54576
|
+
quic_network_logger.info `🛜 QUIC socket on ${this.socket.host}:${this.socket.port}`;
|
|
54568
54577
|
await this.server.start();
|
|
54569
|
-
quic_network_logger.log
|
|
54578
|
+
quic_network_logger.log `🛜 QUIC server listening`;
|
|
54570
54579
|
}
|
|
54571
54580
|
async stop() {
|
|
54572
54581
|
if (!this.started) {
|
|
54573
54582
|
throw new Error("Network not started yet!");
|
|
54574
54583
|
}
|
|
54575
|
-
quic_network_logger.info
|
|
54584
|
+
quic_network_logger.info `Stopping the networking.`;
|
|
54576
54585
|
await this.server.stop();
|
|
54577
54586
|
await this.socket.stop();
|
|
54578
54587
|
this.started = false;
|
|
54579
|
-
quic_network_logger.info
|
|
54588
|
+
quic_network_logger.info `Networking stopped.`;
|
|
54580
54589
|
}
|
|
54581
54590
|
get peers() {
|
|
54582
54591
|
return this._peers;
|
|
@@ -54597,7 +54606,7 @@ clazz, callback) {
|
|
|
54597
54606
|
await callback(ev);
|
|
54598
54607
|
}
|
|
54599
54608
|
catch (e) {
|
|
54600
|
-
quic_utils_logger.error
|
|
54609
|
+
quic_utils_logger.error `Unhandled exception in ${clazz.name} event handler: ${e}`;
|
|
54601
54610
|
}
|
|
54602
54611
|
});
|
|
54603
54612
|
}
|
|
@@ -54656,7 +54665,7 @@ class QuicPeer {
|
|
|
54656
54665
|
streamEvents = new (external_node_events_default())();
|
|
54657
54666
|
constructor(conn, peerInfo) {
|
|
54658
54667
|
this.conn = conn;
|
|
54659
|
-
quic_peer_logger.log
|
|
54668
|
+
quic_peer_logger.log `👥 [${peerInfo.id}] peer connected ${conn.remoteHost}:${conn.remotePort}`;
|
|
54660
54669
|
this.connectionId = conn.connectionIdShared.toString();
|
|
54661
54670
|
this.address = {
|
|
54662
54671
|
host: conn.remoteHost,
|
|
@@ -54666,11 +54675,11 @@ class QuicPeer {
|
|
|
54666
54675
|
this.key = peerInfo.key;
|
|
54667
54676
|
addEventListener(conn, EventQUICConnectionStream, (ev) => {
|
|
54668
54677
|
const stream = ev.detail;
|
|
54669
|
-
quic_peer_logger.log
|
|
54678
|
+
quic_peer_logger.log `🚰 [${this.id}] new stream: [${stream.streamId}]`;
|
|
54670
54679
|
this.streamEvents.emit("stream", new QuicStream(stream));
|
|
54671
54680
|
});
|
|
54672
54681
|
addEventListener(conn, EventQUICConnectionError, (err) => {
|
|
54673
|
-
quic_peer_logger.error
|
|
54682
|
+
quic_peer_logger.error `❌ [${this.id}] connection failed: ${err.detail}`;
|
|
54674
54683
|
});
|
|
54675
54684
|
}
|
|
54676
54685
|
addOnIncomingStream(streamCallback) {
|
|
@@ -54678,11 +54687,11 @@ class QuicPeer {
|
|
|
54678
54687
|
}
|
|
54679
54688
|
openStream() {
|
|
54680
54689
|
const stream = this.conn.newStream("bidi");
|
|
54681
|
-
quic_peer_logger.log
|
|
54690
|
+
quic_peer_logger.log `🚰 [${this.id}] opening stream: [${stream.streamId}]`;
|
|
54682
54691
|
return new QuicStream(stream);
|
|
54683
54692
|
}
|
|
54684
54693
|
async disconnect() {
|
|
54685
|
-
quic_peer_logger.log
|
|
54694
|
+
quic_peer_logger.log `👋 [${this.id}] disconnecting`;
|
|
54686
54695
|
await this.conn.stop({ isApp: true });
|
|
54687
54696
|
}
|
|
54688
54697
|
}
|
|
@@ -54703,7 +54712,7 @@ const setup_logger = Logger.new(import.meta.filename, "net");
|
|
|
54703
54712
|
class Quic {
|
|
54704
54713
|
/** Setup QUIC socket and start listening for connections. */
|
|
54705
54714
|
static async setup({ host, port, protocols, key }) {
|
|
54706
|
-
const quicLoggerLvl =
|
|
54715
|
+
const quicLoggerLvl = setup_logger.getLevel() > Level.TRACE ? LogLevel.WARN : LogLevel.DEBUG;
|
|
54707
54716
|
const quicLogger = new dist_Logger("quic", quicLoggerLvl, [
|
|
54708
54717
|
new handlers_StreamHandler(format `${level}:${keys}:${msg}`),
|
|
54709
54718
|
]);
|
|
@@ -54726,7 +54735,7 @@ class Quic {
|
|
|
54726
54735
|
verifyPeer: true,
|
|
54727
54736
|
verifyCallback: lastConnectedPeer.verifyCallback,
|
|
54728
54737
|
};
|
|
54729
|
-
setup_logger.info
|
|
54738
|
+
setup_logger.info `🆔 Peer id: ** ${altNameRaw(key.pubKey)}@${host}:${port} ** (pubkey: ${key.pubKey})`;
|
|
54730
54739
|
// Shared injected UDP socket
|
|
54731
54740
|
const socket = new dist_QUICSocket({
|
|
54732
54741
|
logger: quicLogger.getChild("socket"),
|
|
@@ -54741,8 +54750,8 @@ class Quic {
|
|
|
54741
54750
|
// peer management
|
|
54742
54751
|
const peers = new PeersManagement();
|
|
54743
54752
|
// basic error handling
|
|
54744
|
-
addEventListener(server, EventQUICServerError, (error) => setup_logger.error
|
|
54745
|
-
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}`);
|
|
54746
54755
|
// handling incoming session
|
|
54747
54756
|
addEventListener(server, EventQUICServerConnection, async (ev) => {
|
|
54748
54757
|
const conn = ev.detail;
|
|
@@ -54751,16 +54760,16 @@ class Quic {
|
|
|
54751
54760
|
return;
|
|
54752
54761
|
}
|
|
54753
54762
|
if (lastConnectedPeer.info.key.isEqualTo(key.pubKey)) {
|
|
54754
|
-
setup_logger.log
|
|
54763
|
+
setup_logger.log `🛜 Rejecting connection from ourself from ${conn.remoteHost}:${conn.remotePort}`;
|
|
54755
54764
|
await conn.stop();
|
|
54756
54765
|
return;
|
|
54757
54766
|
}
|
|
54758
54767
|
if (peers.isConnected(lastConnectedPeer.info.id)) {
|
|
54759
|
-
setup_logger.log
|
|
54768
|
+
setup_logger.log `🛜 Rejecting duplicate connection with peer ${lastConnectedPeer.info.id} from ${conn.remoteHost}:${conn.remotePort}`;
|
|
54760
54769
|
await conn.stop();
|
|
54761
54770
|
return;
|
|
54762
54771
|
}
|
|
54763
|
-
setup_logger.log
|
|
54772
|
+
setup_logger.log `🛜 Server handshake with ${conn.remoteHost}:${conn.remotePort}`;
|
|
54764
54773
|
newPeer(conn, lastConnectedPeer.info);
|
|
54765
54774
|
lastConnectedPeer.info = null;
|
|
54766
54775
|
await conn.start();
|
|
@@ -54783,10 +54792,10 @@ class Quic {
|
|
|
54783
54792
|
});
|
|
54784
54793
|
const client = await clientLater;
|
|
54785
54794
|
addEventListener(client, EventQUICClientClose, () => {
|
|
54786
|
-
setup_logger.log
|
|
54795
|
+
setup_logger.log `⚰️ Client connection closed.`;
|
|
54787
54796
|
});
|
|
54788
54797
|
addEventListener(client, EventQUICClientError, (error) => {
|
|
54789
|
-
setup_logger.error
|
|
54798
|
+
setup_logger.error `🔴 Client error: ${error.detail}`;
|
|
54790
54799
|
});
|
|
54791
54800
|
if (peerDetails.info === null) {
|
|
54792
54801
|
throw new Error("Client connected, but there is no peer details!");
|
|
@@ -54794,7 +54803,7 @@ class Quic {
|
|
|
54794
54803
|
if (options.verifyName !== undefined && options.verifyName !== peerDetails.info.id) {
|
|
54795
54804
|
throw new Error(`Client connected, but the id didn't match. Expected: ${options.verifyName}, got: ${peerDetails.info.id}`);
|
|
54796
54805
|
}
|
|
54797
|
-
setup_logger.log
|
|
54806
|
+
setup_logger.log `🤝 Client handshake with: ${peer.host}:${peer.port}`;
|
|
54798
54807
|
return newPeer(client.connection, peerDetails.info);
|
|
54799
54808
|
}
|
|
54800
54809
|
function newPeer(conn, peerInfo) {
|
|
@@ -54914,10 +54923,10 @@ class Connections {
|
|
|
54914
54923
|
for (;;) {
|
|
54915
54924
|
// increase the reconnection counter
|
|
54916
54925
|
meta.currentRetry += 1;
|
|
54917
|
-
if (meta.currentRetry
|
|
54926
|
+
if (meta.currentRetry > meta.maxRetries) {
|
|
54918
54927
|
// reached max retries for a peer, remove it from tracking.
|
|
54919
54928
|
this.peerInfo.delete(id);
|
|
54920
|
-
jamnp_s_peers_logger.log
|
|
54929
|
+
jamnp_s_peers_logger.log `[${id}] max retries reached. Removing peer.`;
|
|
54921
54930
|
return;
|
|
54922
54931
|
}
|
|
54923
54932
|
// else attempt to connect to a node a bit later.
|
|
@@ -54936,7 +54945,7 @@ class Connections {
|
|
|
54936
54945
|
}
|
|
54937
54946
|
// attempt to connect to the peer
|
|
54938
54947
|
try {
|
|
54939
|
-
jamnp_s_peers_logger.trace
|
|
54948
|
+
jamnp_s_peers_logger.trace `[${id}] Attempting to connect to peer at ${meta.address.host}:${meta.address.port}.`;
|
|
54940
54949
|
await this.network.dial(meta.address, { signal, verifyName: meta.peerId });
|
|
54941
54950
|
return;
|
|
54942
54951
|
}
|
|
@@ -54945,7 +54954,7 @@ class Connections {
|
|
|
54945
54954
|
return;
|
|
54946
54955
|
}
|
|
54947
54956
|
// failing to connect, will retry.
|
|
54948
|
-
jamnp_s_peers_logger.trace
|
|
54957
|
+
jamnp_s_peers_logger.trace `[${id}] attempt failed. Will retry (${meta.currentRetry}/${meta.maxRetries})`;
|
|
54949
54958
|
}
|
|
54950
54959
|
}
|
|
54951
54960
|
}
|
|
@@ -55058,7 +55067,7 @@ class StreamManager {
|
|
|
55058
55067
|
// We expect a one-byte identifier first.
|
|
55059
55068
|
const data = await reader.read();
|
|
55060
55069
|
bytes = bytes_BytesBlob.blobFrom(data.value !== undefined ? data.value : new Uint8Array());
|
|
55061
|
-
stream_manager_logger.trace
|
|
55070
|
+
stream_manager_logger.trace `🚰 --> [${peer.id}:${streamId}] Initial data: ${bytes}`;
|
|
55062
55071
|
}
|
|
55063
55072
|
finally {
|
|
55064
55073
|
reader.releaseLock();
|
|
@@ -55072,7 +55081,7 @@ class StreamManager {
|
|
|
55072
55081
|
if (handler === undefined) {
|
|
55073
55082
|
throw new Error(`Unsupported stream kind: ${kind}`);
|
|
55074
55083
|
}
|
|
55075
|
-
stream_manager_logger.log
|
|
55084
|
+
stream_manager_logger.log `🚰 --> [${peer.id}:${stream.streamId}] Stream identified as: ${kind}`;
|
|
55076
55085
|
this.registerStream(peer, handler, stream, bytes_BytesBlob.blobFrom(bytes.raw.subarray(1)));
|
|
55077
55086
|
}
|
|
55078
55087
|
registerStream(peer, handler, stream, initialData) {
|
|
@@ -55082,7 +55091,7 @@ class StreamManager {
|
|
|
55082
55091
|
this.streams.delete(streamId);
|
|
55083
55092
|
this.backgroundTasks.delete(streamId);
|
|
55084
55093
|
if (kind === StreamErrorKind.Exception) {
|
|
55085
|
-
stream_manager_logger.error
|
|
55094
|
+
stream_manager_logger.error `🚰 --- [${peer.id}:${streamId}] Stream error: ${e}. Disconnecting peer.`;
|
|
55086
55095
|
}
|
|
55087
55096
|
if (kind !== StreamErrorKind.LocalClose) {
|
|
55088
55097
|
// whenever we have an error, we are going to inform the handler
|
|
@@ -55116,10 +55125,10 @@ async function readStreamForever(peer, handler, quicStream, initialData, reader)
|
|
|
55116
55125
|
let isDone = false;
|
|
55117
55126
|
const callback = handleMessageFragmentation((data) => {
|
|
55118
55127
|
const bytes = bytes_BytesBlob.blobFrom(new Uint8Array(data));
|
|
55119
|
-
stream_manager_logger.trace
|
|
55128
|
+
stream_manager_logger.trace `🚰 --> [${peer.id}:${quicStream.streamId}] ${bytes}`;
|
|
55120
55129
|
handler.onStreamMessage(quicStream, bytes);
|
|
55121
55130
|
}, () => {
|
|
55122
|
-
stream_manager_logger.error
|
|
55131
|
+
stream_manager_logger.error `🚰 --> [${peer.id}:${quicStream.streamId}] got too much data. Disconnecting.`;
|
|
55123
55132
|
peer.disconnect();
|
|
55124
55133
|
});
|
|
55125
55134
|
for (;;) {
|
|
@@ -55128,7 +55137,7 @@ async function readStreamForever(peer, handler, quicStream, initialData, reader)
|
|
|
55128
55137
|
// be a promise, so that we can make back pressure here.
|
|
55129
55138
|
callback(bytes.raw);
|
|
55130
55139
|
if (isDone) {
|
|
55131
|
-
stream_manager_logger.log
|
|
55140
|
+
stream_manager_logger.log `🚰 --> [${peer.id}:${quicStream.streamId}] remote finished.`;
|
|
55132
55141
|
return;
|
|
55133
55142
|
}
|
|
55134
55143
|
// await for more data
|
|
@@ -55171,7 +55180,7 @@ class QuicStreamSender {
|
|
|
55171
55180
|
return;
|
|
55172
55181
|
}
|
|
55173
55182
|
const { data, addPrefix } = chunk;
|
|
55174
|
-
stream_manager_logger.trace
|
|
55183
|
+
stream_manager_logger.trace `🚰 <-- [${this.streamId}] write: ${data}`;
|
|
55175
55184
|
if (addPrefix) {
|
|
55176
55185
|
await writer.write(encodeMessageLength(data.raw));
|
|
55177
55186
|
}
|
|
@@ -55188,7 +55197,7 @@ class QuicStreamSender {
|
|
|
55188
55197
|
}
|
|
55189
55198
|
close() {
|
|
55190
55199
|
handleAsyncErrors(async () => {
|
|
55191
|
-
stream_manager_logger.trace
|
|
55200
|
+
stream_manager_logger.trace `🚰 <-- [${this.streamId}] closing`;
|
|
55192
55201
|
if (this.currentWriterPromise !== null) {
|
|
55193
55202
|
await this.currentWriterPromise;
|
|
55194
55203
|
}
|
|
@@ -55274,7 +55283,7 @@ class ServerHandler {
|
|
|
55274
55283
|
}
|
|
55275
55284
|
onStreamMessage(sender, message) {
|
|
55276
55285
|
const request = decoder_Decoder.decodeObject(BlockRequest.Codec, message);
|
|
55277
|
-
ce_128_block_request_logger.log
|
|
55286
|
+
ce_128_block_request_logger.log `[${sender.streamId}] Client has requested: ${request}`;
|
|
55278
55287
|
const blocks = this.getBlockSequence(sender.streamId, request.headerHash, request.direction, request.maxBlocks);
|
|
55279
55288
|
sender.bufferAndSend(encoder_Encoder.encodeObject(descriptors_codec.sequenceFixLen(Block.Codec.View, blocks.length), blocks, this.chainSpec));
|
|
55280
55289
|
sender.close();
|
|
@@ -55294,7 +55303,7 @@ class ClientHandler {
|
|
|
55294
55303
|
throw new Error("Received an unexpected message from the server.");
|
|
55295
55304
|
}
|
|
55296
55305
|
const blocks = decoder_Decoder.decodeSequence(Block.Codec.View, message, this.chainSpec);
|
|
55297
|
-
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.`;
|
|
55298
55307
|
this.promiseResolvers.get(sender.streamId)?.(blocks);
|
|
55299
55308
|
this.promiseResolvers.delete(sender.streamId);
|
|
55300
55309
|
}
|
|
@@ -55465,13 +55474,13 @@ class ce_129_state_request_Handler {
|
|
|
55465
55474
|
}
|
|
55466
55475
|
onStreamMessage(sender, message) {
|
|
55467
55476
|
if (this.isServer) {
|
|
55468
|
-
ce_129_state_request_logger.info
|
|
55477
|
+
ce_129_state_request_logger.info `[${sender.streamId}][server]: Received request.`;
|
|
55469
55478
|
if (this.getBoundaryNodes === undefined || this.getKeyValuePairs === undefined)
|
|
55470
55479
|
return;
|
|
55471
55480
|
const request = decoder_Decoder.decodeObject(StateRequest.Codec, message);
|
|
55472
55481
|
const boundaryNodes = this.getBoundaryNodes(request.headerHash, request.startKey, request.endKey);
|
|
55473
55482
|
const keyValuePairs = this.getKeyValuePairs(request.headerHash, request.startKey, request.endKey);
|
|
55474
|
-
ce_129_state_request_logger.info
|
|
55483
|
+
ce_129_state_request_logger.info `[${sender.streamId}][server]: <-- responding with boundary nodes and key value pairs.`;
|
|
55475
55484
|
sender.bufferAndSend(encoder_Encoder.encodeObject(descriptors_codec.sequenceVarLen(trieNodeCodec), boundaryNodes));
|
|
55476
55485
|
sender.bufferAndSend(encoder_Encoder.encodeObject(StateResponse.Codec, StateResponse.create({ keyValuePairs })));
|
|
55477
55486
|
sender.close();
|
|
@@ -55479,11 +55488,11 @@ class ce_129_state_request_Handler {
|
|
|
55479
55488
|
}
|
|
55480
55489
|
if (!this.boundaryNodes.has(sender.streamId)) {
|
|
55481
55490
|
this.boundaryNodes.set(sender.streamId, decoder_Decoder.decodeObject(descriptors_codec.sequenceVarLen(trieNodeCodec), message));
|
|
55482
|
-
ce_129_state_request_logger.info
|
|
55491
|
+
ce_129_state_request_logger.info `[${sender.streamId}][client]: Received boundary nodes.`;
|
|
55483
55492
|
return;
|
|
55484
55493
|
}
|
|
55485
55494
|
this.onResponse.get(sender.streamId)?.(decoder_Decoder.decodeObject(StateResponse.Codec, message));
|
|
55486
|
-
ce_129_state_request_logger.info
|
|
55495
|
+
ce_129_state_request_logger.info `[${sender.streamId}][client]: Received state values.`;
|
|
55487
55496
|
}
|
|
55488
55497
|
onClose(streamId) {
|
|
55489
55498
|
this.boundaryNodes.delete(streamId);
|
|
@@ -55540,7 +55549,7 @@ class ce_131_ce_132_safrole_ticket_distribution_ServerHandler {
|
|
|
55540
55549
|
}
|
|
55541
55550
|
onStreamMessage(sender, message) {
|
|
55542
55551
|
const ticketDistribution = Decoder.decodeObject(TicketDistributionRequest.Codec, message);
|
|
55543
|
-
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}`;
|
|
55544
55553
|
this.onTicketReceived(ticketDistribution.epochIndex, ticketDistribution.ticket);
|
|
55545
55554
|
sender.close();
|
|
55546
55555
|
}
|
|
@@ -55552,7 +55561,7 @@ class ce_131_ce_132_safrole_ticket_distribution_ClientHandler {
|
|
|
55552
55561
|
this.kind = kind;
|
|
55553
55562
|
}
|
|
55554
55563
|
onStreamMessage(sender) {
|
|
55555
|
-
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.`;
|
|
55556
55565
|
sender.close();
|
|
55557
55566
|
}
|
|
55558
55567
|
onClose() { }
|
|
@@ -55625,15 +55634,15 @@ class ce_133_work_package_submission_ServerHandler {
|
|
|
55625
55634
|
class ce_133_work_package_submission_ClientHandler {
|
|
55626
55635
|
kind = ce_133_work_package_submission_STREAM_KIND;
|
|
55627
55636
|
onStreamMessage(sender) {
|
|
55628
|
-
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.`;
|
|
55629
55638
|
sender.close();
|
|
55630
55639
|
}
|
|
55631
55640
|
onClose() { }
|
|
55632
55641
|
sendWorkPackage(sender, coreIndex, workPackage, extrinsic) {
|
|
55633
55642
|
const corePack = CoreWorkPackage.create({ coreIndex, workPackage });
|
|
55634
|
-
ce_133_work_package_submission_logger.trace
|
|
55643
|
+
ce_133_work_package_submission_logger.trace `[${sender.streamId}] Sending work package: ${corePack}`;
|
|
55635
55644
|
sender.bufferAndSend(Encoder.encodeObject(CoreWorkPackage.Codec, corePack));
|
|
55636
|
-
ce_133_work_package_submission_logger.trace
|
|
55645
|
+
ce_133_work_package_submission_logger.trace `[${sender.streamId}] Sending extrinsics: ${workPackage.items}`;
|
|
55637
55646
|
sender.bufferAndSend(Encoder.encodeObject(workItemExtrinsicsCodec(workPackage.items), extrinsic));
|
|
55638
55647
|
// now close the connection
|
|
55639
55648
|
sender.close();
|
|
@@ -55709,7 +55718,7 @@ class ce_134_work_package_sharing_ServerHandler {
|
|
|
55709
55718
|
ce_134_work_package_sharing_ServerHandler.sendWorkReport(sender, workReportHash, signature);
|
|
55710
55719
|
})
|
|
55711
55720
|
.catch((error) => {
|
|
55712
|
-
ce_134_work_package_sharing_logger.error
|
|
55721
|
+
ce_134_work_package_sharing_logger.error `[${streamId}] Error processing work package: ${error}`;
|
|
55713
55722
|
this.onClose(streamId);
|
|
55714
55723
|
});
|
|
55715
55724
|
}
|
|
@@ -55726,7 +55735,7 @@ class ce_134_work_package_sharing_ClientHandler {
|
|
|
55726
55735
|
throw new Error("Unexpected message received.");
|
|
55727
55736
|
}
|
|
55728
55737
|
const response = Decoder.decodeObject(WorkPackageSharingResponse.Codec, message);
|
|
55729
|
-
ce_134_work_package_sharing_logger.info
|
|
55738
|
+
ce_134_work_package_sharing_logger.info `[${sender.streamId}] Received work report hash and signature.`;
|
|
55730
55739
|
pendingRequest.resolve({ workReportHash: response.workReportHash, signature: response.signature });
|
|
55731
55740
|
sender.close();
|
|
55732
55741
|
}
|
|
@@ -55739,9 +55748,9 @@ class ce_134_work_package_sharing_ClientHandler {
|
|
|
55739
55748
|
}
|
|
55740
55749
|
async sendWorkPackage(sender, coreIndex, segmentsRootMappings, workPackageBundle) {
|
|
55741
55750
|
const request = WorkPackageSharingRequest.create({ coreIndex, segmentsRootMappings });
|
|
55742
|
-
ce_134_work_package_sharing_logger.trace
|
|
55751
|
+
ce_134_work_package_sharing_logger.trace `[${sender.streamId}] Sending core index and segments-root mappings.`;
|
|
55743
55752
|
sender.bufferAndSend(Encoder.encodeObject(WorkPackageSharingRequest.Codec, request));
|
|
55744
|
-
ce_134_work_package_sharing_logger.trace
|
|
55753
|
+
ce_134_work_package_sharing_logger.trace `[${sender.streamId}] Sending work package bundle.`;
|
|
55745
55754
|
sender.bufferAndSend(Encoder.encodeObject(WorkPackageBundleCodec, workPackageBundle));
|
|
55746
55755
|
return new Promise((resolve, reject) => {
|
|
55747
55756
|
this.pendingRequests.set(sender.streamId, { resolve, reject });
|
|
@@ -55801,7 +55810,7 @@ class ce_135_work_report_distribution_ServerHandler {
|
|
|
55801
55810
|
}
|
|
55802
55811
|
onStreamMessage(sender, message) {
|
|
55803
55812
|
const guaranteedWorkReport = Decoder.decodeObject(GuaranteedWorkReport.Codec, message, this.chainSpec);
|
|
55804
|
-
ce_135_work_report_distribution_logger.log
|
|
55813
|
+
ce_135_work_report_distribution_logger.log `[${sender.streamId}] Received guaranteed work report.`;
|
|
55805
55814
|
this.onWorkReport(guaranteedWorkReport);
|
|
55806
55815
|
sender.close();
|
|
55807
55816
|
}
|
|
@@ -55814,12 +55823,12 @@ class ce_135_work_report_distribution_ClientHandler {
|
|
|
55814
55823
|
this.chainSpec = chainSpec;
|
|
55815
55824
|
}
|
|
55816
55825
|
onStreamMessage(sender) {
|
|
55817
|
-
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.`;
|
|
55818
55827
|
sender.close();
|
|
55819
55828
|
}
|
|
55820
55829
|
onClose() { }
|
|
55821
55830
|
sendWorkReport(sender, workReport) {
|
|
55822
|
-
ce_135_work_report_distribution_logger.trace
|
|
55831
|
+
ce_135_work_report_distribution_logger.trace `[${sender.streamId}] Sending guaranteed work report.`;
|
|
55823
55832
|
sender.bufferAndSend(Encoder.encodeObject(GuaranteedWorkReport.Codec, workReport, this.chainSpec));
|
|
55824
55833
|
sender.close();
|
|
55825
55834
|
}
|
|
@@ -55925,7 +55934,7 @@ class up_0_block_announcement_Handler {
|
|
|
55925
55934
|
this.handshakes.set(streamId, handshake);
|
|
55926
55935
|
// we didn't initiate this handshake, so let's respond
|
|
55927
55936
|
if (!this.pendingHandshakes.delete(streamId)) {
|
|
55928
|
-
up_0_block_announcement_logger.log
|
|
55937
|
+
up_0_block_announcement_logger.log `[${streamId}] <-- responding with a handshake.`;
|
|
55929
55938
|
sender.bufferAndSend(encoder_Encoder.encodeObject(Handshake.Codec, this.getHandshake()));
|
|
55930
55939
|
}
|
|
55931
55940
|
this.onHandshake(streamId, handshake);
|
|
@@ -55933,7 +55942,7 @@ class up_0_block_announcement_Handler {
|
|
|
55933
55942
|
}
|
|
55934
55943
|
// it's just an announcement
|
|
55935
55944
|
const annoucement = decoder_Decoder.decodeObject(Announcement.Codec, message, this.spec);
|
|
55936
|
-
up_0_block_announcement_logger.log
|
|
55945
|
+
up_0_block_announcement_logger.log `[${streamId}] --> got blocks announcement: ${annoucement.final}`;
|
|
55937
55946
|
this.onAnnouncement(streamId, annoucement);
|
|
55938
55947
|
}
|
|
55939
55948
|
onClose(streamId) {
|
|
@@ -55946,7 +55955,7 @@ class up_0_block_announcement_Handler {
|
|
|
55946
55955
|
return;
|
|
55947
55956
|
}
|
|
55948
55957
|
const handshake = this.getHandshake();
|
|
55949
|
-
up_0_block_announcement_logger.trace
|
|
55958
|
+
up_0_block_announcement_logger.trace `[${streamId}] <-- sending handshake`;
|
|
55950
55959
|
this.pendingHandshakes.set(sender.streamId, true);
|
|
55951
55960
|
sender.bufferAndSend(encoder_Encoder.encodeObject(Handshake.Codec, handshake));
|
|
55952
55961
|
}
|
|
@@ -55954,11 +55963,11 @@ class up_0_block_announcement_Handler {
|
|
|
55954
55963
|
const { streamId } = sender;
|
|
55955
55964
|
// only send announcement if we've handshaken
|
|
55956
55965
|
if (this.handshakes.has(streamId)) {
|
|
55957
|
-
up_0_block_announcement_logger.trace
|
|
55966
|
+
up_0_block_announcement_logger.trace `[${streamId}] <-- sending block announcement: ${annoucement.final}`;
|
|
55958
55967
|
sender.bufferAndSend(encoder_Encoder.encodeObject(Announcement.Codec, annoucement, this.spec));
|
|
55959
55968
|
}
|
|
55960
55969
|
else {
|
|
55961
|
-
up_0_block_announcement_logger.warn
|
|
55970
|
+
up_0_block_announcement_logger.warn `[${streamId}] <-- no handshake yet, skipping announcement.`;
|
|
55962
55971
|
}
|
|
55963
55972
|
}
|
|
55964
55973
|
}
|
|
@@ -56075,7 +56084,7 @@ class SyncTask {
|
|
|
56075
56084
|
onUp0Annoucement(peer, announcement) {
|
|
56076
56085
|
const { hash, slot } = announcement.final;
|
|
56077
56086
|
const bestHeader = hashHeader(announcement.header, this.spec);
|
|
56078
|
-
sync_logger.info
|
|
56087
|
+
sync_logger.info `[${peer.id}] --> Received new header #${announcement.header.timeSlotIndex}: ${bestHeader.hash}`;
|
|
56079
56088
|
// NOTE [ToDr] Instead of having `Connections` store aux data perhaps
|
|
56080
56089
|
// we should maintain that directly? However that would require
|
|
56081
56090
|
// listening to peers connected/disconnected to perfrom some cleanups
|
|
@@ -56150,7 +56159,7 @@ class SyncTask {
|
|
|
56150
56159
|
const peers = this.connections.getConnectedPeers();
|
|
56151
56160
|
for (const peerInfo of peers) {
|
|
56152
56161
|
this.streamManager.withStreamOfKind(peerInfo.peerId, up_0_block_announcement_STREAM_KIND, (handler, sender) => {
|
|
56153
|
-
sync_logger.log
|
|
56162
|
+
sync_logger.log `[${peerInfo.peerId}] <-- Broadcasting new header #${slot}: ${header.hash}`;
|
|
56154
56163
|
handler.sendAnnouncement(sender, annoucement);
|
|
56155
56164
|
return result_OK;
|
|
56156
56165
|
});
|
|
@@ -56164,13 +56173,13 @@ class SyncTask {
|
|
|
56164
56173
|
}
|
|
56165
56174
|
if (res.error === BlockSequenceError.BlockOnFork) {
|
|
56166
56175
|
// seems that peer is requesting syncing a fork from us, let's bail.
|
|
56167
|
-
sync_logger.warn
|
|
56176
|
+
sync_logger.warn `[${peer.id}] --> Invalid block sequence request: ${startHash} is on a fork.`;
|
|
56168
56177
|
return [];
|
|
56169
56178
|
}
|
|
56170
56179
|
if (res.error === BlockSequenceError.NoStartBlock) {
|
|
56171
56180
|
// we don't know about that block at all, so let's just bail.
|
|
56172
56181
|
// we should probably penalize the peer for sending BS?
|
|
56173
|
-
sync_logger.warn
|
|
56182
|
+
sync_logger.warn `[${peer.id}] --> Invalid block sequence request: ${startHash} missing header or extrinsic.`;
|
|
56174
56183
|
return [];
|
|
56175
56184
|
}
|
|
56176
56185
|
debug_assertNever(res.error);
|
|
@@ -56190,10 +56199,10 @@ class SyncTask {
|
|
|
56190
56199
|
// figure out where others are at
|
|
56191
56200
|
const othersBest = this.othersBest;
|
|
56192
56201
|
const blocksToSync = othersBest.slot - ourBestSlot;
|
|
56193
|
-
sync_logger.trace
|
|
56202
|
+
sync_logger.trace `Our best. ${ourBestSlot}. Best seen: ${othersBest.slot}`;
|
|
56194
56203
|
if (blocksToSync < 1) {
|
|
56195
56204
|
this.connections.getPeerCount();
|
|
56196
|
-
sync_logger.trace
|
|
56205
|
+
sync_logger.trace `No new blocks. ${peerCount} peers.`;
|
|
56197
56206
|
return {
|
|
56198
56207
|
kind: SyncResult.NoNewBlocks,
|
|
56199
56208
|
ours: ourBestSlot,
|
|
@@ -56201,7 +56210,7 @@ class SyncTask {
|
|
|
56201
56210
|
};
|
|
56202
56211
|
}
|
|
56203
56212
|
const requested = [];
|
|
56204
|
-
sync_logger.log
|
|
56213
|
+
sync_logger.log `Sync ${blocksToSync} blocks from ${peerCount} peers.`;
|
|
56205
56214
|
// NOTE [ToDr] We might be requesting the same blocks from many peers
|
|
56206
56215
|
// which isn't very optimal, but for now: 🤷
|
|
56207
56216
|
//
|
|
@@ -56227,12 +56236,12 @@ class SyncTask {
|
|
|
56227
56236
|
// request as much blocks from that peer as possible.
|
|
56228
56237
|
this.streamManager.withNewStream(peerInfo.peerRef, STREAM_KIND, (handler, sender) => {
|
|
56229
56238
|
handleAsyncErrors(async () => {
|
|
56230
|
-
sync_logger.log
|
|
56239
|
+
sync_logger.log `[${peerInfo.peerId}] <-- Fetching ${bestSlot - ourBestSlot} blocks (${bestHash})`;
|
|
56231
56240
|
const blocks = await handler.requestBlockSequence(sender, bestHash, Direction.DescIncl, numbers_tryAsU32(bestSlot - ourBestSlot));
|
|
56232
56241
|
blocks.reverse();
|
|
56233
56242
|
this.onNewBlocks(blocks, peerInfo.peerId);
|
|
56234
56243
|
}, (e) => {
|
|
56235
|
-
sync_logger.warn
|
|
56244
|
+
sync_logger.warn `[${peerInfo.peerId}] <-- requesting blocks to import: ${e}`;
|
|
56236
56245
|
});
|
|
56237
56246
|
return result_OK;
|
|
56238
56247
|
});
|
|
@@ -56306,7 +56315,7 @@ function setupPeerListeners(syncTask, network, streamManager) {
|
|
|
56306
56315
|
// whenever the peer wants to open a stream with us, let's handle that.
|
|
56307
56316
|
peer.addOnIncomingStream((stream) => {
|
|
56308
56317
|
handleAsyncErrors(() => streamManager.onIncomingStream(peer, stream), (e) => {
|
|
56309
|
-
network_logger.error
|
|
56318
|
+
network_logger.error `[${peer.id}:${stream.streamId}]🚰 Stream error: ${e}. Disconnecting peer.`;
|
|
56310
56319
|
peer.disconnect();
|
|
56311
56320
|
});
|
|
56312
56321
|
return result_OK;
|
|
@@ -56556,10 +56565,10 @@ class FuzzTarget {
|
|
|
56556
56565
|
async onSocketMessage(msg) {
|
|
56557
56566
|
// attempt to decode the messsage
|
|
56558
56567
|
const message = decoder_Decoder.decodeObject(messageCodec, msg, this.spec);
|
|
56559
|
-
handler_logger.log
|
|
56568
|
+
handler_logger.log `[${message.type}] incoming message`;
|
|
56560
56569
|
await processAndRespond(this.spec, message, this.msgHandler, this.sender).catch((e) => {
|
|
56561
|
-
handler_logger.error
|
|
56562
|
-
handler_logger.error
|
|
56570
|
+
handler_logger.error `Error while processing fuzz v0 message: ${e}`;
|
|
56571
|
+
handler_logger.error `${e}`;
|
|
56563
56572
|
this.sender.close();
|
|
56564
56573
|
});
|
|
56565
56574
|
return;
|
|
@@ -56600,17 +56609,17 @@ class FuzzTarget {
|
|
|
56600
56609
|
break;
|
|
56601
56610
|
}
|
|
56602
56611
|
case MessageType.State: {
|
|
56603
|
-
handler_logger.log
|
|
56612
|
+
handler_logger.log `--> Received unexpected 'State' message from the fuzzer. Closing.`;
|
|
56604
56613
|
sender.close();
|
|
56605
56614
|
return;
|
|
56606
56615
|
}
|
|
56607
56616
|
case MessageType.StateRoot: {
|
|
56608
|
-
handler_logger.log
|
|
56617
|
+
handler_logger.log `--> Received unexpected 'StateRoot' message from the fuzzer. Closing.`;
|
|
56609
56618
|
sender.close();
|
|
56610
56619
|
return;
|
|
56611
56620
|
}
|
|
56612
56621
|
default: {
|
|
56613
|
-
handler_logger.log
|
|
56622
|
+
handler_logger.log `--> Received unexpected message type ${JSON.stringify(message)} from the fuzzer. Closing.`;
|
|
56614
56623
|
sender.close();
|
|
56615
56624
|
try {
|
|
56616
56625
|
debug_assertNever(message);
|
|
@@ -56621,17 +56630,17 @@ class FuzzTarget {
|
|
|
56621
56630
|
}
|
|
56622
56631
|
}
|
|
56623
56632
|
if (response !== null) {
|
|
56624
|
-
handler_logger.trace
|
|
56633
|
+
handler_logger.trace `<-- responding with: ${response.type}`;
|
|
56625
56634
|
const encoded = encoder_Encoder.encodeObject(messageCodec, response, spec);
|
|
56626
56635
|
sender.send(encoded);
|
|
56627
56636
|
}
|
|
56628
56637
|
else {
|
|
56629
|
-
handler_logger.warn
|
|
56638
|
+
handler_logger.warn `<-- no response generated for: ${message.type}`;
|
|
56630
56639
|
}
|
|
56631
56640
|
}
|
|
56632
56641
|
}
|
|
56633
56642
|
onClose({ error }) {
|
|
56634
|
-
handler_logger.log
|
|
56643
|
+
handler_logger.log `Closing the handler. Reason: ${error !== undefined ? error.message : "close"}.`;
|
|
56635
56644
|
}
|
|
56636
56645
|
}
|
|
56637
56646
|
|
|
@@ -56885,14 +56894,14 @@ class handler_FuzzTarget {
|
|
|
56885
56894
|
// attempt to decode the messsage
|
|
56886
56895
|
try {
|
|
56887
56896
|
const message = decoder_Decoder.decodeObject(types_messageCodec, msg, this.spec);
|
|
56888
|
-
v1_handler_logger.log
|
|
56897
|
+
v1_handler_logger.log `[${message.type}] incoming message`;
|
|
56889
56898
|
await this.processAndRespond(message);
|
|
56890
56899
|
}
|
|
56891
56900
|
catch (e) {
|
|
56892
|
-
v1_handler_logger.error
|
|
56893
|
-
v1_handler_logger.error
|
|
56901
|
+
v1_handler_logger.error `Error while processing fuzz v1 message: ${e}`;
|
|
56902
|
+
v1_handler_logger.error `${e}`;
|
|
56894
56903
|
if (e instanceof Error) {
|
|
56895
|
-
v1_handler_logger.error
|
|
56904
|
+
v1_handler_logger.error `${e.stack ?? ""}`;
|
|
56896
56905
|
}
|
|
56897
56906
|
this.sender.close();
|
|
56898
56907
|
}
|
|
@@ -56903,7 +56912,7 @@ class handler_FuzzTarget {
|
|
|
56903
56912
|
case types_MessageType.PeerInfo: {
|
|
56904
56913
|
// only support V1
|
|
56905
56914
|
if (message.value.fuzzVersion !== 1) {
|
|
56906
|
-
v1_handler_logger.warn
|
|
56915
|
+
v1_handler_logger.warn `Unsupported fuzzer protocol version: ${message.value.fuzzVersion}. Closing`;
|
|
56907
56916
|
this.sender.close();
|
|
56908
56917
|
return;
|
|
56909
56918
|
}
|
|
@@ -56911,9 +56920,9 @@ class handler_FuzzTarget {
|
|
|
56911
56920
|
const ourPeerInfo = await this.msgHandler.getPeerInfo(message.value);
|
|
56912
56921
|
// Calculate session features (intersection of both peer features)
|
|
56913
56922
|
this.sessionFeatures = message.value.features & ourPeerInfo.features;
|
|
56914
|
-
v1_handler_logger.info
|
|
56915
|
-
v1_handler_logger.log
|
|
56916
|
-
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}`;
|
|
56917
56926
|
response = {
|
|
56918
56927
|
type: types_MessageType.PeerInfo,
|
|
56919
56928
|
value: ourPeerInfo,
|
|
@@ -56953,22 +56962,22 @@ class handler_FuzzTarget {
|
|
|
56953
56962
|
break;
|
|
56954
56963
|
}
|
|
56955
56964
|
case types_MessageType.StateRoot: {
|
|
56956
|
-
v1_handler_logger.log
|
|
56965
|
+
v1_handler_logger.log `--> Received unexpected 'StateRoot' message from the fuzzer. Closing.`;
|
|
56957
56966
|
this.sender.close();
|
|
56958
56967
|
return;
|
|
56959
56968
|
}
|
|
56960
56969
|
case types_MessageType.State: {
|
|
56961
|
-
v1_handler_logger.log
|
|
56970
|
+
v1_handler_logger.log `--> Received unexpected 'State' message from the fuzzer. Closing.`;
|
|
56962
56971
|
this.sender.close();
|
|
56963
56972
|
return;
|
|
56964
56973
|
}
|
|
56965
56974
|
case types_MessageType.Error: {
|
|
56966
|
-
v1_handler_logger.log
|
|
56975
|
+
v1_handler_logger.log `--> Received unexpected 'Error' message from the fuzzer. Closing.`;
|
|
56967
56976
|
this.sender.close();
|
|
56968
56977
|
return;
|
|
56969
56978
|
}
|
|
56970
56979
|
default: {
|
|
56971
|
-
v1_handler_logger.log
|
|
56980
|
+
v1_handler_logger.log `--> Received unexpected message type ${JSON.stringify(message)} from the fuzzer. Closing.`;
|
|
56972
56981
|
this.sender.close();
|
|
56973
56982
|
try {
|
|
56974
56983
|
debug_assertNever(message);
|
|
@@ -56979,16 +56988,16 @@ class handler_FuzzTarget {
|
|
|
56979
56988
|
}
|
|
56980
56989
|
}
|
|
56981
56990
|
if (response !== null) {
|
|
56982
|
-
v1_handler_logger.trace
|
|
56991
|
+
v1_handler_logger.trace `<-- responding with: ${response.type}`;
|
|
56983
56992
|
const encoded = encoder_Encoder.encodeObject(types_messageCodec, response, this.spec);
|
|
56984
56993
|
this.sender.send(encoded);
|
|
56985
56994
|
}
|
|
56986
56995
|
else {
|
|
56987
|
-
v1_handler_logger.warn
|
|
56996
|
+
v1_handler_logger.warn `<-- no response generated for: ${message.type}`;
|
|
56988
56997
|
}
|
|
56989
56998
|
}
|
|
56990
56999
|
onClose({ error }) {
|
|
56991
|
-
v1_handler_logger.log
|
|
57000
|
+
v1_handler_logger.log `Closing the v1 handler. Reason: ${error !== undefined ? error.message : "close"}.`;
|
|
56992
57001
|
}
|
|
56993
57002
|
/** Check if a specific feature is enabled in the session */
|
|
56994
57003
|
hasFeature(feature) {
|
|
@@ -57034,7 +57043,7 @@ function startIpcServer(name, newMessageHandler) {
|
|
|
57034
57043
|
const logger = Logger.new(import.meta.filename, "ext-ipc");
|
|
57035
57044
|
// Create the IPC server
|
|
57036
57045
|
const server = (0,external_node_net_namespaceObject.createServer)((socket) => {
|
|
57037
|
-
logger.log
|
|
57046
|
+
logger.log `Client connected`;
|
|
57038
57047
|
const messageHandler = newMessageHandler(new IpcSender(socket));
|
|
57039
57048
|
// Handle incoming data from the client
|
|
57040
57049
|
socket.on("data", handleMessageFragmentation(async (data) => {
|
|
@@ -57046,23 +57055,23 @@ function startIpcServer(name, newMessageHandler) {
|
|
|
57046
57055
|
await messageHandler.onSocketMessage(data);
|
|
57047
57056
|
}
|
|
57048
57057
|
catch (e) {
|
|
57049
|
-
logger.error
|
|
57058
|
+
logger.error `Received invalid data on socket: ${e}. Closing connection.`;
|
|
57050
57059
|
socket.end();
|
|
57051
57060
|
}
|
|
57052
57061
|
finally {
|
|
57053
57062
|
socket.resume();
|
|
57054
57063
|
}
|
|
57055
57064
|
}, () => {
|
|
57056
|
-
logger.error
|
|
57065
|
+
logger.error `Received too much data on socket. Closing connection.`;
|
|
57057
57066
|
socket.end();
|
|
57058
57067
|
}));
|
|
57059
57068
|
// Handle client disconnection
|
|
57060
57069
|
socket.on("end", () => {
|
|
57061
|
-
logger.log
|
|
57070
|
+
logger.log `Client disconnected`;
|
|
57062
57071
|
messageHandler.onClose({});
|
|
57063
57072
|
});
|
|
57064
57073
|
socket.on("error", (error) => {
|
|
57065
|
-
logger.error
|
|
57074
|
+
logger.error `Socket error: ${error}`;
|
|
57066
57075
|
messageHandler.onClose({ error });
|
|
57067
57076
|
socket.end();
|
|
57068
57077
|
});
|
|
@@ -57077,14 +57086,14 @@ function startIpcServer(name, newMessageHandler) {
|
|
|
57077
57086
|
path: socketPath,
|
|
57078
57087
|
signal: controller.signal,
|
|
57079
57088
|
}, () => {
|
|
57080
|
-
logger.log
|
|
57089
|
+
logger.log `IPC server is listening at ${socketPath}`;
|
|
57081
57090
|
});
|
|
57082
57091
|
// Handle server errors
|
|
57083
57092
|
server.on("error", (err) => {
|
|
57084
57093
|
throw err;
|
|
57085
57094
|
});
|
|
57086
57095
|
return () => {
|
|
57087
|
-
logger.info
|
|
57096
|
+
logger.info `Closing IPC server.`;
|
|
57088
57097
|
// stop accepting new connections
|
|
57089
57098
|
server.close();
|
|
57090
57099
|
// abort the server
|
|
@@ -57229,7 +57238,7 @@ class JamnpIpcHandler {
|
|
|
57229
57238
|
// decode the message as `StreamEnvelope`
|
|
57230
57239
|
const envelope = decoder_Decoder.decodeObject(StreamEnvelope.Codec, msg);
|
|
57231
57240
|
const streamId = envelope.streamId;
|
|
57232
|
-
jamnp_handler_logger.log
|
|
57241
|
+
jamnp_handler_logger.log `[${streamId}] incoming message: ${envelope.type} ${envelope.data}`;
|
|
57233
57242
|
// check if this is a already known stream id
|
|
57234
57243
|
const streamHandler = this.streams.get(streamId);
|
|
57235
57244
|
const streamSender = new EnvelopeSender(streamId, this.sender);
|
|
@@ -57237,13 +57246,13 @@ class JamnpIpcHandler {
|
|
|
57237
57246
|
if (streamHandler === undefined) {
|
|
57238
57247
|
// closing or message of unknown stream - ignore.
|
|
57239
57248
|
if (envelope.type !== StreamEnvelopeType.Open) {
|
|
57240
|
-
jamnp_handler_logger.warn
|
|
57249
|
+
jamnp_handler_logger.warn `[${streamId}] (unknown) got invalid type ${envelope.type}.`;
|
|
57241
57250
|
return;
|
|
57242
57251
|
}
|
|
57243
57252
|
const newStream = decoder_Decoder.decodeObject(NewStream.Codec, envelope.data);
|
|
57244
57253
|
const handler = this.streamHandlers.get(newStream.streamByte);
|
|
57245
57254
|
if (handler !== undefined) {
|
|
57246
|
-
jamnp_handler_logger.log
|
|
57255
|
+
jamnp_handler_logger.log `[${streamId}] new stream for ${handler.kind}`;
|
|
57247
57256
|
// insert the stream
|
|
57248
57257
|
this.streams.set(streamId, handler);
|
|
57249
57258
|
// Just send back the same stream byte.
|
|
@@ -57264,7 +57273,7 @@ class JamnpIpcHandler {
|
|
|
57264
57273
|
if (envelope.type !== StreamEnvelopeType.Msg) {
|
|
57265
57274
|
// display a warning but only if the stream was not pending for confirmation.
|
|
57266
57275
|
if (!this.pendingStreams.delete(streamId)) {
|
|
57267
|
-
jamnp_handler_logger.warn
|
|
57276
|
+
jamnp_handler_logger.warn `[${streamId}] got invalid type ${envelope.type}.`;
|
|
57268
57277
|
}
|
|
57269
57278
|
return;
|
|
57270
57279
|
}
|
|
@@ -57273,7 +57282,7 @@ class JamnpIpcHandler {
|
|
|
57273
57282
|
}
|
|
57274
57283
|
/** Notify about termination of the underlying socket. */
|
|
57275
57284
|
onClose({ error }) {
|
|
57276
|
-
jamnp_handler_logger.log
|
|
57285
|
+
jamnp_handler_logger.log `Closing the handler. Reason: ${error !== undefined ? error.message : "close"}.`;
|
|
57277
57286
|
// Socket closed - we should probably clear everything.
|
|
57278
57287
|
for (const [streamId, handler] of this.streams.entries()) {
|
|
57279
57288
|
handler.onClose(streamId, error === undefined);
|
|
@@ -57290,7 +57299,7 @@ class JamnpIpcHandler {
|
|
|
57290
57299
|
}
|
|
57291
57300
|
/** Wait for the handler to be finished either via close or error. */
|
|
57292
57301
|
waitForEnd() {
|
|
57293
|
-
jamnp_handler_logger.log
|
|
57302
|
+
jamnp_handler_logger.log `Waiting for the handler to be closed.`;
|
|
57294
57303
|
return this.onEnd.listen;
|
|
57295
57304
|
}
|
|
57296
57305
|
}
|
|
@@ -57419,7 +57428,7 @@ class FuzzHandler {
|
|
|
57419
57428
|
async getSerializedState(value) {
|
|
57420
57429
|
const state = await this.api.getPostSerializedState(value);
|
|
57421
57430
|
if (state === null) {
|
|
57422
|
-
ipc_logger.warn
|
|
57431
|
+
ipc_logger.warn `Fuzzer requested non-existing state for: ${value}`;
|
|
57423
57432
|
return [];
|
|
57424
57433
|
}
|
|
57425
57434
|
return Array.from(state).map(([key, value]) => {
|
|
@@ -57445,7 +57454,7 @@ class FuzzHandler {
|
|
|
57445
57454
|
if (res.isOk) {
|
|
57446
57455
|
return res;
|
|
57447
57456
|
}
|
|
57448
|
-
ipc_logger.log
|
|
57457
|
+
ipc_logger.log `Rejecting block with error: ${res.error}. ${res.details}`;
|
|
57449
57458
|
return result_Result.error(ErrorMessage.create({ message: res.error }));
|
|
57450
57459
|
}
|
|
57451
57460
|
async importBlockV0(value) {
|
|
@@ -57453,11 +57462,11 @@ class FuzzHandler {
|
|
|
57453
57462
|
if (res.isOk) {
|
|
57454
57463
|
return res.ok;
|
|
57455
57464
|
}
|
|
57456
|
-
ipc_logger.warn
|
|
57465
|
+
ipc_logger.warn `Fuzzer sent incorrect block with error ${res.error}. ${res.details}`;
|
|
57457
57466
|
return this.api.getBestStateRootHash();
|
|
57458
57467
|
}
|
|
57459
57468
|
async getPeerInfo(value) {
|
|
57460
|
-
ipc_logger.info
|
|
57469
|
+
ipc_logger.info `Fuzzer ${value} connected.`;
|
|
57461
57470
|
return types_PeerInfo.create({
|
|
57462
57471
|
name: this.api.nodeName,
|
|
57463
57472
|
appVersion: this.api.nodeVersion,
|
|
@@ -57468,7 +57477,7 @@ class FuzzHandler {
|
|
|
57468
57477
|
});
|
|
57469
57478
|
}
|
|
57470
57479
|
async getPeerInfoV0(value) {
|
|
57471
|
-
ipc_logger.info
|
|
57480
|
+
ipc_logger.info `Fuzzer ${value} connected.`;
|
|
57472
57481
|
return PeerInfo.create({
|
|
57473
57482
|
name: this.api.nodeName,
|
|
57474
57483
|
appVersion: this.api.nodeVersion,
|
|
@@ -57501,7 +57510,7 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
|
|
|
57501
57510
|
Logger.configureAll(process.env.JAM_LOG ?? "", Level.LOG);
|
|
57502
57511
|
const machine = networkStateMachine();
|
|
57503
57512
|
const channel = MessageChannelStateMachine.receiveChannel(machine, external_node_worker_threads_namespaceObject.parentPort);
|
|
57504
|
-
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}`);
|
|
57505
57514
|
}
|
|
57506
57515
|
/**
|
|
57507
57516
|
* JAM networking worker.
|
|
@@ -57512,7 +57521,7 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
|
|
|
57512
57521
|
*/
|
|
57513
57522
|
async function jam_network_main(channel) {
|
|
57514
57523
|
await initAll();
|
|
57515
|
-
jam_network_logger.trace
|
|
57524
|
+
jam_network_logger.trace `🛜 Network starting ${channel.currentState()}`;
|
|
57516
57525
|
// Await the configuration object
|
|
57517
57526
|
// TODO [ToDr] The whole state machine needs to die.
|
|
57518
57527
|
const ready = channel.currentState().stateName !== "ready(network)"
|
|
@@ -57523,7 +57532,7 @@ async function jam_network_main(channel) {
|
|
|
57523
57532
|
const key = await ed25519_privateKey(config.key);
|
|
57524
57533
|
const lmdb = new LmdbRoot(config.genericConfig.dbPath);
|
|
57525
57534
|
const blocks = new LmdbBlocks(config.genericConfig.chainSpec, lmdb);
|
|
57526
|
-
jam_network_logger.info
|
|
57535
|
+
jam_network_logger.info `🛜 Listening at ${config.host}:${config.port}`;
|
|
57527
57536
|
const network = await setup({
|
|
57528
57537
|
host: config.host,
|
|
57529
57538
|
port: config.port,
|
|
@@ -57536,7 +57545,7 @@ async function jam_network_main(channel) {
|
|
|
57536
57545
|
ready.waitForState("finished").then(() => network.network.stop());
|
|
57537
57546
|
await network.network.start();
|
|
57538
57547
|
});
|
|
57539
|
-
jam_network_logger.info
|
|
57548
|
+
jam_network_logger.info `🛜 Network worker finished. Closing channel.`;
|
|
57540
57549
|
// Close the comms to gracefuly close the app.
|
|
57541
57550
|
finished.currentState().close(channel);
|
|
57542
57551
|
}
|
|
@@ -57582,8 +57591,8 @@ async function main_main(config, withRelPath) {
|
|
|
57582
57591
|
throw new Error("The main binary cannot be running as a Worker!");
|
|
57583
57592
|
}
|
|
57584
57593
|
await initAll();
|
|
57585
|
-
common_logger.info
|
|
57586
|
-
common_logger.info
|
|
57594
|
+
common_logger.info `🫐 Typeberry ${package_namespaceObject.rE}. GP: ${CURRENT_VERSION} (${CURRENT_SUITE})`;
|
|
57595
|
+
common_logger.info `🎸 Starting node: ${config.nodeName}.`;
|
|
57587
57596
|
const chainSpec = getChainSpec(config.node.flavor);
|
|
57588
57597
|
const { rootDb, dbPath, genesisHeaderHash } = openDatabase(config.nodeName, config.node.chainSpec.genesisHeader, withRelPath(config.node.databaseBasePath));
|
|
57589
57598
|
// Initialize the database with genesis state and block if there isn't one.
|
|
@@ -57626,30 +57635,30 @@ async function main_main(config, withRelPath) {
|
|
|
57626
57635
|
return importer.finish(port);
|
|
57627
57636
|
});
|
|
57628
57637
|
await importerFinished.currentState().waitForWorkerToFinish();
|
|
57629
|
-
common_logger.log
|
|
57638
|
+
common_logger.log `[main] ☠️ Closing the extensions`;
|
|
57630
57639
|
closeExtensions();
|
|
57631
|
-
common_logger.log
|
|
57640
|
+
common_logger.log `[main] ☠️ Closing the authorship module`;
|
|
57632
57641
|
closeAuthorship();
|
|
57633
|
-
common_logger.log
|
|
57642
|
+
common_logger.log `[main] ☠️ Closing the networking module`;
|
|
57634
57643
|
closeNetwork();
|
|
57635
|
-
common_logger.log
|
|
57644
|
+
common_logger.log `[main] 🛢️ Closing the database`;
|
|
57636
57645
|
await rootDb.close();
|
|
57637
|
-
common_logger.info
|
|
57646
|
+
common_logger.info `[main] ✅ Done.`;
|
|
57638
57647
|
},
|
|
57639
57648
|
};
|
|
57640
57649
|
return api;
|
|
57641
57650
|
}
|
|
57642
57651
|
const initAuthorship = async (importerReady, isAuthoring, config) => {
|
|
57643
57652
|
if (!isAuthoring) {
|
|
57644
|
-
common_logger.log
|
|
57653
|
+
common_logger.log `✍️ Authorship off: disabled`;
|
|
57645
57654
|
return () => Promise.resolve();
|
|
57646
57655
|
}
|
|
57647
|
-
common_logger.info
|
|
57656
|
+
common_logger.info `✍️ Starting block generator.`;
|
|
57648
57657
|
const { generator, finish } = await startBlockGenerator(config);
|
|
57649
57658
|
// relay blocks from generator to importer
|
|
57650
57659
|
importerReady.doUntil("finished", async (importer, port) => {
|
|
57651
57660
|
generator.currentState().onBlock.on((b) => {
|
|
57652
|
-
common_logger.log
|
|
57661
|
+
common_logger.log `✍️ Produced block. Size: [${b.length}]`;
|
|
57653
57662
|
importer.sendBlock(port, b);
|
|
57654
57663
|
});
|
|
57655
57664
|
});
|
|
@@ -57657,7 +57666,7 @@ const initAuthorship = async (importerReady, isAuthoring, config) => {
|
|
|
57657
57666
|
};
|
|
57658
57667
|
const initNetwork = async (importerReady, workerConfig, genesisHeaderHash, networkConfig, bestHeader) => {
|
|
57659
57668
|
if (networkConfig === null) {
|
|
57660
|
-
common_logger.log
|
|
57669
|
+
common_logger.log `🛜 Networking off: no config`;
|
|
57661
57670
|
return () => Promise.resolve();
|
|
57662
57671
|
}
|
|
57663
57672
|
const { key, host, port, bootnodes } = networkConfig;
|
|
@@ -59607,7 +59616,7 @@ class AccumulateExternalities {
|
|
|
59607
59616
|
/** https://graypaper.fluffylabs.dev/#/7e6ff6a/362802362d02?v=0.6.7 */
|
|
59608
59617
|
const validatorsManager = this.updatedState.getPrivilegedServices().validatorsManager;
|
|
59609
59618
|
if (validatorsManager !== this.currentServiceId) {
|
|
59610
|
-
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`;
|
|
59611
59620
|
return result_Result.error(UnprivilegedError);
|
|
59612
59621
|
}
|
|
59613
59622
|
this.updatedState.stateUpdate.validatorsData = validatorsData;
|
|
@@ -59622,11 +59631,11 @@ class AccumulateExternalities {
|
|
|
59622
59631
|
// NOTE `coreIndex` is already verified in the HC, so this is infallible.
|
|
59623
59632
|
const currentAuthManager = this.updatedState.getPrivilegedServices().authManager[coreIndex];
|
|
59624
59633
|
if (currentAuthManager !== this.currentServiceId) {
|
|
59625
|
-
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`;
|
|
59626
59635
|
return result_Result.error(UpdatePrivilegesError.UnprivilegedService);
|
|
59627
59636
|
}
|
|
59628
59637
|
if (authManager === null && Compatibility.isGreaterOrEqual(GpVersion.V0_7_1)) {
|
|
59629
|
-
accumulate_externalities_logger.trace
|
|
59638
|
+
accumulate_externalities_logger.trace `The new auth manager is not a valid service id. Ignoring`;
|
|
59630
59639
|
return result_Result.error(UpdatePrivilegesError.InvalidServiceId);
|
|
59631
59640
|
}
|
|
59632
59641
|
this.updatedState.stateUpdate.authorizationQueues.set(coreIndex, authQueue);
|
|
@@ -60507,7 +60516,7 @@ class Assign {
|
|
|
60507
60516
|
const memoryReadResult = memory.loadInto(res, authorizationQueueStart);
|
|
60508
60517
|
// error while reading the memory.
|
|
60509
60518
|
if (memoryReadResult.isError) {
|
|
60510
|
-
logger_logger.trace
|
|
60519
|
+
logger_logger.trace `ASSIGN() <- PANIC`;
|
|
60511
60520
|
return PvmExecution.Panic;
|
|
60512
60521
|
}
|
|
60513
60522
|
if (maybeCoreIndex >= this.chainSpec.coresCount) {
|
|
@@ -60522,18 +60531,18 @@ class Assign {
|
|
|
60522
60531
|
const result = this.partialState.updateAuthorizationQueue(coreIndex, fixedSizeAuthQueue, authManager);
|
|
60523
60532
|
if (result.isOk) {
|
|
60524
60533
|
regs.set(IN_OUT_REG, HostCallResult.OK);
|
|
60525
|
-
logger_logger.trace
|
|
60534
|
+
logger_logger.trace `ASSIGN(${coreIndex}, ${fixedSizeAuthQueue}) <- OK`;
|
|
60526
60535
|
return;
|
|
60527
60536
|
}
|
|
60528
60537
|
const e = result.error;
|
|
60529
60538
|
if (e === UpdatePrivilegesError.UnprivilegedService) {
|
|
60530
60539
|
regs.set(IN_OUT_REG, HostCallResult.HUH);
|
|
60531
|
-
logger_logger.trace
|
|
60540
|
+
logger_logger.trace `ASSIGN(${coreIndex}, ${fixedSizeAuthQueue}) <- HUH`;
|
|
60532
60541
|
return;
|
|
60533
60542
|
}
|
|
60534
60543
|
if (e === UpdatePrivilegesError.InvalidServiceId) {
|
|
60535
60544
|
regs.set(IN_OUT_REG, HostCallResult.WHO);
|
|
60536
|
-
logger_logger.trace
|
|
60545
|
+
logger_logger.trace `ASSIGN(${coreIndex}, ${fixedSizeAuthQueue}) <- HUH`;
|
|
60537
60546
|
return;
|
|
60538
60547
|
}
|
|
60539
60548
|
debug_assertNever(e);
|
|
@@ -60599,7 +60608,7 @@ class Bless {
|
|
|
60599
60608
|
decoder.resetTo(0);
|
|
60600
60609
|
const memoryReadResult = memory.loadInto(result, memIndex);
|
|
60601
60610
|
if (memoryReadResult.isError) {
|
|
60602
|
-
logger_logger.trace
|
|
60611
|
+
logger_logger.trace `BLESS(${manager}, ${validator}) <- PANIC`;
|
|
60603
60612
|
return PvmExecution.Panic;
|
|
60604
60613
|
}
|
|
60605
60614
|
const { serviceId, gas } = decoder.object(serviceIdAndGasCodec);
|
|
@@ -60612,24 +60621,24 @@ class Bless {
|
|
|
60612
60621
|
const authorizersDecoder = decoder_Decoder.fromBlob(res);
|
|
60613
60622
|
const memoryReadResult = memory.loadInto(res, authorization);
|
|
60614
60623
|
if (memoryReadResult.isError) {
|
|
60615
|
-
logger_logger.trace
|
|
60624
|
+
logger_logger.trace `BLESS(${manager}, ${validator}, ${autoAccumulateEntries}) <- PANIC`;
|
|
60616
60625
|
return PvmExecution.Panic;
|
|
60617
60626
|
}
|
|
60618
60627
|
const authorizers = tryAsPerCore(authorizersDecoder.sequenceFixLen(descriptors_codec.u32.asOpaque(), this.chainSpec.coresCount), this.chainSpec);
|
|
60619
60628
|
const updateResult = this.partialState.updatePrivilegedServices(manager, authorizers, validator, autoAccumulateEntries);
|
|
60620
60629
|
if (updateResult.isOk) {
|
|
60621
|
-
logger_logger.trace
|
|
60630
|
+
logger_logger.trace `BLESS(${manager}, ${authorizers}, ${validator}, ${autoAccumulateEntries}) <- OK`;
|
|
60622
60631
|
regs.set(bless_IN_OUT_REG, HostCallResult.OK);
|
|
60623
60632
|
return;
|
|
60624
60633
|
}
|
|
60625
60634
|
const e = updateResult.error;
|
|
60626
60635
|
if (e === UpdatePrivilegesError.UnprivilegedService) {
|
|
60627
|
-
logger_logger.trace
|
|
60636
|
+
logger_logger.trace `BLESS(${manager}, ${authorizers}, ${validator}, ${autoAccumulateEntries}) <- HUH`;
|
|
60628
60637
|
regs.set(bless_IN_OUT_REG, HostCallResult.HUH);
|
|
60629
60638
|
return;
|
|
60630
60639
|
}
|
|
60631
60640
|
if (e === UpdatePrivilegesError.InvalidServiceId) {
|
|
60632
|
-
logger_logger.trace
|
|
60641
|
+
logger_logger.trace `BLESS(${manager}, ${authorizers}, ${validator}, ${autoAccumulateEntries}) <- WHO`;
|
|
60633
60642
|
regs.set(bless_IN_OUT_REG, HostCallResult.WHO);
|
|
60634
60643
|
return;
|
|
60635
60644
|
}
|
|
@@ -60659,7 +60668,7 @@ class GasHostCall {
|
|
|
60659
60668
|
}
|
|
60660
60669
|
execute(gas, regs) {
|
|
60661
60670
|
const gasValue = gas.get();
|
|
60662
|
-
logger_logger.trace
|
|
60671
|
+
logger_logger.trace `GAS <- ${gasValue}`;
|
|
60663
60672
|
regs.set(7, numbers_tryAsU64(gasValue));
|
|
60664
60673
|
return Promise.resolve(undefined);
|
|
60665
60674
|
}
|
|
@@ -60691,7 +60700,7 @@ class Checkpoint {
|
|
|
60691
60700
|
async execute(gas, regs) {
|
|
60692
60701
|
await this.gasHostCall.execute(gas, regs);
|
|
60693
60702
|
this.partialState.checkpoint();
|
|
60694
|
-
logger_logger.trace
|
|
60703
|
+
logger_logger.trace `CHECKPOINT()`;
|
|
60695
60704
|
return;
|
|
60696
60705
|
}
|
|
60697
60706
|
}
|
|
@@ -60730,18 +60739,18 @@ class Designate {
|
|
|
60730
60739
|
const memoryReadResult = memory.loadInto(res, validatorsStart);
|
|
60731
60740
|
// error while reading the memory.
|
|
60732
60741
|
if (memoryReadResult.isError) {
|
|
60733
|
-
logger_logger.trace
|
|
60742
|
+
logger_logger.trace `DESIGNATE() <- PANIC`;
|
|
60734
60743
|
return PvmExecution.Panic;
|
|
60735
60744
|
}
|
|
60736
60745
|
const decoder = decoder_Decoder.fromBlob(res);
|
|
60737
60746
|
const validatorsData = decoder.sequenceFixLen(ValidatorData.Codec, this.chainSpec.validatorsCount);
|
|
60738
60747
|
const result = this.partialState.updateValidatorsData(tryAsPerValidator(validatorsData, this.chainSpec));
|
|
60739
60748
|
if (result.isError) {
|
|
60740
|
-
logger_logger.trace
|
|
60749
|
+
logger_logger.trace `DESIGNATE([${validatorsData[0]}, ${validatorsData[1]}, ...]) <- HUH`;
|
|
60741
60750
|
regs.set(designate_IN_OUT_REG, HostCallResult.HUH);
|
|
60742
60751
|
}
|
|
60743
60752
|
else {
|
|
60744
|
-
logger_logger.trace
|
|
60753
|
+
logger_logger.trace `DESIGNATE([${validatorsData[0]}, ${validatorsData[1]}, ...]) <- OK`;
|
|
60745
60754
|
regs.set(designate_IN_OUT_REG, HostCallResult.OK);
|
|
60746
60755
|
}
|
|
60747
60756
|
}
|
|
@@ -60782,17 +60791,17 @@ class Eject {
|
|
|
60782
60791
|
const previousCodeHash = bytes_Bytes.zero(hash_HASH_SIZE).asOpaque();
|
|
60783
60792
|
const memoryReadResult = memory.loadInto(previousCodeHash.raw, preimageHashStart);
|
|
60784
60793
|
if (memoryReadResult.isError) {
|
|
60785
|
-
logger_logger.trace
|
|
60794
|
+
logger_logger.trace `EJECT(${serviceId}) <- PANIC`;
|
|
60786
60795
|
return PvmExecution.Panic;
|
|
60787
60796
|
}
|
|
60788
60797
|
// cannot eject self
|
|
60789
60798
|
if (serviceId === this.currentServiceId) {
|
|
60790
60799
|
regs.set(eject_IN_OUT_REG, HostCallResult.WHO);
|
|
60791
|
-
logger_logger.trace
|
|
60800
|
+
logger_logger.trace `EJECT(${serviceId}, ${previousCodeHash}) <- WHO`;
|
|
60792
60801
|
return;
|
|
60793
60802
|
}
|
|
60794
60803
|
const result = this.partialState.eject(serviceId, previousCodeHash);
|
|
60795
|
-
logger_logger.trace
|
|
60804
|
+
logger_logger.trace `EJECT(${serviceId}, ${previousCodeHash}) <- ${resultToString(result)}`;
|
|
60796
60805
|
// All good!
|
|
60797
60806
|
if (result.isOk) {
|
|
60798
60807
|
regs.set(eject_IN_OUT_REG, HostCallResult.OK);
|
|
@@ -60844,11 +60853,11 @@ class Forget {
|
|
|
60844
60853
|
const memoryReadResult = memory.loadInto(hash.raw, hashStart);
|
|
60845
60854
|
// error while reading the memory.
|
|
60846
60855
|
if (memoryReadResult.isError) {
|
|
60847
|
-
logger_logger.trace
|
|
60856
|
+
logger_logger.trace `FORGET(${hash}, ${length}) <- PANIC`;
|
|
60848
60857
|
return PvmExecution.Panic;
|
|
60849
60858
|
}
|
|
60850
60859
|
const result = this.partialState.forgetPreimage(hash.asOpaque(), length);
|
|
60851
|
-
logger_logger.trace
|
|
60860
|
+
logger_logger.trace `FORGET(${hash}, ${length}) <- ${resultToString(result)}`;
|
|
60852
60861
|
if (result.isOk) {
|
|
60853
60862
|
regs.set(forget_IN_OUT_REG, HostCallResult.OK);
|
|
60854
60863
|
}
|
|
@@ -60901,11 +60910,11 @@ class New {
|
|
|
60901
60910
|
const memoryReadResult = memory.loadInto(codeHash.raw, codeHashStart);
|
|
60902
60911
|
// error while reading the memory.
|
|
60903
60912
|
if (memoryReadResult.isError) {
|
|
60904
|
-
logger_logger.trace
|
|
60913
|
+
logger_logger.trace `NEW(${codeHash}, ${codeLength}, ${gas}, ${allowance}, ${gratisStorage}) <- PANIC`;
|
|
60905
60914
|
return PvmExecution.Panic;
|
|
60906
60915
|
}
|
|
60907
60916
|
const assignedId = this.partialState.newService(codeHash.asOpaque(), codeLength, gas, allowance, gratisStorage);
|
|
60908
|
-
logger_logger.trace
|
|
60917
|
+
logger_logger.trace `NEW(${codeHash}, ${codeLength}, ${gas}, ${allowance}, ${gratisStorage}) <- ${resultToString(assignedId)}`;
|
|
60909
60918
|
if (assignedId.isOk) {
|
|
60910
60919
|
regs.set(new_IN_OUT_REG, numbers_tryAsU64(assignedId.ok));
|
|
60911
60920
|
return;
|
|
@@ -60960,11 +60969,11 @@ class Provide {
|
|
|
60960
60969
|
const preimage = bytes_BytesBlob.blobFrom(new Uint8Array(length));
|
|
60961
60970
|
const memoryReadResult = memory.loadInto(preimage.raw, preimageStart);
|
|
60962
60971
|
if (memoryReadResult.isError) {
|
|
60963
|
-
logger_logger.trace
|
|
60972
|
+
logger_logger.trace `PROVIDE(${serviceId}, ${preimage.toStringTruncated()}) <- PANIC`;
|
|
60964
60973
|
return PvmExecution.Panic;
|
|
60965
60974
|
}
|
|
60966
60975
|
const result = this.partialState.providePreimage(serviceId, preimage);
|
|
60967
|
-
logger_logger.trace
|
|
60976
|
+
logger_logger.trace `PROVIDE(${serviceId}, ${preimage.toStringTruncated()}) <- ${resultToString(result)}`;
|
|
60968
60977
|
if (result.isOk) {
|
|
60969
60978
|
regs.set(provide_IN_OUT_REG, HostCallResult.OK);
|
|
60970
60979
|
return;
|
|
@@ -61018,11 +61027,11 @@ class Query {
|
|
|
61018
61027
|
const memoryReadResult = memory.loadInto(hash.raw, hashStart);
|
|
61019
61028
|
// error while reading the memory.
|
|
61020
61029
|
if (memoryReadResult.isError) {
|
|
61021
|
-
logger_logger.trace
|
|
61030
|
+
logger_logger.trace `QUERY(${hash}, ${length}) <- PANIC`;
|
|
61022
61031
|
return PvmExecution.Panic;
|
|
61023
61032
|
}
|
|
61024
61033
|
const result = this.partialState.checkPreimageStatus(hash.asOpaque(), length);
|
|
61025
|
-
logger_logger.trace
|
|
61034
|
+
logger_logger.trace `QUERY(${hash}, ${length}) <- ${result}`;
|
|
61026
61035
|
const zero = numbers_tryAsU64(0n);
|
|
61027
61036
|
if (result === null) {
|
|
61028
61037
|
regs.set(IN_OUT_REG_1, HostCallResult.NONE);
|
|
@@ -61083,11 +61092,11 @@ class Solicit {
|
|
|
61083
61092
|
const hash = bytes_Bytes.zero(hash_HASH_SIZE);
|
|
61084
61093
|
const memoryReadResult = memory.loadInto(hash.raw, hashStart);
|
|
61085
61094
|
if (memoryReadResult.isError) {
|
|
61086
|
-
logger_logger.trace
|
|
61095
|
+
logger_logger.trace `SOLICIT(${hash}, ${length}) <- PANIC`;
|
|
61087
61096
|
return PvmExecution.Panic;
|
|
61088
61097
|
}
|
|
61089
61098
|
const result = this.partialState.requestPreimage(hash.asOpaque(), length);
|
|
61090
|
-
logger_logger.trace
|
|
61099
|
+
logger_logger.trace `SOLICIT(${hash}, ${length}) <- ${resultToString(result)}`;
|
|
61091
61100
|
if (result.isOk) {
|
|
61092
61101
|
regs.set(solicit_IN_OUT_REG, HostCallResult.OK);
|
|
61093
61102
|
return;
|
|
@@ -61159,11 +61168,11 @@ class Transfer {
|
|
|
61159
61168
|
const memoryReadResult = memory.loadInto(memo.raw, memoStart);
|
|
61160
61169
|
// page fault while reading the memory.
|
|
61161
61170
|
if (memoryReadResult.isError) {
|
|
61162
|
-
logger_logger.trace
|
|
61171
|
+
logger_logger.trace `TRANSFER(${destination}, ${amount}, ${onTransferGas}, ${memo}) <- PANIC`;
|
|
61163
61172
|
return PvmExecution.Panic;
|
|
61164
61173
|
}
|
|
61165
61174
|
const transferResult = this.partialState.transfer(destination, amount, onTransferGas, memo);
|
|
61166
|
-
logger_logger.trace
|
|
61175
|
+
logger_logger.trace `TRANSFER(${destination}, ${amount}, ${onTransferGas}, ${memo}) <- ${resultToString(transferResult)}`;
|
|
61167
61176
|
// All good!
|
|
61168
61177
|
if (transferResult.isOk) {
|
|
61169
61178
|
regs.set(transfer_IN_OUT_REG, HostCallResult.OK);
|
|
@@ -61222,11 +61231,11 @@ class Upgrade {
|
|
|
61222
61231
|
const codeHash = bytes_Bytes.zero(hash_HASH_SIZE);
|
|
61223
61232
|
const memoryReadResult = memory.loadInto(codeHash.raw, codeHashStart);
|
|
61224
61233
|
if (memoryReadResult.isError) {
|
|
61225
|
-
logger_logger.trace
|
|
61234
|
+
logger_logger.trace `UPGRADE(${codeHash}, ${gas}, ${allowance}) <- PANIC`;
|
|
61226
61235
|
return PvmExecution.Panic;
|
|
61227
61236
|
}
|
|
61228
61237
|
this.partialState.upgradeService(codeHash.asOpaque(), gas, allowance);
|
|
61229
|
-
logger_logger.trace
|
|
61238
|
+
logger_logger.trace `UPGRADE(${codeHash}, ${gas}, ${allowance})`;
|
|
61230
61239
|
regs.set(upgrade_IN_OUT_REG, HostCallResult.OK);
|
|
61231
61240
|
}
|
|
61232
61241
|
}
|
|
@@ -61260,11 +61269,11 @@ class Yield {
|
|
|
61260
61269
|
const hash = bytes_Bytes.zero(hash_HASH_SIZE);
|
|
61261
61270
|
const memoryReadResult = memory.loadInto(hash.raw, hashStart);
|
|
61262
61271
|
if (memoryReadResult.isError) {
|
|
61263
|
-
logger_logger.trace
|
|
61272
|
+
logger_logger.trace `YIELD() <- PANIC`;
|
|
61264
61273
|
return PvmExecution.Panic;
|
|
61265
61274
|
}
|
|
61266
61275
|
this.partialState.yield(hash);
|
|
61267
|
-
logger_logger.trace
|
|
61276
|
+
logger_logger.trace `YIELD(${hash})`;
|
|
61268
61277
|
regs.set(yield_IN_OUT_REG, HostCallResult.OK);
|
|
61269
61278
|
}
|
|
61270
61279
|
}
|
|
@@ -61306,10 +61315,10 @@ class Fetch {
|
|
|
61306
61315
|
const chunk = value === null ? new Uint8Array() : value.raw.subarray(Number(offset), Number(offset + length));
|
|
61307
61316
|
const storeResult = memory.storeFrom(output, chunk);
|
|
61308
61317
|
if (storeResult.isError) {
|
|
61309
|
-
logger_logger.trace
|
|
61318
|
+
logger_logger.trace `FETCH(${kind}) <- PANIC`;
|
|
61310
61319
|
return PvmExecution.Panic;
|
|
61311
61320
|
}
|
|
61312
|
-
logger_logger.trace
|
|
61321
|
+
logger_logger.trace `FETCH(${kind}) <- ${value?.toStringTruncated()}`;
|
|
61313
61322
|
// write result
|
|
61314
61323
|
regs.set(fetch_IN_OUT_REG, value === null ? HostCallResult.NONE : valueLength);
|
|
61315
61324
|
}
|
|
@@ -61468,10 +61477,10 @@ class Info {
|
|
|
61468
61477
|
const chunk = encodedInfo.raw.subarray(Number(offset), Number(offset + length));
|
|
61469
61478
|
const writeResult = memory.storeFrom(outputStart, chunk);
|
|
61470
61479
|
if (writeResult.isError) {
|
|
61471
|
-
logger_logger.trace
|
|
61480
|
+
logger_logger.trace `INFO(${serviceId}) <- PANIC`;
|
|
61472
61481
|
return PvmExecution.Panic;
|
|
61473
61482
|
}
|
|
61474
|
-
logger_logger.trace
|
|
61483
|
+
logger_logger.trace `INFO(${serviceId}) <- ${bytes_BytesBlob.blobFrom(chunk)}`;
|
|
61475
61484
|
if (accountInfo === null) {
|
|
61476
61485
|
regs.set(info_IN_OUT_REG, HostCallResult.NONE);
|
|
61477
61486
|
return;
|
|
@@ -61532,7 +61541,7 @@ class LogHostCall {
|
|
|
61532
61541
|
memory.loadInto(target, targetStart);
|
|
61533
61542
|
}
|
|
61534
61543
|
memory.loadInto(message, msgStart);
|
|
61535
|
-
logger_logger.trace
|
|
61544
|
+
logger_logger.trace `SERVICE [${this.currentServiceId}] [${lvl}] ${decoder.decode(target)} ${decoder.decode(message)}`;
|
|
61536
61545
|
return Promise.resolve(undefined);
|
|
61537
61546
|
}
|
|
61538
61547
|
}
|
|
@@ -61572,12 +61581,12 @@ class Lookup {
|
|
|
61572
61581
|
const preImageHash = bytes_Bytes.zero(hash_HASH_SIZE);
|
|
61573
61582
|
const memoryReadResult = memory.loadInto(preImageHash.raw, hashAddress);
|
|
61574
61583
|
if (memoryReadResult.isError) {
|
|
61575
|
-
logger_logger.trace
|
|
61584
|
+
logger_logger.trace `LOOKUP(${serviceId}, ${preImageHash}) <- PANIC`;
|
|
61576
61585
|
return PvmExecution.Panic;
|
|
61577
61586
|
}
|
|
61578
61587
|
// v
|
|
61579
61588
|
const preImage = this.account.lookup(serviceId, preImageHash);
|
|
61580
|
-
logger_logger.trace
|
|
61589
|
+
logger_logger.trace `LOOKUP(${serviceId}, ${preImageHash}) <- ${preImage?.toStringTruncated()}...`;
|
|
61581
61590
|
const preImageLength = preImage === null ? numbers_tryAsU64(0) : numbers_tryAsU64(preImage.raw.length);
|
|
61582
61591
|
const preimageBlobOffset = regs.get(10);
|
|
61583
61592
|
const lengthToWrite = regs.get(11);
|
|
@@ -61639,7 +61648,7 @@ class Read {
|
|
|
61639
61648
|
const rawKey = bytes_BytesBlob.blobFrom(new Uint8Array(storageKeyLengthClamped));
|
|
61640
61649
|
const memoryReadResult = memory.loadInto(rawKey.raw, storageKeyStartAddress);
|
|
61641
61650
|
if (memoryReadResult.isError) {
|
|
61642
|
-
logger_logger.trace
|
|
61651
|
+
logger_logger.trace `READ(${serviceId}, ${rawKey}) <- PANIC`;
|
|
61643
61652
|
return PvmExecution.Panic;
|
|
61644
61653
|
}
|
|
61645
61654
|
// v
|
|
@@ -61657,15 +61666,15 @@ class Read {
|
|
|
61657
61666
|
const chunk = value === null ? new Uint8Array(0) : value.raw.subarray(Number(offset), Number(offset + blobLength));
|
|
61658
61667
|
const memoryWriteResult = memory.storeFrom(destinationAddress, chunk);
|
|
61659
61668
|
if (memoryWriteResult.isError) {
|
|
61660
|
-
logger_logger.trace
|
|
61669
|
+
logger_logger.trace `READ(${serviceId}, ${rawKey}) <- PANIC`;
|
|
61661
61670
|
return PvmExecution.Panic;
|
|
61662
61671
|
}
|
|
61663
61672
|
if (value === null) {
|
|
61664
|
-
logger_logger.trace
|
|
61673
|
+
logger_logger.trace `READ(${serviceId}, ${rawKey}) <- NONE`;
|
|
61665
61674
|
regs.set(read_IN_OUT_REG, HostCallResult.NONE);
|
|
61666
61675
|
return;
|
|
61667
61676
|
}
|
|
61668
|
-
logger_logger.trace
|
|
61677
|
+
logger_logger.trace `READ(${serviceId}, ${rawKey}) <- ${bytes_BytesBlob.blobFrom(chunk).toStringTruncated()}`;
|
|
61669
61678
|
regs.set(read_IN_OUT_REG, valueLength);
|
|
61670
61679
|
}
|
|
61671
61680
|
}
|
|
@@ -61708,7 +61717,7 @@ class Write {
|
|
|
61708
61717
|
const rawStorageKey = new Uint8Array(storageKeyLengthClamped);
|
|
61709
61718
|
const keyLoadingResult = memory.loadInto(rawStorageKey, storageKeyStartAddress);
|
|
61710
61719
|
if (keyLoadingResult.isError) {
|
|
61711
|
-
logger_logger.trace
|
|
61720
|
+
logger_logger.trace `WRITE() <- PANIC`;
|
|
61712
61721
|
return PvmExecution.Panic;
|
|
61713
61722
|
}
|
|
61714
61723
|
// k
|
|
@@ -61718,14 +61727,14 @@ class Write {
|
|
|
61718
61727
|
const valueLoadingResult = memory.loadInto(value, valueStart);
|
|
61719
61728
|
// Note [MaSo] this is ok to return bcs if valueLength is 0, then this panic won't happen
|
|
61720
61729
|
if (valueLoadingResult.isError) {
|
|
61721
|
-
logger_logger.trace
|
|
61730
|
+
logger_logger.trace `WRITE(${storageKey}) <- PANIC`;
|
|
61722
61731
|
return PvmExecution.Panic;
|
|
61723
61732
|
}
|
|
61724
61733
|
/** https://graypaper.fluffylabs.dev/#/9a08063/33af0133b201?v=0.6.6 */
|
|
61725
61734
|
const maybeValue = valueLength === 0n ? null : bytes_BytesBlob.blobFrom(value);
|
|
61726
61735
|
// a
|
|
61727
61736
|
const result = this.account.write(storageKey, maybeValue);
|
|
61728
|
-
logger_logger.trace
|
|
61737
|
+
logger_logger.trace `WRITE(${storageKey}, ${maybeValue?.toStringTruncated()}) <- ${resultToString(result)}`;
|
|
61729
61738
|
if (result.isError) {
|
|
61730
61739
|
regs.set(write_IN_OUT_REG, HostCallResult.FULL);
|
|
61731
61740
|
return;
|
|
@@ -61917,18 +61926,18 @@ class Accumulate {
|
|
|
61917
61926
|
async pvmAccumulateInvocation(slot, serviceId, operands, gas, entropy, inputStateUpdate) {
|
|
61918
61927
|
const service = this.state.getService(serviceId);
|
|
61919
61928
|
if (service === null) {
|
|
61920
|
-
accumulate_logger.log
|
|
61929
|
+
accumulate_logger.log `Service with id ${serviceId} not found.`;
|
|
61921
61930
|
return result_Result.error(PvmInvocationError.NoService);
|
|
61922
61931
|
}
|
|
61923
61932
|
const codeHash = service.getInfo().codeHash;
|
|
61924
61933
|
// TODO [ToDr] Should we check that the preimage is still available?
|
|
61925
61934
|
const code = service.getPreimage(codeHash.asOpaque());
|
|
61926
61935
|
if (code === null) {
|
|
61927
|
-
accumulate_logger.log
|
|
61936
|
+
accumulate_logger.log `Code with hash ${codeHash} not found for service ${serviceId}.`;
|
|
61928
61937
|
return result_Result.error(PvmInvocationError.NoPreimage);
|
|
61929
61938
|
}
|
|
61930
61939
|
if (code.length > W_C) {
|
|
61931
|
-
accumulate_logger.log
|
|
61940
|
+
accumulate_logger.log `Code with hash ${codeHash} is too long for service ${serviceId}.`;
|
|
61932
61941
|
return result_Result.error(PvmInvocationError.PreimageTooLong);
|
|
61933
61942
|
}
|
|
61934
61943
|
const nextServiceId = generateNextServiceId({ serviceId, entropy, timeslot: slot }, this.chainSpec);
|
|
@@ -61950,10 +61959,10 @@ class Accumulate {
|
|
|
61950
61959
|
if (result.hasStatus()) {
|
|
61951
61960
|
const status = result.status;
|
|
61952
61961
|
if (status === status_Status.OOG || status === status_Status.PANIC) {
|
|
61953
|
-
accumulate_logger.trace
|
|
61962
|
+
accumulate_logger.trace `[${serviceId}] accumulate finished with ${status_Status[status]} reverting to checkpoint.`;
|
|
61954
61963
|
return result_Result.ok({ stateUpdate: checkpoint, consumedGas: common_tryAsServiceGas(result.consumedGas) });
|
|
61955
61964
|
}
|
|
61956
|
-
accumulate_logger.trace
|
|
61965
|
+
accumulate_logger.trace `[${serviceId}] accumulate finished with ${status_Status[status]}`;
|
|
61957
61966
|
}
|
|
61958
61967
|
/**
|
|
61959
61968
|
* PVM invocation returned a hash so we override whatever `yield` host call
|
|
@@ -61978,14 +61987,14 @@ class Accumulate {
|
|
|
61978
61987
|
* https://graypaper.fluffylabs.dev/#/7e6ff6a/18d70118d701?v=0.6.7
|
|
61979
61988
|
*/
|
|
61980
61989
|
async accumulateSingleService(serviceId, operands, gasCost, slot, entropy, inputStateUpdate) {
|
|
61981
|
-
accumulate_logger.log
|
|
61990
|
+
accumulate_logger.log `Accumulating service ${serviceId}, items: ${operands.length} at slot: ${slot}.`;
|
|
61982
61991
|
const result = await this.pvmAccumulateInvocation(slot, serviceId, operands, gasCost, entropy, inputStateUpdate);
|
|
61983
61992
|
if (result.isError) {
|
|
61984
61993
|
// https://graypaper.fluffylabs.dev/#/7e6ff6a/2fb6012fb601?v=0.6.7
|
|
61985
|
-
accumulate_logger.log
|
|
61994
|
+
accumulate_logger.log `Accumulation failed for ${serviceId}.`;
|
|
61986
61995
|
return { stateUpdate: null, consumedGas: 0n };
|
|
61987
61996
|
}
|
|
61988
|
-
accumulate_logger.log
|
|
61997
|
+
accumulate_logger.log `Accumulation successful for ${serviceId}. Consumed: ${result.ok.consumedGas}`;
|
|
61989
61998
|
return result.ok;
|
|
61990
61999
|
}
|
|
61991
62000
|
/**
|
|
@@ -62047,7 +62056,7 @@ class Accumulate {
|
|
|
62047
62056
|
if (Compatibility.is(GpVersion.V0_7_0) && serviceId === currentManager) {
|
|
62048
62057
|
const newV = currentState.privilegedServices?.validatorsManager;
|
|
62049
62058
|
if (currentState.privilegedServices !== null && newV !== undefined && serviceIds.includes(newV)) {
|
|
62050
|
-
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+`;
|
|
62051
62060
|
// Since serviceIds already contains newV, this service gets accumulated twice.
|
|
62052
62061
|
// To avoid double-counting, we skip stats and gas cost tracking here.
|
|
62053
62062
|
// We need this accumulation to get the correct `validatorsManager`
|
|
@@ -62230,13 +62239,13 @@ class DeferredTransfers {
|
|
|
62230
62239
|
const isCodeCorrect = code !== null && code.length <= W_C;
|
|
62231
62240
|
if (!hasTransfers || !isCodeCorrect) {
|
|
62232
62241
|
if (code === null) {
|
|
62233
|
-
deferred_transfers_logger.trace
|
|
62242
|
+
deferred_transfers_logger.trace `Skipping ON_TRANSFER execution for service ${serviceId} because code is null`;
|
|
62234
62243
|
}
|
|
62235
62244
|
else if (!hasTransfers) {
|
|
62236
|
-
deferred_transfers_logger.trace
|
|
62245
|
+
deferred_transfers_logger.trace `Skipping ON_TRANSFER execution for service ${serviceId} because there are no transfers`;
|
|
62237
62246
|
}
|
|
62238
62247
|
else {
|
|
62239
|
-
deferred_transfers_logger.trace
|
|
62248
|
+
deferred_transfers_logger.trace `Skipping ON_TRANSFER execution for service ${serviceId} because code is too long`;
|
|
62240
62249
|
}
|
|
62241
62250
|
}
|
|
62242
62251
|
else {
|
|
@@ -62864,7 +62873,7 @@ function verifyRefineContexts(minLookupSlot, contexts, recentBlocksPartialUpdate
|
|
|
62864
62873
|
headerChain.isAncestor(context.lookupAnchorSlot, context.lookupAnchor, context.anchor);
|
|
62865
62874
|
if (!isInChain) {
|
|
62866
62875
|
if (process.env.SKIP_LOOKUP_ANCHOR_CHECK !== undefined) {
|
|
62867
|
-
verify_contextual_logger.warn
|
|
62876
|
+
verify_contextual_logger.warn `Lookup anchor check for ${context.lookupAnchor} would fail, but override is active.`;
|
|
62868
62877
|
}
|
|
62869
62878
|
else {
|
|
62870
62879
|
return result_Result.error(ReportsError.SegmentRootLookupInvalid, `Lookup anchor is not found in chain. Hash: ${context.lookupAnchor} (slot: ${context.lookupAnchorSlot})`);
|
|
@@ -63751,7 +63760,7 @@ class OnChain {
|
|
|
63751
63760
|
reports: availableReports,
|
|
63752
63761
|
entropy: entropy[0],
|
|
63753
63762
|
});
|
|
63754
|
-
chain_stf_logger.log
|
|
63763
|
+
chain_stf_logger.log `${timerAccumulate()}`;
|
|
63755
63764
|
if (accumulateResult.isError) {
|
|
63756
63765
|
return stfError(StfErrorKind.Accumulate, accumulateResult);
|
|
63757
63766
|
}
|
|
@@ -63882,7 +63891,7 @@ class Importer {
|
|
|
63882
63891
|
this.stf = new OnChain(spec, state, blocks, hasher);
|
|
63883
63892
|
this.state = state;
|
|
63884
63893
|
this.currentHash = currentBestHeaderHash;
|
|
63885
|
-
logger.info
|
|
63894
|
+
logger.info `😎 Best time slot: ${state.timeslot} (header hash: ${currentBestHeaderHash})`;
|
|
63886
63895
|
}
|
|
63887
63896
|
async importBlock(block, omitSealVerification) {
|
|
63888
63897
|
const timer = measure("importBlock");
|
|
@@ -63890,20 +63899,20 @@ class Importer {
|
|
|
63890
63899
|
const maybeBestHeader = await this.importBlockInternal(block, omitSealVerification);
|
|
63891
63900
|
if (maybeBestHeader.isOk) {
|
|
63892
63901
|
const bestHeader = maybeBestHeader.ok;
|
|
63893
|
-
this.logger.info
|
|
63894
|
-
this.logger.log
|
|
63902
|
+
this.logger.info `🧊 Best block: #${timeSlot} (${bestHeader.hash})`;
|
|
63903
|
+
this.logger.log `${timer()}`;
|
|
63895
63904
|
return maybeBestHeader;
|
|
63896
63905
|
}
|
|
63897
|
-
this.logger.log
|
|
63898
|
-
this.logger.log
|
|
63906
|
+
this.logger.log `❌ Rejected block #${timeSlot}: ${resultToString(maybeBestHeader)}`;
|
|
63907
|
+
this.logger.log `${timer()}`;
|
|
63899
63908
|
return maybeBestHeader;
|
|
63900
63909
|
}
|
|
63901
63910
|
async importBlockInternal(block, omitSealVerification = false) {
|
|
63902
63911
|
const logger = this.logger;
|
|
63903
|
-
logger.log
|
|
63912
|
+
logger.log `🧱 Attempting to import a new block`;
|
|
63904
63913
|
const timerVerify = measure("import:verify");
|
|
63905
63914
|
const hash = await this.verifier.verifyBlock(block);
|
|
63906
|
-
logger.log
|
|
63915
|
+
logger.log `${timerVerify()}`;
|
|
63907
63916
|
if (hash.isError) {
|
|
63908
63917
|
return importerError(ImporterErrorKind.Verifier, hash);
|
|
63909
63918
|
}
|
|
@@ -63923,10 +63932,10 @@ class Importer {
|
|
|
63923
63932
|
}
|
|
63924
63933
|
const timeSlot = block.header.view().timeSlotIndex.materialize();
|
|
63925
63934
|
const headerHash = hash.ok;
|
|
63926
|
-
logger.log
|
|
63935
|
+
logger.log `🧱 Verified block: Got hash ${headerHash} for block at slot ${timeSlot}.`;
|
|
63927
63936
|
const timerStf = measure("import:stf");
|
|
63928
63937
|
const res = await this.stf.transition(block, headerHash, omitSealVerification);
|
|
63929
|
-
logger.log
|
|
63938
|
+
logger.log `${timerStf()}`;
|
|
63930
63939
|
if (res.isError) {
|
|
63931
63940
|
return importerError(ImporterErrorKind.Stf, res);
|
|
63932
63941
|
}
|
|
@@ -63935,7 +63944,7 @@ class Importer {
|
|
|
63935
63944
|
const timerState = measure("import:state");
|
|
63936
63945
|
const updateResult = await this.states.updateAndSetState(headerHash, this.state, update);
|
|
63937
63946
|
if (updateResult.isError) {
|
|
63938
|
-
logger.error
|
|
63947
|
+
logger.error `🧱 Unable to update state: ${resultToString(updateResult)}`;
|
|
63939
63948
|
return importerError(ImporterErrorKind.Update, updateResult);
|
|
63940
63949
|
}
|
|
63941
63950
|
const newState = this.states.getState(headerHash);
|
|
@@ -63946,17 +63955,17 @@ class Importer {
|
|
|
63946
63955
|
// the state of a parent block to support forks and create a fresh STF.
|
|
63947
63956
|
this.state.updateBackend(newState.backend);
|
|
63948
63957
|
this.currentHash = headerHash;
|
|
63949
|
-
logger.log
|
|
63958
|
+
logger.log `${timerState()}`;
|
|
63950
63959
|
// insert new state and the block to DB.
|
|
63951
63960
|
const timerDb = measure("import:db");
|
|
63952
63961
|
const writeBlocks = this.blocks.insertBlock(new WithHash(headerHash, block));
|
|
63953
63962
|
// Computation of the state root may happen asynchronously,
|
|
63954
63963
|
// but we still need to wait for it before next block can be imported
|
|
63955
63964
|
const stateRoot = await this.states.getStateRoot(newState);
|
|
63956
|
-
logger.log
|
|
63965
|
+
logger.log `🧱 Storing post-state-root for ${headerHash}: ${stateRoot}.`;
|
|
63957
63966
|
const writeStateRoot = this.blocks.setPostStateRoot(headerHash, stateRoot);
|
|
63958
63967
|
await Promise.all([writeBlocks, writeStateRoot]);
|
|
63959
|
-
logger.log
|
|
63968
|
+
logger.log `${timerDb()}`;
|
|
63960
63969
|
// finally update the best block
|
|
63961
63970
|
await this.blocks.setBestHeaderHash(headerHash);
|
|
63962
63971
|
return result_Result.ok(new WithHash(headerHash, block.header.view()));
|
|
@@ -64004,7 +64013,7 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
|
|
|
64004
64013
|
Logger.configureAll(process.env.JAM_LOG ?? "", Level.LOG);
|
|
64005
64014
|
const machine = importerStateMachine();
|
|
64006
64015
|
const channel = MessageChannelStateMachine.receiveChannel(machine, external_node_worker_threads_namespaceObject.parentPort);
|
|
64007
|
-
channel.then((channel) => importer_main(channel)).catch((e) => importer_logger.error
|
|
64016
|
+
channel.then((channel) => importer_main(channel)).catch((e) => importer_logger.error `${e}`);
|
|
64008
64017
|
}
|
|
64009
64018
|
const keccakHasher = KeccakHasher.create();
|
|
64010
64019
|
async function createImporter(config) {
|
|
@@ -64026,7 +64035,7 @@ async function createImporter(config) {
|
|
|
64026
64035
|
*/
|
|
64027
64036
|
async function importer_main(channel) {
|
|
64028
64037
|
const wasmPromise = initAll();
|
|
64029
|
-
importer_logger.info
|
|
64038
|
+
importer_logger.info `📥 Importer starting ${channel.currentState()}`;
|
|
64030
64039
|
// Await the configuration object
|
|
64031
64040
|
const ready = await channel.waitForState("ready(importer)");
|
|
64032
64041
|
let closeDb = async () => { };
|
|
@@ -64038,7 +64047,7 @@ async function importer_main(channel) {
|
|
|
64038
64047
|
};
|
|
64039
64048
|
// TODO [ToDr] this is shit, since we have circular dependency.
|
|
64040
64049
|
worker.setImporter(importer);
|
|
64041
|
-
importer_logger.info
|
|
64050
|
+
importer_logger.info `📥 Importer waiting for blocks.`;
|
|
64042
64051
|
worker.onBlock.on(async (block) => {
|
|
64043
64052
|
const res = await importer.importBlock(block, config.omitSealVerification);
|
|
64044
64053
|
if (res.isOk) {
|
|
@@ -64047,7 +64056,7 @@ async function importer_main(channel) {
|
|
|
64047
64056
|
});
|
|
64048
64057
|
await wasmPromise;
|
|
64049
64058
|
});
|
|
64050
|
-
importer_logger.info
|
|
64059
|
+
importer_logger.info `📥 Importer finished. Closing channel.`;
|
|
64051
64060
|
// close the database
|
|
64052
64061
|
await closeDb();
|
|
64053
64062
|
// Close the comms to gracefuly close the app.
|
|
@@ -64068,8 +64077,8 @@ async function importer_main(channel) {
|
|
|
64068
64077
|
const zeroHash = bytes_Bytes.zero(hash_HASH_SIZE).asOpaque();
|
|
64069
64078
|
async function mainImporter(config, withRelPath) {
|
|
64070
64079
|
await initAll();
|
|
64071
|
-
common_logger.info
|
|
64072
|
-
common_logger.info
|
|
64080
|
+
common_logger.info `🫐 Typeberry ${package_namespaceObject.rE}. GP: ${CURRENT_VERSION} (${CURRENT_SUITE})`;
|
|
64081
|
+
common_logger.info `🎸 Starting importer: ${config.nodeName}.`;
|
|
64073
64082
|
const chainSpec = getChainSpec(config.node.flavor);
|
|
64074
64083
|
const { rootDb, dbPath, genesisHeaderHash } = openDatabase(config.nodeName, config.node.chainSpec.genesisHeader, withRelPath(config.node.databaseBasePath));
|
|
64075
64084
|
// Initialize the database with genesis state and block if there isn't one.
|
|
@@ -64096,9 +64105,9 @@ async function mainImporter(config, withRelPath) {
|
|
|
64096
64105
|
return importer.getBestStateRootHash() ?? zeroHash;
|
|
64097
64106
|
},
|
|
64098
64107
|
async close() {
|
|
64099
|
-
common_logger.log
|
|
64108
|
+
common_logger.log `[main] 🛢️ Closing the database`;
|
|
64100
64109
|
await lmdb.close();
|
|
64101
|
-
common_logger.info
|
|
64110
|
+
common_logger.info `[main] ✅ Done.`;
|
|
64102
64111
|
},
|
|
64103
64112
|
};
|
|
64104
64113
|
return api;
|
|
@@ -64125,7 +64134,7 @@ function getFuzzDetails() {
|
|
|
64125
64134
|
};
|
|
64126
64135
|
}
|
|
64127
64136
|
async function mainFuzz(fuzzConfig, withRelPath) {
|
|
64128
|
-
main_fuzz_logger.info
|
|
64137
|
+
main_fuzz_logger.info `💨 Fuzzer V${fuzzConfig.version} starting up.`;
|
|
64129
64138
|
const { jamNodeConfig: config } = fuzzConfig;
|
|
64130
64139
|
let runningNode = null;
|
|
64131
64140
|
const fuzzSeed = BigInt(Date.now());
|
|
@@ -64195,20 +64204,20 @@ async function mainFuzz(fuzzConfig, withRelPath) {
|
|
|
64195
64204
|
|
|
64196
64205
|
const importBlocks = async (node, blocksToImport) => {
|
|
64197
64206
|
const logger = Logger.new(import.meta.filename, "jam");
|
|
64198
|
-
logger.info
|
|
64207
|
+
logger.info `📖 Reading ${blocksToImport.length} blocks`;
|
|
64199
64208
|
const reader = startBlocksReader({
|
|
64200
64209
|
files: blocksToImport,
|
|
64201
64210
|
chainSpec: node.chainSpec,
|
|
64202
64211
|
});
|
|
64203
64212
|
for (const block of reader) {
|
|
64204
|
-
logger.log
|
|
64213
|
+
logger.log `📖 Importing block: #${block.header.view().timeSlotIndex.materialize()}`;
|
|
64205
64214
|
const res = await node.importBlock(block);
|
|
64206
64215
|
if (res.isError) {
|
|
64207
|
-
logger.error
|
|
64216
|
+
logger.error `📖 ${resultToString(res)}`;
|
|
64208
64217
|
}
|
|
64209
64218
|
}
|
|
64210
64219
|
// close the importer.
|
|
64211
|
-
logger.info
|
|
64220
|
+
logger.info `All blocks scheduled to be imported.`;
|
|
64212
64221
|
return await node.close();
|
|
64213
64222
|
};
|
|
64214
64223
|
function* startBlocksReader(options) {
|