@typeberry/jam 0.1.1 → 0.1.2-3178190
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/README.md +1 -0
- package/block-generator/index.js +164 -107
- package/block-generator/index.js.map +1 -1
- package/importer/index.js +273 -199
- package/importer/index.js.map +1 -1
- package/index.js +435 -365
- package/index.js.map +1 -1
- package/jam-network/index.js +214 -171
- package/jam-network/index.js.map +1 -1
- package/package.json +4 -2
package/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
1
2
|
import './sourcemap-register.cjs';import { createRequire as __WEBPACK_EXTERNAL_createRequire } from "module";
|
|
2
3
|
import * as __WEBPACK_EXTERNAL_MODULE_lmdb__ from "lmdb";
|
|
3
4
|
/******/ var __webpack_modules__ = ({
|
|
@@ -28243,6 +28244,7 @@ var GpVersion;
|
|
|
28243
28244
|
GpVersion["V0_6_7"] = "0.6.7";
|
|
28244
28245
|
GpVersion["V0_7_0"] = "0.7.0";
|
|
28245
28246
|
GpVersion["V0_7_1"] = "0.7.1-preview";
|
|
28247
|
+
GpVersion["V0_7_2"] = "0.7.2-preview";
|
|
28246
28248
|
})(GpVersion || (GpVersion = {}));
|
|
28247
28249
|
var TestSuite;
|
|
28248
28250
|
(function (TestSuite) {
|
|
@@ -28250,7 +28252,7 @@ var TestSuite;
|
|
|
28250
28252
|
TestSuite["JAMDUNA"] = "jamduna";
|
|
28251
28253
|
})(TestSuite || (TestSuite = {}));
|
|
28252
28254
|
const DEFAULT_SUITE = TestSuite.W3F_DAVXY;
|
|
28253
|
-
const ALL_VERSIONS_IN_ORDER = [GpVersion.V0_6_7, GpVersion.V0_7_0, GpVersion.V0_7_1];
|
|
28255
|
+
const ALL_VERSIONS_IN_ORDER = [GpVersion.V0_6_7, GpVersion.V0_7_0, GpVersion.V0_7_1, GpVersion.V0_7_2];
|
|
28254
28256
|
const env = typeof process === "undefined" ? {} : process.env;
|
|
28255
28257
|
const DEFAULT_VERSION = GpVersion.V0_7_0;
|
|
28256
28258
|
let CURRENT_VERSION = parseCurrentVersion(env.GP_VERSION) ?? DEFAULT_VERSION;
|
|
@@ -28259,20 +28261,26 @@ function parseCurrentVersion(env) {
|
|
|
28259
28261
|
if (env === undefined) {
|
|
28260
28262
|
return undefined;
|
|
28261
28263
|
}
|
|
28262
|
-
|
|
28263
|
-
|
|
28264
|
-
|
|
28264
|
+
switch (env) {
|
|
28265
|
+
case GpVersion.V0_6_7:
|
|
28266
|
+
case GpVersion.V0_7_0:
|
|
28267
|
+
case GpVersion.V0_7_1:
|
|
28268
|
+
case GpVersion.V0_7_2:
|
|
28269
|
+
return env;
|
|
28270
|
+
default:
|
|
28271
|
+
throw new Error(`Configured environment variable GP_VERSION is unknown: '${env}'. Use one of: ${ALL_VERSIONS_IN_ORDER}`);
|
|
28265
28272
|
}
|
|
28266
|
-
return version;
|
|
28267
28273
|
}
|
|
28268
28274
|
function parseCurrentSuite(env) {
|
|
28269
28275
|
if (env === undefined)
|
|
28270
28276
|
return undefined;
|
|
28271
|
-
|
|
28272
|
-
|
|
28273
|
-
|
|
28277
|
+
switch (env) {
|
|
28278
|
+
case TestSuite.W3F_DAVXY:
|
|
28279
|
+
case TestSuite.JAMDUNA:
|
|
28280
|
+
return env;
|
|
28281
|
+
default:
|
|
28282
|
+
throw new Error(`Configured environment variable TEST_SUITE is unknown: '${env}'. Use one of: ${Object.values(TestSuite)}`);
|
|
28274
28283
|
}
|
|
28275
|
-
return val;
|
|
28276
28284
|
}
|
|
28277
28285
|
class Compatibility {
|
|
28278
28286
|
static override(version) {
|
|
@@ -28434,6 +28442,34 @@ class WithDebug {
|
|
|
28434
28442
|
}
|
|
28435
28443
|
}
|
|
28436
28444
|
|
|
28445
|
+
;// CONCATENATED MODULE: ./packages/core/utils/dev.ts
|
|
28446
|
+
const dev_env = typeof process === "undefined" ? {} : process.env;
|
|
28447
|
+
/**
|
|
28448
|
+
* The function will produce relative path resolver that is adjusted
|
|
28449
|
+
* for package location within the workspace.
|
|
28450
|
+
*
|
|
28451
|
+
* Example:
|
|
28452
|
+
* $ npm start -w @typeberry/jam
|
|
28453
|
+
*
|
|
28454
|
+
* The above command will run `./bin/jam/index.js`, however we would
|
|
28455
|
+
* still want relative paths to be resolved according to top-level workspace
|
|
28456
|
+
* directory.
|
|
28457
|
+
*
|
|
28458
|
+
* So the caller, passes the absolute workspace path as argument and get's
|
|
28459
|
+
* a function that can properly resolve relative paths.
|
|
28460
|
+
*
|
|
28461
|
+
* NOTE: the translation happens only for development build! When
|
|
28462
|
+
* we build a single library from our project, we no longer mangle the paths.
|
|
28463
|
+
*/
|
|
28464
|
+
const workspacePathFix = dev_env.NODE_ENV === "development"
|
|
28465
|
+
? (workspacePath) => (p) => {
|
|
28466
|
+
if (p.startsWith("/")) {
|
|
28467
|
+
return p;
|
|
28468
|
+
}
|
|
28469
|
+
return `${workspacePath}/${p}`;
|
|
28470
|
+
}
|
|
28471
|
+
: () => (p) => p;
|
|
28472
|
+
|
|
28437
28473
|
;// CONCATENATED MODULE: ./packages/core/utils/opaque.ts
|
|
28438
28474
|
/**
|
|
28439
28475
|
* @fileoverview `Opaque<Type, Token>` constructs a unique type which is a subset of Type with a
|
|
@@ -28777,6 +28813,7 @@ function isResult(x) {
|
|
|
28777
28813
|
|
|
28778
28814
|
|
|
28779
28815
|
|
|
28816
|
+
|
|
28780
28817
|
;// CONCATENATED MODULE: ./packages/core/bytes/bitvec.ts
|
|
28781
28818
|
|
|
28782
28819
|
/**
|
|
@@ -35148,6 +35185,23 @@ function parseLevel(lvl) {
|
|
|
35148
35185
|
;// CONCATENATED MODULE: ./packages/core/logger/console.ts
|
|
35149
35186
|
// biome-ignore-all lint/suspicious/noConsole: logger
|
|
35150
35187
|
|
|
35188
|
+
function print(level, levelAndName, strings, data) {
|
|
35189
|
+
if (level < levelAndName[0]) {
|
|
35190
|
+
return;
|
|
35191
|
+
}
|
|
35192
|
+
const lvlText = Level[level].padEnd(5);
|
|
35193
|
+
const val = strings.map((v, idx) => `${v}${idx < data.length ? data[idx] : ""}`);
|
|
35194
|
+
const msg = `${lvlText} [${levelAndName[1]}] ${val.join("")}`;
|
|
35195
|
+
if (level === Level.WARN) {
|
|
35196
|
+
console.warn(msg);
|
|
35197
|
+
}
|
|
35198
|
+
else if (level === Level.ERROR) {
|
|
35199
|
+
console.error(msg);
|
|
35200
|
+
}
|
|
35201
|
+
else {
|
|
35202
|
+
console.info(msg);
|
|
35203
|
+
}
|
|
35204
|
+
}
|
|
35151
35205
|
/** An optimized logger that ignores `TRACE`, `DEBUG` and `LOG` messages.
|
|
35152
35206
|
*
|
|
35153
35207
|
* Use the `create` method to instantiate the right instance of a more specialized logger.
|
|
@@ -35178,109 +35232,91 @@ class ConsoleTransport {
|
|
|
35178
35232
|
constructor(options) {
|
|
35179
35233
|
this.options = options;
|
|
35180
35234
|
}
|
|
35181
|
-
insane(
|
|
35235
|
+
insane(_levelAndName, _strings, _data) {
|
|
35182
35236
|
/* no-op */
|
|
35183
35237
|
}
|
|
35184
|
-
trace(
|
|
35238
|
+
trace(_levelAndName, _strings, _data) {
|
|
35185
35239
|
/* no-op */
|
|
35186
35240
|
}
|
|
35187
|
-
log(
|
|
35241
|
+
log(_levelAndName, _strings, _data) {
|
|
35188
35242
|
/* no-op */
|
|
35189
35243
|
}
|
|
35190
|
-
info(
|
|
35244
|
+
info(_levelAndName, _strings, _data) {
|
|
35191
35245
|
/* no-op */
|
|
35192
35246
|
}
|
|
35193
|
-
warn(
|
|
35194
|
-
|
|
35247
|
+
warn(levelAndName, strings, data) {
|
|
35248
|
+
print(Level.WARN, levelAndName, strings, data);
|
|
35195
35249
|
}
|
|
35196
|
-
error(
|
|
35197
|
-
|
|
35198
|
-
}
|
|
35199
|
-
push(level, moduleName, val) {
|
|
35200
|
-
const shortModule = moduleName.replace(this.options.workingDir, "");
|
|
35201
|
-
const configuredLevel = findLevel(this.options, moduleName);
|
|
35202
|
-
const lvlText = Level[level].padEnd(5);
|
|
35203
|
-
if (level < configuredLevel) {
|
|
35204
|
-
return;
|
|
35205
|
-
}
|
|
35206
|
-
const msg = `${lvlText} [${shortModule}] ${val}`;
|
|
35207
|
-
if (level === Level.WARN) {
|
|
35208
|
-
console.warn(msg);
|
|
35209
|
-
}
|
|
35210
|
-
else if (level === Level.ERROR) {
|
|
35211
|
-
console.error(msg);
|
|
35212
|
-
}
|
|
35213
|
-
else {
|
|
35214
|
-
console.info(msg);
|
|
35215
|
-
}
|
|
35250
|
+
error(levelAndName, strings, data) {
|
|
35251
|
+
print(Level.ERROR, levelAndName, strings, data);
|
|
35216
35252
|
}
|
|
35217
35253
|
}
|
|
35218
35254
|
/**
|
|
35219
35255
|
* Insane version of console logger - supports insane level.
|
|
35220
35256
|
*/
|
|
35221
35257
|
class InsaneConsoleLogger extends ConsoleTransport {
|
|
35222
|
-
insane(
|
|
35223
|
-
|
|
35258
|
+
insane(levelAndName, strings, data) {
|
|
35259
|
+
print(Level.INSANE, levelAndName, strings, data);
|
|
35224
35260
|
}
|
|
35225
|
-
trace(
|
|
35226
|
-
|
|
35261
|
+
trace(levelAndName, strings, data) {
|
|
35262
|
+
print(Level.TRACE, levelAndName, strings, data);
|
|
35227
35263
|
}
|
|
35228
|
-
log(
|
|
35229
|
-
|
|
35264
|
+
log(levelAndName, strings, data) {
|
|
35265
|
+
print(Level.LOG, levelAndName, strings, data);
|
|
35230
35266
|
}
|
|
35231
|
-
info(
|
|
35232
|
-
|
|
35267
|
+
info(levelAndName, strings, data) {
|
|
35268
|
+
print(Level.INFO, levelAndName, strings, data);
|
|
35233
35269
|
}
|
|
35234
35270
|
}
|
|
35235
35271
|
/**
|
|
35236
35272
|
* A basic version of console logger - printing everything.
|
|
35237
35273
|
*/
|
|
35238
35274
|
class TraceConsoleTransport extends ConsoleTransport {
|
|
35239
|
-
insane(
|
|
35275
|
+
insane(_levelAndName, _strings, _data) {
|
|
35240
35276
|
/* no-op */
|
|
35241
35277
|
}
|
|
35242
|
-
trace(
|
|
35243
|
-
|
|
35278
|
+
trace(levelAndName, strings, data) {
|
|
35279
|
+
print(Level.TRACE, levelAndName, strings, data);
|
|
35244
35280
|
}
|
|
35245
|
-
log(
|
|
35246
|
-
|
|
35281
|
+
log(levelAndName, strings, data) {
|
|
35282
|
+
print(Level.LOG, levelAndName, strings, data);
|
|
35247
35283
|
}
|
|
35248
|
-
info(
|
|
35249
|
-
|
|
35284
|
+
info(levelAndName, strings, data) {
|
|
35285
|
+
print(Level.INFO, levelAndName, strings, data);
|
|
35250
35286
|
}
|
|
35251
35287
|
}
|
|
35252
35288
|
/**
|
|
35253
35289
|
* An optimized version of the logger - completely ignores `TRACE` level calls.
|
|
35254
35290
|
*/
|
|
35255
35291
|
class LogConsoleTransport extends ConsoleTransport {
|
|
35256
|
-
insane(
|
|
35292
|
+
insane(_levelAndName, _strings, _data) {
|
|
35257
35293
|
/* no-op */
|
|
35258
35294
|
}
|
|
35259
|
-
trace(
|
|
35295
|
+
trace(_levelAndName, _strings, _data) {
|
|
35260
35296
|
/* no-op */
|
|
35261
35297
|
}
|
|
35262
|
-
log(
|
|
35263
|
-
|
|
35298
|
+
log(levelAndName, strings, data) {
|
|
35299
|
+
print(Level.LOG, levelAndName, strings, data);
|
|
35264
35300
|
}
|
|
35265
|
-
info(
|
|
35266
|
-
|
|
35301
|
+
info(levelAndName, strings, data) {
|
|
35302
|
+
print(Level.INFO, levelAndName, strings, data);
|
|
35267
35303
|
}
|
|
35268
35304
|
}
|
|
35269
35305
|
/**
|
|
35270
35306
|
* An optimized version of the logger - completely ignores `TRACE` & `DEBUG` level calls.
|
|
35271
35307
|
*/
|
|
35272
35308
|
class InfoConsoleTransport extends ConsoleTransport {
|
|
35273
|
-
insane(
|
|
35309
|
+
insane(_levelAndName, _strings, _data) {
|
|
35274
35310
|
/* no-op */
|
|
35275
35311
|
}
|
|
35276
|
-
trace(
|
|
35312
|
+
trace(_levelAndName, _strings, _data) {
|
|
35277
35313
|
/* no-op */
|
|
35278
35314
|
}
|
|
35279
|
-
log(
|
|
35315
|
+
log(_levelAndName, _strings, _data) {
|
|
35280
35316
|
/* no-op */
|
|
35281
35317
|
}
|
|
35282
|
-
info(
|
|
35283
|
-
|
|
35318
|
+
info(levelAndName, strings, data) {
|
|
35319
|
+
print(Level.INFO, levelAndName, strings, data);
|
|
35284
35320
|
}
|
|
35285
35321
|
}
|
|
35286
35322
|
|
|
@@ -35317,11 +35353,6 @@ class Logger {
|
|
|
35317
35353
|
const module = moduleName ?? fName;
|
|
35318
35354
|
return new Logger(module.padStart(8, " "), GLOBAL_CONFIG);
|
|
35319
35355
|
}
|
|
35320
|
-
/**
|
|
35321
|
-
* Return currently configured level for given module. */
|
|
35322
|
-
static getLevel(moduleName) {
|
|
35323
|
-
return findLevel(GLOBAL_CONFIG.options, moduleName);
|
|
35324
|
-
}
|
|
35325
35356
|
/**
|
|
35326
35357
|
* Global configuration of all loggers.
|
|
35327
35358
|
*
|
|
@@ -35352,33 +35383,46 @@ class Logger {
|
|
|
35352
35383
|
const options = parseLoggerOptions(input, defaultLevel, workingDir);
|
|
35353
35384
|
Logger.configureAllFromOptions(options);
|
|
35354
35385
|
}
|
|
35386
|
+
cachedLevelAndName;
|
|
35355
35387
|
constructor(moduleName, config) {
|
|
35356
35388
|
this.moduleName = moduleName;
|
|
35357
35389
|
this.config = config;
|
|
35358
35390
|
}
|
|
35391
|
+
/** Return currently configured level for given module. */
|
|
35392
|
+
getLevel() {
|
|
35393
|
+
return this.getLevelAndName()[0];
|
|
35394
|
+
}
|
|
35395
|
+
getLevelAndName() {
|
|
35396
|
+
if (this.cachedLevelAndName === undefined) {
|
|
35397
|
+
const level = findLevel(this.config.options, this.moduleName);
|
|
35398
|
+
const shortName = this.moduleName.replace(this.config.options.workingDir, "");
|
|
35399
|
+
this.cachedLevelAndName = [level, shortName];
|
|
35400
|
+
}
|
|
35401
|
+
return this.cachedLevelAndName;
|
|
35402
|
+
}
|
|
35359
35403
|
/** Log a message with `INSANE` level. */
|
|
35360
|
-
insane(
|
|
35361
|
-
this.config.transport.insane(this.
|
|
35404
|
+
insane(strings, ...data) {
|
|
35405
|
+
this.config.transport.insane(this.getLevelAndName(), strings, data);
|
|
35362
35406
|
}
|
|
35363
35407
|
/** Log a message with `TRACE` level. */
|
|
35364
|
-
trace(
|
|
35365
|
-
this.config.transport.trace(this.
|
|
35408
|
+
trace(strings, ...data) {
|
|
35409
|
+
this.config.transport.trace(this.getLevelAndName(), strings, data);
|
|
35366
35410
|
}
|
|
35367
35411
|
/** Log a message with `DEBUG`/`LOG` level. */
|
|
35368
|
-
log(
|
|
35369
|
-
this.config.transport.log(this.
|
|
35412
|
+
log(strings, ...data) {
|
|
35413
|
+
this.config.transport.log(this.getLevelAndName(), strings, data);
|
|
35370
35414
|
}
|
|
35371
35415
|
/** Log a message with `INFO` level. */
|
|
35372
|
-
info(
|
|
35373
|
-
this.config.transport.info(this.
|
|
35416
|
+
info(strings, ...data) {
|
|
35417
|
+
this.config.transport.info(this.getLevelAndName(), strings, data);
|
|
35374
35418
|
}
|
|
35375
35419
|
/** Log a message with `WARN` level. */
|
|
35376
|
-
warn(
|
|
35377
|
-
this.config.transport.warn(this.
|
|
35420
|
+
warn(strings, ...data) {
|
|
35421
|
+
this.config.transport.warn(this.getLevelAndName(), strings, data);
|
|
35378
35422
|
}
|
|
35379
35423
|
/** Log a message with `ERROR` level. */
|
|
35380
|
-
error(
|
|
35381
|
-
this.config.transport.error(this.
|
|
35424
|
+
error(strings, ...data) {
|
|
35425
|
+
this.config.transport.error(this.getLevelAndName(), strings, data);
|
|
35382
35426
|
}
|
|
35383
35427
|
}
|
|
35384
35428
|
|
|
@@ -35468,15 +35512,15 @@ class NodeConfiguration {
|
|
|
35468
35512
|
}
|
|
35469
35513
|
function loadConfig(configPath) {
|
|
35470
35514
|
if (configPath === DEFAULT_CONFIG) {
|
|
35471
|
-
logger.log
|
|
35515
|
+
logger.log `🔧 Loading DEFAULT config`;
|
|
35472
35516
|
return parseFromJson(configs.default, NodeConfiguration.fromJson);
|
|
35473
35517
|
}
|
|
35474
35518
|
if (configPath === DEV_CONFIG) {
|
|
35475
|
-
logger.log
|
|
35519
|
+
logger.log `🔧 Loading DEV config`;
|
|
35476
35520
|
return parseFromJson(configs.dev, NodeConfiguration.fromJson);
|
|
35477
35521
|
}
|
|
35478
35522
|
try {
|
|
35479
|
-
logger.log
|
|
35523
|
+
logger.log `🔧 Loading config from ${configPath}`;
|
|
35480
35524
|
const configFile = external_node_fs_default().readFileSync(configPath, "utf8");
|
|
35481
35525
|
const parsed = JSON.parse(configFile);
|
|
35482
35526
|
return parseFromJson(parsed, NodeConfiguration.fromJson);
|
|
@@ -39182,7 +39226,7 @@ class LmdbStates {
|
|
|
39182
39226
|
await Promise.all([valuesWrite, statesWrite]);
|
|
39183
39227
|
}
|
|
39184
39228
|
catch (e) {
|
|
39185
|
-
states_logger.error
|
|
39229
|
+
states_logger.error `${e}`;
|
|
39186
39230
|
return result_Result.error(StateUpdateError.Commit);
|
|
39187
39231
|
}
|
|
39188
39232
|
return result_Result.ok(result_OK);
|
|
@@ -39251,7 +39295,7 @@ function openDatabase(nodeName, genesisHeader, databaseBasePath, { readOnly = fa
|
|
|
39251
39295
|
const genesisHeaderHash = hashBytes(genesisHeader).asOpaque();
|
|
39252
39296
|
const genesisHeaderHashNibbles = genesisHeaderHash.toString().substring(2, 10);
|
|
39253
39297
|
const dbPath = `${databaseBasePath}/${nodeNameHash}/${genesisHeaderHashNibbles}`;
|
|
39254
|
-
common_logger.info
|
|
39298
|
+
common_logger.info `🛢️ Opening database at ${dbPath}`;
|
|
39255
39299
|
try {
|
|
39256
39300
|
return {
|
|
39257
39301
|
dbPath,
|
|
@@ -39273,21 +39317,21 @@ async function initializeDatabase(spec, genesisHeaderHash, rootDb, config, ances
|
|
|
39273
39317
|
const states = new LmdbStates(spec, rootDb);
|
|
39274
39318
|
const header = blocks.getBestHeaderHash();
|
|
39275
39319
|
const state = blocks.getPostStateRoot(header);
|
|
39276
|
-
common_logger.log
|
|
39277
|
-
common_logger.log
|
|
39320
|
+
common_logger.log `🛢️ Best header hash: ${header}`;
|
|
39321
|
+
common_logger.log `🛢️ Best state root: ${state}`;
|
|
39278
39322
|
// DB seems already initialized, just go with what we have.
|
|
39279
39323
|
const isDbInitialized = state !== null && !state.isEqualTo(bytes_Bytes.zero(hash_HASH_SIZE)) && !header.isEqualTo(bytes_Bytes.zero(hash_HASH_SIZE));
|
|
39280
39324
|
if (isDbInitialized) {
|
|
39281
39325
|
await rootDb.db.close();
|
|
39282
39326
|
return;
|
|
39283
39327
|
}
|
|
39284
|
-
common_logger.log
|
|
39328
|
+
common_logger.log `🛢️ Database looks fresh. Initializing.`;
|
|
39285
39329
|
// looks like a fresh db, initialize the state.
|
|
39286
39330
|
const genesisHeader = decoder_Decoder.decodeObject(Header.Codec, config.genesisHeader, spec);
|
|
39287
39331
|
const genesisExtrinsic = emptyBlock().extrinsic;
|
|
39288
39332
|
const genesisBlock = Block.create({ header: genesisHeader, extrinsic: genesisExtrinsic });
|
|
39289
39333
|
const blockView = blockAsView(genesisBlock, spec);
|
|
39290
|
-
common_logger.log
|
|
39334
|
+
common_logger.log `🧬 Writing genesis block #${genesisHeader.timeSlotIndex}: ${genesisHeaderHash}`;
|
|
39291
39335
|
const { genesisStateSerialized, genesisStateRootHash } = loadGenesisState(spec, config.genesisState);
|
|
39292
39336
|
// write to db
|
|
39293
39337
|
await blocks.insertBlock(new WithHash(genesisHeaderHash, blockView));
|
|
@@ -39305,7 +39349,7 @@ function loadGenesisState(spec, data) {
|
|
|
39305
39349
|
const stateEntries = state_entries_StateEntries.fromEntriesUnsafe(data.entries());
|
|
39306
39350
|
const state = serialized_state_SerializedState.fromStateEntries(spec, stateEntries);
|
|
39307
39351
|
const genesisStateRootHash = stateEntries.getRootHash();
|
|
39308
|
-
common_logger.info
|
|
39352
|
+
common_logger.info `🧬 Genesis state root: ${genesisStateRootHash}`;
|
|
39309
39353
|
return {
|
|
39310
39354
|
genesisState: state,
|
|
39311
39355
|
genesisStateSerialized: stateEntries,
|
|
@@ -39444,7 +39488,7 @@ class TypedPort {
|
|
|
39444
39488
|
this.dispatchPortMessage(msg);
|
|
39445
39489
|
}
|
|
39446
39490
|
catch (e) {
|
|
39447
|
-
port_logger.error
|
|
39491
|
+
port_logger.error `[${this.constructor.name}] Failed to dispatch a message: ${e}: ${msg}`;
|
|
39448
39492
|
throw e;
|
|
39449
39493
|
}
|
|
39450
39494
|
});
|
|
@@ -39518,7 +39562,7 @@ class TypedPort {
|
|
|
39518
39562
|
this.port.postMessage(msg, transferList);
|
|
39519
39563
|
}
|
|
39520
39564
|
catch (e) {
|
|
39521
|
-
port_logger.error
|
|
39565
|
+
port_logger.error `[${this.constructor.name}] Failed to post a message: ${e}: ${msg}`;
|
|
39522
39566
|
throw e;
|
|
39523
39567
|
}
|
|
39524
39568
|
}
|
|
@@ -39549,7 +39593,7 @@ class TypedPort {
|
|
|
39549
39593
|
cleanup(reason) {
|
|
39550
39594
|
// resolve all pending requests with an error.
|
|
39551
39595
|
const responseListeners = this.responseListeners.eventNames();
|
|
39552
|
-
for (const ev
|
|
39596
|
+
for (const ev of responseListeners) {
|
|
39553
39597
|
this.responseListeners.emit(ev, new Error(`port is ${reason}`));
|
|
39554
39598
|
}
|
|
39555
39599
|
}
|
|
@@ -39598,7 +39642,7 @@ class MessageChannelStateMachine {
|
|
|
39598
39642
|
this.dispatchSignal(name, data);
|
|
39599
39643
|
}
|
|
39600
39644
|
catch (e) {
|
|
39601
|
-
channel_logger.error
|
|
39645
|
+
channel_logger.error `[${this.constructor.name}] Unable to dispatch signal (${name}): ${e}. ${this.stateInfo(remoteState)}`;
|
|
39602
39646
|
throw e;
|
|
39603
39647
|
}
|
|
39604
39648
|
});
|
|
@@ -39607,7 +39651,7 @@ class MessageChannelStateMachine {
|
|
|
39607
39651
|
await this.dispatchRequest(name, data, msg);
|
|
39608
39652
|
}
|
|
39609
39653
|
catch (e) {
|
|
39610
|
-
channel_logger.error
|
|
39654
|
+
channel_logger.error `[${this.constructor.name}] Unable to dispatch request (${name}): ${e}. ${this.stateInfo(remoteState)}`;
|
|
39611
39655
|
throw e;
|
|
39612
39656
|
}
|
|
39613
39657
|
});
|
|
@@ -39693,7 +39737,7 @@ class MessageChannelStateMachine {
|
|
|
39693
39737
|
this.machine.transition(res.transitionTo.state, res.transitionTo.data);
|
|
39694
39738
|
}
|
|
39695
39739
|
if (didStateChangeInMeantime) {
|
|
39696
|
-
channel_logger.warn
|
|
39740
|
+
channel_logger.warn `Ignoring obsolete response for an old request: "${name}"`;
|
|
39697
39741
|
return;
|
|
39698
39742
|
}
|
|
39699
39743
|
return this.port.respond(prevState.stateName, msg, res.response);
|
|
@@ -39709,7 +39753,7 @@ class MessageChannelStateMachine {
|
|
|
39709
39753
|
}
|
|
39710
39754
|
}
|
|
39711
39755
|
transitionTo() {
|
|
39712
|
-
channel_logger.trace
|
|
39756
|
+
channel_logger.trace `[${this.machine.name}] transitioned to ${this.currentState()}`;
|
|
39713
39757
|
return this;
|
|
39714
39758
|
}
|
|
39715
39759
|
/**
|
|
@@ -39729,7 +39773,7 @@ class MessageChannelStateMachine {
|
|
|
39729
39773
|
await promise;
|
|
39730
39774
|
}
|
|
39731
39775
|
catch (e) {
|
|
39732
|
-
channel_logger.error
|
|
39776
|
+
channel_logger.error `${e}`;
|
|
39733
39777
|
}
|
|
39734
39778
|
return new MessageChannelStateMachine(machine, port);
|
|
39735
39779
|
}
|
|
@@ -39932,7 +39976,7 @@ class State {
|
|
|
39932
39976
|
* actions.
|
|
39933
39977
|
*/
|
|
39934
39978
|
onActivation(data) {
|
|
39935
|
-
state_logger.trace
|
|
39979
|
+
state_logger.trace `[${this.constructor.name}] Changing state to: ${this}`;
|
|
39936
39980
|
this.data = data;
|
|
39937
39981
|
}
|
|
39938
39982
|
/**
|
|
@@ -40030,7 +40074,7 @@ async function spawnWorkerGeneric(bootstrapPath, logger, mainReadyName, mainRead
|
|
|
40030
40074
|
const worker = new external_node_worker_threads_namespaceObject.Worker(bootstrapPath);
|
|
40031
40075
|
const machine = stateMachineMain(`main->${mainReadyName}`, mainReadyName, mainReadyState);
|
|
40032
40076
|
const channel = await MessageChannelStateMachine.createAndTransferChannel(machine, worker);
|
|
40033
|
-
logger.trace
|
|
40077
|
+
logger.trace `[${machine.name}] Worker spawned ${channel.currentState()}`;
|
|
40034
40078
|
return channel;
|
|
40035
40079
|
}
|
|
40036
40080
|
|
|
@@ -40143,7 +40187,7 @@ class MainReady extends State {
|
|
|
40143
40187
|
if (res instanceof Uint8Array) {
|
|
40144
40188
|
return bytes_Bytes.fromBlob(res, hash_HASH_SIZE).asOpaque();
|
|
40145
40189
|
}
|
|
40146
|
-
state_machine_logger.error
|
|
40190
|
+
state_machine_logger.error `Invalid response for getBestStateRootHash. Expected Uint8Array, got: ${res}`;
|
|
40147
40191
|
return bytes_Bytes.zero(hash_HASH_SIZE).asOpaque();
|
|
40148
40192
|
}
|
|
40149
40193
|
finish(channel) {
|
|
@@ -40191,7 +40235,7 @@ class ImporterReady extends State {
|
|
|
40191
40235
|
}
|
|
40192
40236
|
async getStateEntries(hash) {
|
|
40193
40237
|
if (this.importer === null) {
|
|
40194
|
-
state_machine_logger.error
|
|
40238
|
+
state_machine_logger.error `${this.constructor.name} importer not initialized yet!`;
|
|
40195
40239
|
await new Promise((resolve) => {
|
|
40196
40240
|
this.onImporter.once(resolve);
|
|
40197
40241
|
});
|
|
@@ -40205,7 +40249,7 @@ class ImporterReady extends State {
|
|
|
40205
40249
|
response: encoded.raw,
|
|
40206
40250
|
};
|
|
40207
40251
|
}
|
|
40208
|
-
state_machine_logger.error
|
|
40252
|
+
state_machine_logger.error `${this.constructor.name} got invalid request type: ${JSON.stringify(hash)}.`;
|
|
40209
40253
|
return {
|
|
40210
40254
|
response: null,
|
|
40211
40255
|
};
|
|
@@ -40225,7 +40269,7 @@ class ImporterReady extends State {
|
|
|
40225
40269
|
}
|
|
40226
40270
|
async importBlock(block) {
|
|
40227
40271
|
if (this.importer === null) {
|
|
40228
|
-
state_machine_logger.error
|
|
40272
|
+
state_machine_logger.error `${this.constructor.name} importer not initialized yet!`;
|
|
40229
40273
|
await new Promise((resolve) => {
|
|
40230
40274
|
this.onImporter.once(resolve);
|
|
40231
40275
|
});
|
|
@@ -40245,8 +40289,8 @@ class ImporterReady extends State {
|
|
|
40245
40289
|
}
|
|
40246
40290
|
}
|
|
40247
40291
|
catch (e) {
|
|
40248
|
-
state_machine_logger.error
|
|
40249
|
-
state_machine_logger.error
|
|
40292
|
+
state_machine_logger.error `Failed to import block: ${e}`;
|
|
40293
|
+
state_machine_logger.error `${e instanceof Error ? e.stack : ""}`;
|
|
40250
40294
|
response = result_Result.error(`${e}`);
|
|
40251
40295
|
}
|
|
40252
40296
|
const encoded = encoder_Encoder.encodeObject(importBlockResultCodec, response);
|
|
@@ -40254,7 +40298,7 @@ class ImporterReady extends State {
|
|
|
40254
40298
|
response: encoded.raw,
|
|
40255
40299
|
};
|
|
40256
40300
|
}
|
|
40257
|
-
state_machine_logger.error
|
|
40301
|
+
state_machine_logger.error `${this.constructor.name} got invalid request type: ${JSON.stringify(block)}.`;
|
|
40258
40302
|
return {
|
|
40259
40303
|
response: null,
|
|
40260
40304
|
};
|
|
@@ -40266,7 +40310,7 @@ class ImporterReady extends State {
|
|
|
40266
40310
|
this.onBlock.emit(blockView);
|
|
40267
40311
|
}
|
|
40268
40312
|
else {
|
|
40269
|
-
state_machine_logger.error
|
|
40313
|
+
state_machine_logger.error `${this.constructor.name} got invalid signal type: ${JSON.stringify(block)}.`;
|
|
40270
40314
|
}
|
|
40271
40315
|
}
|
|
40272
40316
|
async endWork() {
|
|
@@ -40365,7 +40409,7 @@ class state_machine_MainReady extends State {
|
|
|
40365
40409
|
this.onNewBlocks.emit(blocks);
|
|
40366
40410
|
}
|
|
40367
40411
|
else {
|
|
40368
|
-
jam_network_state_machine_logger.error
|
|
40412
|
+
jam_network_state_machine_logger.error `${this.constructor.name} got invalid signal type: ${JSON.stringify(block)}.`;
|
|
40369
40413
|
}
|
|
40370
40414
|
}
|
|
40371
40415
|
announceHeader(port, header) {
|
|
@@ -40403,7 +40447,7 @@ class NetworkReady extends State {
|
|
|
40403
40447
|
this.onNewHeader.emit(decoded);
|
|
40404
40448
|
}
|
|
40405
40449
|
else {
|
|
40406
|
-
jam_network_state_machine_logger.error
|
|
40450
|
+
jam_network_state_machine_logger.error `${this.constructor.name} got invalid signal type: ${JSON.stringify(header)}.`;
|
|
40407
40451
|
}
|
|
40408
40452
|
}
|
|
40409
40453
|
sendBlocks(port, blocks) {
|
|
@@ -41983,6 +42027,17 @@ class PageRange {
|
|
|
41983
42027
|
}
|
|
41984
42028
|
return new PageRange(start, length);
|
|
41985
42029
|
}
|
|
42030
|
+
/** Returns true if the page range is wrapped (`start` >= `end`) and is not empty */
|
|
42031
|
+
isWrapped() {
|
|
42032
|
+
return this.start >= this.end && !this.isEmpty();
|
|
42033
|
+
}
|
|
42034
|
+
/** Checks if given page number is within the range */
|
|
42035
|
+
isInRange(page) {
|
|
42036
|
+
if (this.isWrapped()) {
|
|
42037
|
+
return page >= this.start || page < this.end;
|
|
42038
|
+
}
|
|
42039
|
+
return page >= this.start && page < this.end;
|
|
42040
|
+
}
|
|
41986
42041
|
/** Checks if a range is empty (`length === 0`) */
|
|
41987
42042
|
isEmpty() {
|
|
41988
42043
|
return this.length === 0;
|
|
@@ -42111,12 +42166,14 @@ class WriteablePage extends MemoryPage {
|
|
|
42111
42166
|
|
|
42112
42167
|
|
|
42113
42168
|
|
|
42169
|
+
|
|
42170
|
+
|
|
42114
42171
|
var AccessType;
|
|
42115
42172
|
(function (AccessType) {
|
|
42116
42173
|
AccessType[AccessType["READ"] = 0] = "READ";
|
|
42117
42174
|
AccessType[AccessType["WRITE"] = 1] = "WRITE";
|
|
42118
42175
|
})(AccessType || (AccessType = {}));
|
|
42119
|
-
|
|
42176
|
+
const memory_logger = Logger.new(import.meta.filename, "pvm:mem");
|
|
42120
42177
|
class Memory {
|
|
42121
42178
|
sbrkIndex;
|
|
42122
42179
|
virtualSbrkIndex;
|
|
@@ -42147,7 +42204,7 @@ class Memory {
|
|
|
42147
42204
|
if (bytes.length === 0) {
|
|
42148
42205
|
return result_Result.ok(result_OK);
|
|
42149
42206
|
}
|
|
42150
|
-
|
|
42207
|
+
memory_logger.insane `MEM[${address}] <- ${bytes_BytesBlob.blobFrom(bytes)}`;
|
|
42151
42208
|
const pagesResult = this.getPages(address, bytes.length, AccessType.WRITE);
|
|
42152
42209
|
if (pagesResult.isError) {
|
|
42153
42210
|
return result_Result.error(pagesResult.error);
|
|
@@ -42214,7 +42271,7 @@ class Memory {
|
|
|
42214
42271
|
currentPosition += bytesToRead;
|
|
42215
42272
|
bytesLeft -= bytesToRead;
|
|
42216
42273
|
}
|
|
42217
|
-
|
|
42274
|
+
memory_logger.insane `MEM[${startAddress}] => ${bytes_BytesBlob.blobFrom(result)}`;
|
|
42218
42275
|
return result_Result.ok(result_OK);
|
|
42219
42276
|
}
|
|
42220
42277
|
sbrk(length) {
|
|
@@ -42360,10 +42417,11 @@ class MemoryBuilder {
|
|
|
42360
42417
|
startHeapIndex (${startHeapIndex}) has to be less than or equal to endHeapIndex (${endHeapIndex})
|
|
42361
42418
|
`;
|
|
42362
42419
|
this.ensureNotFinalized();
|
|
42363
|
-
const
|
|
42364
|
-
const
|
|
42365
|
-
|
|
42366
|
-
|
|
42420
|
+
const heapRange = MemoryRange.fromStartAndLength(startHeapIndex, endHeapIndex - startHeapIndex);
|
|
42421
|
+
const heapPagesRange = PageRange.fromMemoryRange(heapRange);
|
|
42422
|
+
const initializedPageNumbers = Array.from(this.initialMemory.keys());
|
|
42423
|
+
for (const pageNumber of initializedPageNumbers) {
|
|
42424
|
+
if (heapPagesRange.isInRange(pageNumber)) {
|
|
42367
42425
|
throw new IncorrectSbrkIndex();
|
|
42368
42426
|
}
|
|
42369
42427
|
}
|
|
@@ -44144,7 +44202,7 @@ class ProgramDecoder {
|
|
|
44144
44202
|
return result_Result.ok(new ProgramDecoder(program));
|
|
44145
44203
|
}
|
|
44146
44204
|
catch (e) {
|
|
44147
|
-
program_decoder_logger.error
|
|
44205
|
+
program_decoder_logger.error `Invalid program: ${e}`;
|
|
44148
44206
|
return result_Result.error(ProgramDecoderError.InvalidProgramError);
|
|
44149
44207
|
}
|
|
44150
44208
|
}
|
|
@@ -44310,7 +44368,7 @@ class Interpreter {
|
|
|
44310
44368
|
const argsType = instructionArgumentTypeMap[currentInstruction] ?? ArgumentType.NO_ARGUMENTS;
|
|
44311
44369
|
const argsResult = this.argsDecodingResults[argsType];
|
|
44312
44370
|
this.argsDecoder.fillArgs(this.pc, argsResult);
|
|
44313
|
-
interpreter_logger.insane
|
|
44371
|
+
interpreter_logger.insane `[PC: ${this.pc}] ${Instruction[currentInstruction]}`;
|
|
44314
44372
|
if (!isValidInstruction) {
|
|
44315
44373
|
this.instructionResult.status = pvm_interpreter_result_Result.PANIC;
|
|
44316
44374
|
}
|
|
@@ -44382,7 +44440,7 @@ class Interpreter {
|
|
|
44382
44440
|
this.status = status_Status.HOST;
|
|
44383
44441
|
break;
|
|
44384
44442
|
}
|
|
44385
|
-
interpreter_logger.insane
|
|
44443
|
+
interpreter_logger.insane `[PC: ${this.pc}] Status: ${pvm_interpreter_result_Result[this.instructionResult.status]}`;
|
|
44386
44444
|
return this.status;
|
|
44387
44445
|
}
|
|
44388
44446
|
this.pc = this.instructionResult.nextPc;
|
|
@@ -44629,7 +44687,7 @@ class host_calls_manager_HostCallsManager {
|
|
|
44629
44687
|
return `r${idx}=${value} (0x${value.toString(16)})`;
|
|
44630
44688
|
})
|
|
44631
44689
|
.join(", ");
|
|
44632
|
-
host_calls_manager_logger.insane
|
|
44690
|
+
host_calls_manager_logger.insane `[${currentServiceId}] ${context} ${name}${requested}. Gas: ${gas}. Regs: ${registerValues}.`;
|
|
44633
44691
|
}
|
|
44634
44692
|
}
|
|
44635
44693
|
class NoopMissing {
|
|
@@ -45237,7 +45295,7 @@ class block_generator_state_machine_MainReady extends State {
|
|
|
45237
45295
|
this.onBlock.emit(block);
|
|
45238
45296
|
}
|
|
45239
45297
|
else {
|
|
45240
|
-
block_generator_state_machine_logger.error
|
|
45298
|
+
block_generator_state_machine_logger.error `${this.constructor.name} got invalid signal type: ${JSON.stringify(block)}.`;
|
|
45241
45299
|
}
|
|
45242
45300
|
}
|
|
45243
45301
|
finish(channel) {
|
|
@@ -45292,12 +45350,12 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
|
|
|
45292
45350
|
channel
|
|
45293
45351
|
.then((channel) => main(channel))
|
|
45294
45352
|
.catch((e) => {
|
|
45295
|
-
block_generator_logger.error
|
|
45353
|
+
block_generator_logger.error `${e}`;
|
|
45296
45354
|
if (e.stack !== undefined) {
|
|
45297
|
-
block_generator_logger.error
|
|
45355
|
+
block_generator_logger.error `${e.stack}`;
|
|
45298
45356
|
}
|
|
45299
45357
|
if (e.cause !== undefined) {
|
|
45300
|
-
block_generator_logger.error
|
|
45358
|
+
block_generator_logger.error `${e.cause}`;
|
|
45301
45359
|
}
|
|
45302
45360
|
});
|
|
45303
45361
|
}
|
|
@@ -45305,7 +45363,7 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
|
|
|
45305
45363
|
* The `BlockGenerator` should periodically create new blocks and send them as signals to the main thread.
|
|
45306
45364
|
*/
|
|
45307
45365
|
async function main(channel) {
|
|
45308
|
-
block_generator_logger.info
|
|
45366
|
+
block_generator_logger.info `🎁 Block Generator running ${channel.currentState()}`;
|
|
45309
45367
|
// Await the configuration object
|
|
45310
45368
|
const ready = await channel.waitForState("ready(generator)");
|
|
45311
45369
|
const config = ready.currentState().getConfig();
|
|
@@ -45320,11 +45378,11 @@ async function main(channel) {
|
|
|
45320
45378
|
await (0,promises_namespaceObject.setTimeout)(config.chainSpec.slotDuration * 1000);
|
|
45321
45379
|
counter += 1;
|
|
45322
45380
|
const newBlock = await generator.nextEncodedBlock();
|
|
45323
|
-
block_generator_logger.trace
|
|
45381
|
+
block_generator_logger.trace `Sending block ${counter}`;
|
|
45324
45382
|
worker.sendBlock(port, newBlock);
|
|
45325
45383
|
}
|
|
45326
45384
|
});
|
|
45327
|
-
block_generator_logger.info
|
|
45385
|
+
block_generator_logger.info `Block Generator finished. Closing channel.`;
|
|
45328
45386
|
// Close the comms to gracefully close the app.
|
|
45329
45387
|
finished.currentState().close(channel);
|
|
45330
45388
|
}
|
|
@@ -45439,11 +45497,11 @@ class PeersManagement {
|
|
|
45439
45497
|
_onPeerDisconnected = [];
|
|
45440
45498
|
peers = new Map();
|
|
45441
45499
|
peerConnected(peer) {
|
|
45442
|
-
peers_logger.info
|
|
45500
|
+
peers_logger.info `💡 Peer ${displayId(peer)} connected.`;
|
|
45443
45501
|
const oldPeerData = this.peers.get(peer.id);
|
|
45444
45502
|
if (oldPeerData !== undefined) {
|
|
45445
45503
|
// TODO [ToDr] replacing old connection?
|
|
45446
|
-
peers_logger.warn
|
|
45504
|
+
peers_logger.warn `Replacing older connection.`;
|
|
45447
45505
|
}
|
|
45448
45506
|
this.peers.set(peer.id, peer);
|
|
45449
45507
|
for (const callback of this._onPeerConnected) {
|
|
@@ -45451,7 +45509,7 @@ class PeersManagement {
|
|
|
45451
45509
|
}
|
|
45452
45510
|
}
|
|
45453
45511
|
peerDisconnected(peer) {
|
|
45454
|
-
peers_logger.info
|
|
45512
|
+
peers_logger.info `⚡︎Peer ${displayId(peer)} disconnected.`;
|
|
45455
45513
|
this.peers.delete(peer.id);
|
|
45456
45514
|
for (const callback of this._onPeerDisconnected) {
|
|
45457
45515
|
callback(peer);
|
|
@@ -54243,23 +54301,23 @@ var VerifyCertError;
|
|
|
54243
54301
|
VerifyCertError[VerifyCertError["IncorrectSignature"] = 4] = "IncorrectSignature";
|
|
54244
54302
|
})(VerifyCertError || (VerifyCertError = {}));
|
|
54245
54303
|
async function verifyCertificate(certs) {
|
|
54246
|
-
certificate_logger.log
|
|
54304
|
+
certificate_logger.log `Incoming peer. Verifying certificate`;
|
|
54247
54305
|
// Must present exactly one cert
|
|
54248
54306
|
if (certs.length !== 1) {
|
|
54249
|
-
certificate_logger.log
|
|
54307
|
+
certificate_logger.log `Rejecting peer: expected exactly one certificate, got: ${certs.length}`;
|
|
54250
54308
|
return result_Result.error(VerifyCertError.NoCertificate);
|
|
54251
54309
|
}
|
|
54252
54310
|
// Parse with Node's X509Certificate (accepts PEM or DER)
|
|
54253
54311
|
const xc = new (external_node_crypto_default()).X509Certificate(certs[0]);
|
|
54254
54312
|
// Must be Ed25519 key
|
|
54255
54313
|
if (xc.publicKey.asymmetricKeyType !== CURVE_NAME.toLowerCase()) {
|
|
54256
|
-
certificate_logger.log
|
|
54314
|
+
certificate_logger.log `Rejecting peer using non-ed25519 certificate: ${xc.publicKey.asymmetricKeyType}`;
|
|
54257
54315
|
return result_Result.error(VerifyCertError.NotEd25519);
|
|
54258
54316
|
}
|
|
54259
54317
|
// Extract raw public key via JWK export
|
|
54260
54318
|
const jwk = xc.publicKey.export({ format: "jwk" });
|
|
54261
54319
|
if (jwk.kty !== KEY_TYPE || jwk.crv !== CURVE_NAME) {
|
|
54262
|
-
certificate_logger.log
|
|
54320
|
+
certificate_logger.log `Public key type mismatch: ${jwk.kty}, ${jwk.crv}`;
|
|
54263
54321
|
return result_Result.error(VerifyCertError.PublicKeyTypeMismatch);
|
|
54264
54322
|
}
|
|
54265
54323
|
// SAN must be exactly 'e'+base32(rawPub)
|
|
@@ -54267,7 +54325,7 @@ async function verifyCertificate(certs) {
|
|
|
54267
54325
|
const sanField = xc.subjectAltName ?? "";
|
|
54268
54326
|
const m = sanField.match(/DNS:([^,]+)/);
|
|
54269
54327
|
if (m === null || m[1] !== expectedSan) {
|
|
54270
|
-
certificate_logger.log
|
|
54328
|
+
certificate_logger.log `AltName mismatch. Expected: '${expectedSan}', got: '${m?.[1]}'`;
|
|
54271
54329
|
return result_Result.error(VerifyCertError.AltNameMismatch);
|
|
54272
54330
|
}
|
|
54273
54331
|
const key = Buffer.from(jwk.x ?? "", "base64url");
|
|
@@ -54534,19 +54592,19 @@ class QuicNetwork {
|
|
|
54534
54592
|
}
|
|
54535
54593
|
this.started = true;
|
|
54536
54594
|
await this.socket.start({ host: this.listen.host, port: this.listen.port });
|
|
54537
|
-
quic_network_logger.info
|
|
54595
|
+
quic_network_logger.info `🛜 QUIC socket on ${this.socket.host}:${this.socket.port}`;
|
|
54538
54596
|
await this.server.start();
|
|
54539
|
-
quic_network_logger.log
|
|
54597
|
+
quic_network_logger.log `🛜 QUIC server listening`;
|
|
54540
54598
|
}
|
|
54541
54599
|
async stop() {
|
|
54542
54600
|
if (!this.started) {
|
|
54543
54601
|
throw new Error("Network not started yet!");
|
|
54544
54602
|
}
|
|
54545
|
-
quic_network_logger.info
|
|
54603
|
+
quic_network_logger.info `Stopping the networking.`;
|
|
54546
54604
|
await this.server.stop();
|
|
54547
54605
|
await this.socket.stop();
|
|
54548
54606
|
this.started = false;
|
|
54549
|
-
quic_network_logger.info
|
|
54607
|
+
quic_network_logger.info `Networking stopped.`;
|
|
54550
54608
|
}
|
|
54551
54609
|
get peers() {
|
|
54552
54610
|
return this._peers;
|
|
@@ -54567,7 +54625,7 @@ clazz, callback) {
|
|
|
54567
54625
|
await callback(ev);
|
|
54568
54626
|
}
|
|
54569
54627
|
catch (e) {
|
|
54570
|
-
quic_utils_logger.error
|
|
54628
|
+
quic_utils_logger.error `Unhandled exception in ${clazz.name} event handler: ${e}`;
|
|
54571
54629
|
}
|
|
54572
54630
|
});
|
|
54573
54631
|
}
|
|
@@ -54626,7 +54684,7 @@ class QuicPeer {
|
|
|
54626
54684
|
streamEvents = new (external_node_events_default())();
|
|
54627
54685
|
constructor(conn, peerInfo) {
|
|
54628
54686
|
this.conn = conn;
|
|
54629
|
-
quic_peer_logger.log
|
|
54687
|
+
quic_peer_logger.log `👥 [${peerInfo.id}] peer connected ${conn.remoteHost}:${conn.remotePort}`;
|
|
54630
54688
|
this.connectionId = conn.connectionIdShared.toString();
|
|
54631
54689
|
this.address = {
|
|
54632
54690
|
host: conn.remoteHost,
|
|
@@ -54636,11 +54694,11 @@ class QuicPeer {
|
|
|
54636
54694
|
this.key = peerInfo.key;
|
|
54637
54695
|
addEventListener(conn, EventQUICConnectionStream, (ev) => {
|
|
54638
54696
|
const stream = ev.detail;
|
|
54639
|
-
quic_peer_logger.log
|
|
54697
|
+
quic_peer_logger.log `🚰 [${this.id}] new stream: [${stream.streamId}]`;
|
|
54640
54698
|
this.streamEvents.emit("stream", new QuicStream(stream));
|
|
54641
54699
|
});
|
|
54642
54700
|
addEventListener(conn, EventQUICConnectionError, (err) => {
|
|
54643
|
-
quic_peer_logger.error
|
|
54701
|
+
quic_peer_logger.error `❌ [${this.id}] connection failed: ${err.detail}`;
|
|
54644
54702
|
});
|
|
54645
54703
|
}
|
|
54646
54704
|
addOnIncomingStream(streamCallback) {
|
|
@@ -54648,11 +54706,11 @@ class QuicPeer {
|
|
|
54648
54706
|
}
|
|
54649
54707
|
openStream() {
|
|
54650
54708
|
const stream = this.conn.newStream("bidi");
|
|
54651
|
-
quic_peer_logger.log
|
|
54709
|
+
quic_peer_logger.log `🚰 [${this.id}] opening stream: [${stream.streamId}]`;
|
|
54652
54710
|
return new QuicStream(stream);
|
|
54653
54711
|
}
|
|
54654
54712
|
async disconnect() {
|
|
54655
|
-
quic_peer_logger.log
|
|
54713
|
+
quic_peer_logger.log `👋 [${this.id}] disconnecting`;
|
|
54656
54714
|
await this.conn.stop({ isApp: true });
|
|
54657
54715
|
}
|
|
54658
54716
|
}
|
|
@@ -54673,7 +54731,7 @@ const setup_logger = Logger.new(import.meta.filename, "net");
|
|
|
54673
54731
|
class Quic {
|
|
54674
54732
|
/** Setup QUIC socket and start listening for connections. */
|
|
54675
54733
|
static async setup({ host, port, protocols, key }) {
|
|
54676
|
-
const quicLoggerLvl =
|
|
54734
|
+
const quicLoggerLvl = setup_logger.getLevel() > Level.TRACE ? LogLevel.WARN : LogLevel.DEBUG;
|
|
54677
54735
|
const quicLogger = new dist_Logger("quic", quicLoggerLvl, [
|
|
54678
54736
|
new handlers_StreamHandler(format `${level}:${keys}:${msg}`),
|
|
54679
54737
|
]);
|
|
@@ -54696,7 +54754,7 @@ class Quic {
|
|
|
54696
54754
|
verifyPeer: true,
|
|
54697
54755
|
verifyCallback: lastConnectedPeer.verifyCallback,
|
|
54698
54756
|
};
|
|
54699
|
-
setup_logger.info
|
|
54757
|
+
setup_logger.info `🆔 Peer id: ** ${altNameRaw(key.pubKey)}@${host}:${port} ** (pubkey: ${key.pubKey})`;
|
|
54700
54758
|
// Shared injected UDP socket
|
|
54701
54759
|
const socket = new dist_QUICSocket({
|
|
54702
54760
|
logger: quicLogger.getChild("socket"),
|
|
@@ -54711,8 +54769,8 @@ class Quic {
|
|
|
54711
54769
|
// peer management
|
|
54712
54770
|
const peers = new PeersManagement();
|
|
54713
54771
|
// basic error handling
|
|
54714
|
-
addEventListener(server, EventQUICServerError, (error) => setup_logger.error
|
|
54715
|
-
addEventListener(server, EventQUICServerClose, (ev) => setup_logger.error
|
|
54772
|
+
addEventListener(server, EventQUICServerError, (error) => setup_logger.error `🛜 Server error: ${error}`);
|
|
54773
|
+
addEventListener(server, EventQUICServerClose, (ev) => setup_logger.error `🛜 Server stopped: ${ev}`);
|
|
54716
54774
|
// handling incoming session
|
|
54717
54775
|
addEventListener(server, EventQUICServerConnection, async (ev) => {
|
|
54718
54776
|
const conn = ev.detail;
|
|
@@ -54721,16 +54779,16 @@ class Quic {
|
|
|
54721
54779
|
return;
|
|
54722
54780
|
}
|
|
54723
54781
|
if (lastConnectedPeer.info.key.isEqualTo(key.pubKey)) {
|
|
54724
|
-
setup_logger.log
|
|
54782
|
+
setup_logger.log `🛜 Rejecting connection from ourself from ${conn.remoteHost}:${conn.remotePort}`;
|
|
54725
54783
|
await conn.stop();
|
|
54726
54784
|
return;
|
|
54727
54785
|
}
|
|
54728
54786
|
if (peers.isConnected(lastConnectedPeer.info.id)) {
|
|
54729
|
-
setup_logger.log
|
|
54787
|
+
setup_logger.log `🛜 Rejecting duplicate connection with peer ${lastConnectedPeer.info.id} from ${conn.remoteHost}:${conn.remotePort}`;
|
|
54730
54788
|
await conn.stop();
|
|
54731
54789
|
return;
|
|
54732
54790
|
}
|
|
54733
|
-
setup_logger.log
|
|
54791
|
+
setup_logger.log `🛜 Server handshake with ${conn.remoteHost}:${conn.remotePort}`;
|
|
54734
54792
|
newPeer(conn, lastConnectedPeer.info);
|
|
54735
54793
|
lastConnectedPeer.info = null;
|
|
54736
54794
|
await conn.start();
|
|
@@ -54753,10 +54811,10 @@ class Quic {
|
|
|
54753
54811
|
});
|
|
54754
54812
|
const client = await clientLater;
|
|
54755
54813
|
addEventListener(client, EventQUICClientClose, () => {
|
|
54756
|
-
setup_logger.log
|
|
54814
|
+
setup_logger.log `⚰️ Client connection closed.`;
|
|
54757
54815
|
});
|
|
54758
54816
|
addEventListener(client, EventQUICClientError, (error) => {
|
|
54759
|
-
setup_logger.error
|
|
54817
|
+
setup_logger.error `🔴 Client error: ${error.detail}`;
|
|
54760
54818
|
});
|
|
54761
54819
|
if (peerDetails.info === null) {
|
|
54762
54820
|
throw new Error("Client connected, but there is no peer details!");
|
|
@@ -54764,7 +54822,7 @@ class Quic {
|
|
|
54764
54822
|
if (options.verifyName !== undefined && options.verifyName !== peerDetails.info.id) {
|
|
54765
54823
|
throw new Error(`Client connected, but the id didn't match. Expected: ${options.verifyName}, got: ${peerDetails.info.id}`);
|
|
54766
54824
|
}
|
|
54767
|
-
setup_logger.log
|
|
54825
|
+
setup_logger.log `🤝 Client handshake with: ${peer.host}:${peer.port}`;
|
|
54768
54826
|
return newPeer(client.connection, peerDetails.info);
|
|
54769
54827
|
}
|
|
54770
54828
|
function newPeer(conn, peerInfo) {
|
|
@@ -54884,10 +54942,10 @@ class Connections {
|
|
|
54884
54942
|
for (;;) {
|
|
54885
54943
|
// increase the reconnection counter
|
|
54886
54944
|
meta.currentRetry += 1;
|
|
54887
|
-
if (meta.currentRetry
|
|
54945
|
+
if (meta.currentRetry > meta.maxRetries) {
|
|
54888
54946
|
// reached max retries for a peer, remove it from tracking.
|
|
54889
54947
|
this.peerInfo.delete(id);
|
|
54890
|
-
jamnp_s_peers_logger.log
|
|
54948
|
+
jamnp_s_peers_logger.log `[${id}] max retries reached. Removing peer.`;
|
|
54891
54949
|
return;
|
|
54892
54950
|
}
|
|
54893
54951
|
// else attempt to connect to a node a bit later.
|
|
@@ -54906,7 +54964,7 @@ class Connections {
|
|
|
54906
54964
|
}
|
|
54907
54965
|
// attempt to connect to the peer
|
|
54908
54966
|
try {
|
|
54909
|
-
jamnp_s_peers_logger.trace
|
|
54967
|
+
jamnp_s_peers_logger.trace `[${id}] Attempting to connect to peer at ${meta.address.host}:${meta.address.port}.`;
|
|
54910
54968
|
await this.network.dial(meta.address, { signal, verifyName: meta.peerId });
|
|
54911
54969
|
return;
|
|
54912
54970
|
}
|
|
@@ -54915,7 +54973,7 @@ class Connections {
|
|
|
54915
54973
|
return;
|
|
54916
54974
|
}
|
|
54917
54975
|
// failing to connect, will retry.
|
|
54918
|
-
jamnp_s_peers_logger.trace
|
|
54976
|
+
jamnp_s_peers_logger.trace `[${id}] attempt failed. Will retry (${meta.currentRetry}/${meta.maxRetries})`;
|
|
54919
54977
|
}
|
|
54920
54978
|
}
|
|
54921
54979
|
}
|
|
@@ -55028,7 +55086,7 @@ class StreamManager {
|
|
|
55028
55086
|
// We expect a one-byte identifier first.
|
|
55029
55087
|
const data = await reader.read();
|
|
55030
55088
|
bytes = bytes_BytesBlob.blobFrom(data.value !== undefined ? data.value : new Uint8Array());
|
|
55031
|
-
stream_manager_logger.trace
|
|
55089
|
+
stream_manager_logger.trace `🚰 --> [${peer.id}:${streamId}] Initial data: ${bytes}`;
|
|
55032
55090
|
}
|
|
55033
55091
|
finally {
|
|
55034
55092
|
reader.releaseLock();
|
|
@@ -55042,7 +55100,7 @@ class StreamManager {
|
|
|
55042
55100
|
if (handler === undefined) {
|
|
55043
55101
|
throw new Error(`Unsupported stream kind: ${kind}`);
|
|
55044
55102
|
}
|
|
55045
|
-
stream_manager_logger.log
|
|
55103
|
+
stream_manager_logger.log `🚰 --> [${peer.id}:${stream.streamId}] Stream identified as: ${kind}`;
|
|
55046
55104
|
this.registerStream(peer, handler, stream, bytes_BytesBlob.blobFrom(bytes.raw.subarray(1)));
|
|
55047
55105
|
}
|
|
55048
55106
|
registerStream(peer, handler, stream, initialData) {
|
|
@@ -55052,7 +55110,7 @@ class StreamManager {
|
|
|
55052
55110
|
this.streams.delete(streamId);
|
|
55053
55111
|
this.backgroundTasks.delete(streamId);
|
|
55054
55112
|
if (kind === StreamErrorKind.Exception) {
|
|
55055
|
-
stream_manager_logger.error
|
|
55113
|
+
stream_manager_logger.error `🚰 --- [${peer.id}:${streamId}] Stream error: ${e}. Disconnecting peer.`;
|
|
55056
55114
|
}
|
|
55057
55115
|
if (kind !== StreamErrorKind.LocalClose) {
|
|
55058
55116
|
// whenever we have an error, we are going to inform the handler
|
|
@@ -55086,10 +55144,10 @@ async function readStreamForever(peer, handler, quicStream, initialData, reader)
|
|
|
55086
55144
|
let isDone = false;
|
|
55087
55145
|
const callback = handleMessageFragmentation((data) => {
|
|
55088
55146
|
const bytes = bytes_BytesBlob.blobFrom(new Uint8Array(data));
|
|
55089
|
-
stream_manager_logger.trace
|
|
55147
|
+
stream_manager_logger.trace `🚰 --> [${peer.id}:${quicStream.streamId}] ${bytes}`;
|
|
55090
55148
|
handler.onStreamMessage(quicStream, bytes);
|
|
55091
55149
|
}, () => {
|
|
55092
|
-
stream_manager_logger.error
|
|
55150
|
+
stream_manager_logger.error `🚰 --> [${peer.id}:${quicStream.streamId}] got too much data. Disconnecting.`;
|
|
55093
55151
|
peer.disconnect();
|
|
55094
55152
|
});
|
|
55095
55153
|
for (;;) {
|
|
@@ -55098,7 +55156,7 @@ async function readStreamForever(peer, handler, quicStream, initialData, reader)
|
|
|
55098
55156
|
// be a promise, so that we can make back pressure here.
|
|
55099
55157
|
callback(bytes.raw);
|
|
55100
55158
|
if (isDone) {
|
|
55101
|
-
stream_manager_logger.log
|
|
55159
|
+
stream_manager_logger.log `🚰 --> [${peer.id}:${quicStream.streamId}] remote finished.`;
|
|
55102
55160
|
return;
|
|
55103
55161
|
}
|
|
55104
55162
|
// await for more data
|
|
@@ -55141,7 +55199,7 @@ class QuicStreamSender {
|
|
|
55141
55199
|
return;
|
|
55142
55200
|
}
|
|
55143
55201
|
const { data, addPrefix } = chunk;
|
|
55144
|
-
stream_manager_logger.trace
|
|
55202
|
+
stream_manager_logger.trace `🚰 <-- [${this.streamId}] write: ${data}`;
|
|
55145
55203
|
if (addPrefix) {
|
|
55146
55204
|
await writer.write(encodeMessageLength(data.raw));
|
|
55147
55205
|
}
|
|
@@ -55158,7 +55216,7 @@ class QuicStreamSender {
|
|
|
55158
55216
|
}
|
|
55159
55217
|
close() {
|
|
55160
55218
|
handleAsyncErrors(async () => {
|
|
55161
|
-
stream_manager_logger.trace
|
|
55219
|
+
stream_manager_logger.trace `🚰 <-- [${this.streamId}] closing`;
|
|
55162
55220
|
if (this.currentWriterPromise !== null) {
|
|
55163
55221
|
await this.currentWriterPromise;
|
|
55164
55222
|
}
|
|
@@ -55244,7 +55302,7 @@ class ServerHandler {
|
|
|
55244
55302
|
}
|
|
55245
55303
|
onStreamMessage(sender, message) {
|
|
55246
55304
|
const request = decoder_Decoder.decodeObject(BlockRequest.Codec, message);
|
|
55247
|
-
ce_128_block_request_logger.log
|
|
55305
|
+
ce_128_block_request_logger.log `[${sender.streamId}] Client has requested: ${request}`;
|
|
55248
55306
|
const blocks = this.getBlockSequence(sender.streamId, request.headerHash, request.direction, request.maxBlocks);
|
|
55249
55307
|
sender.bufferAndSend(encoder_Encoder.encodeObject(descriptors_codec.sequenceFixLen(Block.Codec.View, blocks.length), blocks, this.chainSpec));
|
|
55250
55308
|
sender.close();
|
|
@@ -55264,7 +55322,7 @@ class ClientHandler {
|
|
|
55264
55322
|
throw new Error("Received an unexpected message from the server.");
|
|
55265
55323
|
}
|
|
55266
55324
|
const blocks = decoder_Decoder.decodeSequence(Block.Codec.View, message, this.chainSpec);
|
|
55267
|
-
ce_128_block_request_logger.log
|
|
55325
|
+
ce_128_block_request_logger.log `[${sender.streamId}] Server returned ${blocks.length} blocks in ${message.length} bytes of data.`;
|
|
55268
55326
|
this.promiseResolvers.get(sender.streamId)?.(blocks);
|
|
55269
55327
|
this.promiseResolvers.delete(sender.streamId);
|
|
55270
55328
|
}
|
|
@@ -55435,13 +55493,13 @@ class ce_129_state_request_Handler {
|
|
|
55435
55493
|
}
|
|
55436
55494
|
onStreamMessage(sender, message) {
|
|
55437
55495
|
if (this.isServer) {
|
|
55438
|
-
ce_129_state_request_logger.info
|
|
55496
|
+
ce_129_state_request_logger.info `[${sender.streamId}][server]: Received request.`;
|
|
55439
55497
|
if (this.getBoundaryNodes === undefined || this.getKeyValuePairs === undefined)
|
|
55440
55498
|
return;
|
|
55441
55499
|
const request = decoder_Decoder.decodeObject(StateRequest.Codec, message);
|
|
55442
55500
|
const boundaryNodes = this.getBoundaryNodes(request.headerHash, request.startKey, request.endKey);
|
|
55443
55501
|
const keyValuePairs = this.getKeyValuePairs(request.headerHash, request.startKey, request.endKey);
|
|
55444
|
-
ce_129_state_request_logger.info
|
|
55502
|
+
ce_129_state_request_logger.info `[${sender.streamId}][server]: <-- responding with boundary nodes and key value pairs.`;
|
|
55445
55503
|
sender.bufferAndSend(encoder_Encoder.encodeObject(descriptors_codec.sequenceVarLen(trieNodeCodec), boundaryNodes));
|
|
55446
55504
|
sender.bufferAndSend(encoder_Encoder.encodeObject(StateResponse.Codec, StateResponse.create({ keyValuePairs })));
|
|
55447
55505
|
sender.close();
|
|
@@ -55449,11 +55507,11 @@ class ce_129_state_request_Handler {
|
|
|
55449
55507
|
}
|
|
55450
55508
|
if (!this.boundaryNodes.has(sender.streamId)) {
|
|
55451
55509
|
this.boundaryNodes.set(sender.streamId, decoder_Decoder.decodeObject(descriptors_codec.sequenceVarLen(trieNodeCodec), message));
|
|
55452
|
-
ce_129_state_request_logger.info
|
|
55510
|
+
ce_129_state_request_logger.info `[${sender.streamId}][client]: Received boundary nodes.`;
|
|
55453
55511
|
return;
|
|
55454
55512
|
}
|
|
55455
55513
|
this.onResponse.get(sender.streamId)?.(decoder_Decoder.decodeObject(StateResponse.Codec, message));
|
|
55456
|
-
ce_129_state_request_logger.info
|
|
55514
|
+
ce_129_state_request_logger.info `[${sender.streamId}][client]: Received state values.`;
|
|
55457
55515
|
}
|
|
55458
55516
|
onClose(streamId) {
|
|
55459
55517
|
this.boundaryNodes.delete(streamId);
|
|
@@ -55510,7 +55568,7 @@ class ce_131_ce_132_safrole_ticket_distribution_ServerHandler {
|
|
|
55510
55568
|
}
|
|
55511
55569
|
onStreamMessage(sender, message) {
|
|
55512
55570
|
const ticketDistribution = Decoder.decodeObject(TicketDistributionRequest.Codec, message);
|
|
55513
|
-
ce_131_ce_132_safrole_ticket_distribution_logger.log
|
|
55571
|
+
ce_131_ce_132_safrole_ticket_distribution_logger.log `[${sender.streamId}][ce-${this.kind}] Received ticket for epoch ${ticketDistribution.epochIndex}`;
|
|
55514
55572
|
this.onTicketReceived(ticketDistribution.epochIndex, ticketDistribution.ticket);
|
|
55515
55573
|
sender.close();
|
|
55516
55574
|
}
|
|
@@ -55522,7 +55580,7 @@ class ce_131_ce_132_safrole_ticket_distribution_ClientHandler {
|
|
|
55522
55580
|
this.kind = kind;
|
|
55523
55581
|
}
|
|
55524
55582
|
onStreamMessage(sender) {
|
|
55525
|
-
ce_131_ce_132_safrole_ticket_distribution_logger.warn
|
|
55583
|
+
ce_131_ce_132_safrole_ticket_distribution_logger.warn `[${sender.streamId}][ce-${this.kind}] Unexpected message received. Closing.`;
|
|
55526
55584
|
sender.close();
|
|
55527
55585
|
}
|
|
55528
55586
|
onClose() { }
|
|
@@ -55595,15 +55653,15 @@ class ce_133_work_package_submission_ServerHandler {
|
|
|
55595
55653
|
class ce_133_work_package_submission_ClientHandler {
|
|
55596
55654
|
kind = ce_133_work_package_submission_STREAM_KIND;
|
|
55597
55655
|
onStreamMessage(sender) {
|
|
55598
|
-
ce_133_work_package_submission_logger.warn
|
|
55656
|
+
ce_133_work_package_submission_logger.warn `[${sender.streamId}] Got unexpected message on CE-133 stream. Closing.`;
|
|
55599
55657
|
sender.close();
|
|
55600
55658
|
}
|
|
55601
55659
|
onClose() { }
|
|
55602
55660
|
sendWorkPackage(sender, coreIndex, workPackage, extrinsic) {
|
|
55603
55661
|
const corePack = CoreWorkPackage.create({ coreIndex, workPackage });
|
|
55604
|
-
ce_133_work_package_submission_logger.trace
|
|
55662
|
+
ce_133_work_package_submission_logger.trace `[${sender.streamId}] Sending work package: ${corePack}`;
|
|
55605
55663
|
sender.bufferAndSend(Encoder.encodeObject(CoreWorkPackage.Codec, corePack));
|
|
55606
|
-
ce_133_work_package_submission_logger.trace
|
|
55664
|
+
ce_133_work_package_submission_logger.trace `[${sender.streamId}] Sending extrinsics: ${workPackage.items}`;
|
|
55607
55665
|
sender.bufferAndSend(Encoder.encodeObject(workItemExtrinsicsCodec(workPackage.items), extrinsic));
|
|
55608
55666
|
// now close the connection
|
|
55609
55667
|
sender.close();
|
|
@@ -55679,7 +55737,7 @@ class ce_134_work_package_sharing_ServerHandler {
|
|
|
55679
55737
|
ce_134_work_package_sharing_ServerHandler.sendWorkReport(sender, workReportHash, signature);
|
|
55680
55738
|
})
|
|
55681
55739
|
.catch((error) => {
|
|
55682
|
-
ce_134_work_package_sharing_logger.error
|
|
55740
|
+
ce_134_work_package_sharing_logger.error `[${streamId}] Error processing work package: ${error}`;
|
|
55683
55741
|
this.onClose(streamId);
|
|
55684
55742
|
});
|
|
55685
55743
|
}
|
|
@@ -55696,7 +55754,7 @@ class ce_134_work_package_sharing_ClientHandler {
|
|
|
55696
55754
|
throw new Error("Unexpected message received.");
|
|
55697
55755
|
}
|
|
55698
55756
|
const response = Decoder.decodeObject(WorkPackageSharingResponse.Codec, message);
|
|
55699
|
-
ce_134_work_package_sharing_logger.info
|
|
55757
|
+
ce_134_work_package_sharing_logger.info `[${sender.streamId}] Received work report hash and signature.`;
|
|
55700
55758
|
pendingRequest.resolve({ workReportHash: response.workReportHash, signature: response.signature });
|
|
55701
55759
|
sender.close();
|
|
55702
55760
|
}
|
|
@@ -55709,9 +55767,9 @@ class ce_134_work_package_sharing_ClientHandler {
|
|
|
55709
55767
|
}
|
|
55710
55768
|
async sendWorkPackage(sender, coreIndex, segmentsRootMappings, workPackageBundle) {
|
|
55711
55769
|
const request = WorkPackageSharingRequest.create({ coreIndex, segmentsRootMappings });
|
|
55712
|
-
ce_134_work_package_sharing_logger.trace
|
|
55770
|
+
ce_134_work_package_sharing_logger.trace `[${sender.streamId}] Sending core index and segments-root mappings.`;
|
|
55713
55771
|
sender.bufferAndSend(Encoder.encodeObject(WorkPackageSharingRequest.Codec, request));
|
|
55714
|
-
ce_134_work_package_sharing_logger.trace
|
|
55772
|
+
ce_134_work_package_sharing_logger.trace `[${sender.streamId}] Sending work package bundle.`;
|
|
55715
55773
|
sender.bufferAndSend(Encoder.encodeObject(WorkPackageBundleCodec, workPackageBundle));
|
|
55716
55774
|
return new Promise((resolve, reject) => {
|
|
55717
55775
|
this.pendingRequests.set(sender.streamId, { resolve, reject });
|
|
@@ -55771,7 +55829,7 @@ class ce_135_work_report_distribution_ServerHandler {
|
|
|
55771
55829
|
}
|
|
55772
55830
|
onStreamMessage(sender, message) {
|
|
55773
55831
|
const guaranteedWorkReport = Decoder.decodeObject(GuaranteedWorkReport.Codec, message, this.chainSpec);
|
|
55774
|
-
ce_135_work_report_distribution_logger.log
|
|
55832
|
+
ce_135_work_report_distribution_logger.log `[${sender.streamId}] Received guaranteed work report.`;
|
|
55775
55833
|
this.onWorkReport(guaranteedWorkReport);
|
|
55776
55834
|
sender.close();
|
|
55777
55835
|
}
|
|
@@ -55784,12 +55842,12 @@ class ce_135_work_report_distribution_ClientHandler {
|
|
|
55784
55842
|
this.chainSpec = chainSpec;
|
|
55785
55843
|
}
|
|
55786
55844
|
onStreamMessage(sender) {
|
|
55787
|
-
ce_135_work_report_distribution_logger.warn
|
|
55845
|
+
ce_135_work_report_distribution_logger.warn `[${sender.streamId}] Got unexpected message on CE-135 stream. Closing.`;
|
|
55788
55846
|
sender.close();
|
|
55789
55847
|
}
|
|
55790
55848
|
onClose() { }
|
|
55791
55849
|
sendWorkReport(sender, workReport) {
|
|
55792
|
-
ce_135_work_report_distribution_logger.trace
|
|
55850
|
+
ce_135_work_report_distribution_logger.trace `[${sender.streamId}] Sending guaranteed work report.`;
|
|
55793
55851
|
sender.bufferAndSend(Encoder.encodeObject(GuaranteedWorkReport.Codec, workReport, this.chainSpec));
|
|
55794
55852
|
sender.close();
|
|
55795
55853
|
}
|
|
@@ -55895,7 +55953,7 @@ class up_0_block_announcement_Handler {
|
|
|
55895
55953
|
this.handshakes.set(streamId, handshake);
|
|
55896
55954
|
// we didn't initiate this handshake, so let's respond
|
|
55897
55955
|
if (!this.pendingHandshakes.delete(streamId)) {
|
|
55898
|
-
up_0_block_announcement_logger.log
|
|
55956
|
+
up_0_block_announcement_logger.log `[${streamId}] <-- responding with a handshake.`;
|
|
55899
55957
|
sender.bufferAndSend(encoder_Encoder.encodeObject(Handshake.Codec, this.getHandshake()));
|
|
55900
55958
|
}
|
|
55901
55959
|
this.onHandshake(streamId, handshake);
|
|
@@ -55903,7 +55961,7 @@ class up_0_block_announcement_Handler {
|
|
|
55903
55961
|
}
|
|
55904
55962
|
// it's just an announcement
|
|
55905
55963
|
const annoucement = decoder_Decoder.decodeObject(Announcement.Codec, message, this.spec);
|
|
55906
|
-
up_0_block_announcement_logger.log
|
|
55964
|
+
up_0_block_announcement_logger.log `[${streamId}] --> got blocks announcement: ${annoucement.final}`;
|
|
55907
55965
|
this.onAnnouncement(streamId, annoucement);
|
|
55908
55966
|
}
|
|
55909
55967
|
onClose(streamId) {
|
|
@@ -55916,7 +55974,7 @@ class up_0_block_announcement_Handler {
|
|
|
55916
55974
|
return;
|
|
55917
55975
|
}
|
|
55918
55976
|
const handshake = this.getHandshake();
|
|
55919
|
-
up_0_block_announcement_logger.trace
|
|
55977
|
+
up_0_block_announcement_logger.trace `[${streamId}] <-- sending handshake`;
|
|
55920
55978
|
this.pendingHandshakes.set(sender.streamId, true);
|
|
55921
55979
|
sender.bufferAndSend(encoder_Encoder.encodeObject(Handshake.Codec, handshake));
|
|
55922
55980
|
}
|
|
@@ -55924,11 +55982,11 @@ class up_0_block_announcement_Handler {
|
|
|
55924
55982
|
const { streamId } = sender;
|
|
55925
55983
|
// only send announcement if we've handshaken
|
|
55926
55984
|
if (this.handshakes.has(streamId)) {
|
|
55927
|
-
up_0_block_announcement_logger.trace
|
|
55985
|
+
up_0_block_announcement_logger.trace `[${streamId}] <-- sending block announcement: ${annoucement.final}`;
|
|
55928
55986
|
sender.bufferAndSend(encoder_Encoder.encodeObject(Announcement.Codec, annoucement, this.spec));
|
|
55929
55987
|
}
|
|
55930
55988
|
else {
|
|
55931
|
-
up_0_block_announcement_logger.warn
|
|
55989
|
+
up_0_block_announcement_logger.warn `[${streamId}] <-- no handshake yet, skipping announcement.`;
|
|
55932
55990
|
}
|
|
55933
55991
|
}
|
|
55934
55992
|
}
|
|
@@ -56045,7 +56103,7 @@ class SyncTask {
|
|
|
56045
56103
|
onUp0Annoucement(peer, announcement) {
|
|
56046
56104
|
const { hash, slot } = announcement.final;
|
|
56047
56105
|
const bestHeader = hashHeader(announcement.header, this.spec);
|
|
56048
|
-
sync_logger.info
|
|
56106
|
+
sync_logger.info `[${peer.id}] --> Received new header #${announcement.header.timeSlotIndex}: ${bestHeader.hash}`;
|
|
56049
56107
|
// NOTE [ToDr] Instead of having `Connections` store aux data perhaps
|
|
56050
56108
|
// we should maintain that directly? However that would require
|
|
56051
56109
|
// listening to peers connected/disconnected to perfrom some cleanups
|
|
@@ -56120,7 +56178,7 @@ class SyncTask {
|
|
|
56120
56178
|
const peers = this.connections.getConnectedPeers();
|
|
56121
56179
|
for (const peerInfo of peers) {
|
|
56122
56180
|
this.streamManager.withStreamOfKind(peerInfo.peerId, up_0_block_announcement_STREAM_KIND, (handler, sender) => {
|
|
56123
|
-
sync_logger.log
|
|
56181
|
+
sync_logger.log `[${peerInfo.peerId}] <-- Broadcasting new header #${slot}: ${header.hash}`;
|
|
56124
56182
|
handler.sendAnnouncement(sender, annoucement);
|
|
56125
56183
|
return result_OK;
|
|
56126
56184
|
});
|
|
@@ -56134,13 +56192,13 @@ class SyncTask {
|
|
|
56134
56192
|
}
|
|
56135
56193
|
if (res.error === BlockSequenceError.BlockOnFork) {
|
|
56136
56194
|
// seems that peer is requesting syncing a fork from us, let's bail.
|
|
56137
|
-
sync_logger.warn
|
|
56195
|
+
sync_logger.warn `[${peer.id}] --> Invalid block sequence request: ${startHash} is on a fork.`;
|
|
56138
56196
|
return [];
|
|
56139
56197
|
}
|
|
56140
56198
|
if (res.error === BlockSequenceError.NoStartBlock) {
|
|
56141
56199
|
// we don't know about that block at all, so let's just bail.
|
|
56142
56200
|
// we should probably penalize the peer for sending BS?
|
|
56143
|
-
sync_logger.warn
|
|
56201
|
+
sync_logger.warn `[${peer.id}] --> Invalid block sequence request: ${startHash} missing header or extrinsic.`;
|
|
56144
56202
|
return [];
|
|
56145
56203
|
}
|
|
56146
56204
|
debug_assertNever(res.error);
|
|
@@ -56160,10 +56218,10 @@ class SyncTask {
|
|
|
56160
56218
|
// figure out where others are at
|
|
56161
56219
|
const othersBest = this.othersBest;
|
|
56162
56220
|
const blocksToSync = othersBest.slot - ourBestSlot;
|
|
56163
|
-
sync_logger.trace
|
|
56221
|
+
sync_logger.trace `Our best. ${ourBestSlot}. Best seen: ${othersBest.slot}`;
|
|
56164
56222
|
if (blocksToSync < 1) {
|
|
56165
56223
|
this.connections.getPeerCount();
|
|
56166
|
-
sync_logger.trace
|
|
56224
|
+
sync_logger.trace `No new blocks. ${peerCount} peers.`;
|
|
56167
56225
|
return {
|
|
56168
56226
|
kind: SyncResult.NoNewBlocks,
|
|
56169
56227
|
ours: ourBestSlot,
|
|
@@ -56171,7 +56229,7 @@ class SyncTask {
|
|
|
56171
56229
|
};
|
|
56172
56230
|
}
|
|
56173
56231
|
const requested = [];
|
|
56174
|
-
sync_logger.log
|
|
56232
|
+
sync_logger.log `Sync ${blocksToSync} blocks from ${peerCount} peers.`;
|
|
56175
56233
|
// NOTE [ToDr] We might be requesting the same blocks from many peers
|
|
56176
56234
|
// which isn't very optimal, but for now: 🤷
|
|
56177
56235
|
//
|
|
@@ -56197,12 +56255,12 @@ class SyncTask {
|
|
|
56197
56255
|
// request as much blocks from that peer as possible.
|
|
56198
56256
|
this.streamManager.withNewStream(peerInfo.peerRef, STREAM_KIND, (handler, sender) => {
|
|
56199
56257
|
handleAsyncErrors(async () => {
|
|
56200
|
-
sync_logger.log
|
|
56258
|
+
sync_logger.log `[${peerInfo.peerId}] <-- Fetching ${bestSlot - ourBestSlot} blocks (${bestHash})`;
|
|
56201
56259
|
const blocks = await handler.requestBlockSequence(sender, bestHash, Direction.DescIncl, numbers_tryAsU32(bestSlot - ourBestSlot));
|
|
56202
56260
|
blocks.reverse();
|
|
56203
56261
|
this.onNewBlocks(blocks, peerInfo.peerId);
|
|
56204
56262
|
}, (e) => {
|
|
56205
|
-
sync_logger.warn
|
|
56263
|
+
sync_logger.warn `[${peerInfo.peerId}] <-- requesting blocks to import: ${e}`;
|
|
56206
56264
|
});
|
|
56207
56265
|
return result_OK;
|
|
56208
56266
|
});
|
|
@@ -56276,7 +56334,7 @@ function setupPeerListeners(syncTask, network, streamManager) {
|
|
|
56276
56334
|
// whenever the peer wants to open a stream with us, let's handle that.
|
|
56277
56335
|
peer.addOnIncomingStream((stream) => {
|
|
56278
56336
|
handleAsyncErrors(() => streamManager.onIncomingStream(peer, stream), (e) => {
|
|
56279
|
-
network_logger.error
|
|
56337
|
+
network_logger.error `[${peer.id}:${stream.streamId}]🚰 Stream error: ${e}. Disconnecting peer.`;
|
|
56280
56338
|
peer.disconnect();
|
|
56281
56339
|
});
|
|
56282
56340
|
return result_OK;
|
|
@@ -56526,10 +56584,10 @@ class FuzzTarget {
|
|
|
56526
56584
|
async onSocketMessage(msg) {
|
|
56527
56585
|
// attempt to decode the messsage
|
|
56528
56586
|
const message = decoder_Decoder.decodeObject(messageCodec, msg, this.spec);
|
|
56529
|
-
handler_logger.log
|
|
56587
|
+
handler_logger.log `[${message.type}] incoming message`;
|
|
56530
56588
|
await processAndRespond(this.spec, message, this.msgHandler, this.sender).catch((e) => {
|
|
56531
|
-
handler_logger.error
|
|
56532
|
-
handler_logger.error
|
|
56589
|
+
handler_logger.error `Error while processing fuzz v0 message: ${e}`;
|
|
56590
|
+
handler_logger.error `${e}`;
|
|
56533
56591
|
this.sender.close();
|
|
56534
56592
|
});
|
|
56535
56593
|
return;
|
|
@@ -56570,17 +56628,17 @@ class FuzzTarget {
|
|
|
56570
56628
|
break;
|
|
56571
56629
|
}
|
|
56572
56630
|
case MessageType.State: {
|
|
56573
|
-
handler_logger.log
|
|
56631
|
+
handler_logger.log `--> Received unexpected 'State' message from the fuzzer. Closing.`;
|
|
56574
56632
|
sender.close();
|
|
56575
56633
|
return;
|
|
56576
56634
|
}
|
|
56577
56635
|
case MessageType.StateRoot: {
|
|
56578
|
-
handler_logger.log
|
|
56636
|
+
handler_logger.log `--> Received unexpected 'StateRoot' message from the fuzzer. Closing.`;
|
|
56579
56637
|
sender.close();
|
|
56580
56638
|
return;
|
|
56581
56639
|
}
|
|
56582
56640
|
default: {
|
|
56583
|
-
handler_logger.log
|
|
56641
|
+
handler_logger.log `--> Received unexpected message type ${JSON.stringify(message)} from the fuzzer. Closing.`;
|
|
56584
56642
|
sender.close();
|
|
56585
56643
|
try {
|
|
56586
56644
|
debug_assertNever(message);
|
|
@@ -56591,17 +56649,17 @@ class FuzzTarget {
|
|
|
56591
56649
|
}
|
|
56592
56650
|
}
|
|
56593
56651
|
if (response !== null) {
|
|
56594
|
-
handler_logger.trace
|
|
56652
|
+
handler_logger.trace `<-- responding with: ${response.type}`;
|
|
56595
56653
|
const encoded = encoder_Encoder.encodeObject(messageCodec, response, spec);
|
|
56596
56654
|
sender.send(encoded);
|
|
56597
56655
|
}
|
|
56598
56656
|
else {
|
|
56599
|
-
handler_logger.warn
|
|
56657
|
+
handler_logger.warn `<-- no response generated for: ${message.type}`;
|
|
56600
56658
|
}
|
|
56601
56659
|
}
|
|
56602
56660
|
}
|
|
56603
56661
|
onClose({ error }) {
|
|
56604
|
-
handler_logger.log
|
|
56662
|
+
handler_logger.log `Closing the handler. Reason: ${error !== undefined ? error.message : "close"}.`;
|
|
56605
56663
|
}
|
|
56606
56664
|
}
|
|
56607
56665
|
|
|
@@ -56855,14 +56913,14 @@ class handler_FuzzTarget {
|
|
|
56855
56913
|
// attempt to decode the messsage
|
|
56856
56914
|
try {
|
|
56857
56915
|
const message = decoder_Decoder.decodeObject(types_messageCodec, msg, this.spec);
|
|
56858
|
-
v1_handler_logger.log
|
|
56916
|
+
v1_handler_logger.log `[${message.type}] incoming message`;
|
|
56859
56917
|
await this.processAndRespond(message);
|
|
56860
56918
|
}
|
|
56861
56919
|
catch (e) {
|
|
56862
|
-
v1_handler_logger.error
|
|
56863
|
-
v1_handler_logger.error
|
|
56920
|
+
v1_handler_logger.error `Error while processing fuzz v1 message: ${e}`;
|
|
56921
|
+
v1_handler_logger.error `${e}`;
|
|
56864
56922
|
if (e instanceof Error) {
|
|
56865
|
-
v1_handler_logger.error
|
|
56923
|
+
v1_handler_logger.error `${e.stack ?? ""}`;
|
|
56866
56924
|
}
|
|
56867
56925
|
this.sender.close();
|
|
56868
56926
|
}
|
|
@@ -56873,7 +56931,7 @@ class handler_FuzzTarget {
|
|
|
56873
56931
|
case types_MessageType.PeerInfo: {
|
|
56874
56932
|
// only support V1
|
|
56875
56933
|
if (message.value.fuzzVersion !== 1) {
|
|
56876
|
-
v1_handler_logger.warn
|
|
56934
|
+
v1_handler_logger.warn `Unsupported fuzzer protocol version: ${message.value.fuzzVersion}. Closing`;
|
|
56877
56935
|
this.sender.close();
|
|
56878
56936
|
return;
|
|
56879
56937
|
}
|
|
@@ -56881,9 +56939,9 @@ class handler_FuzzTarget {
|
|
|
56881
56939
|
const ourPeerInfo = await this.msgHandler.getPeerInfo(message.value);
|
|
56882
56940
|
// Calculate session features (intersection of both peer features)
|
|
56883
56941
|
this.sessionFeatures = message.value.features & ourPeerInfo.features;
|
|
56884
|
-
v1_handler_logger.info
|
|
56885
|
-
v1_handler_logger.log
|
|
56886
|
-
v1_handler_logger.log
|
|
56942
|
+
v1_handler_logger.info `Handshake completed. Shared features: 0b${this.sessionFeatures.toString(2)}`;
|
|
56943
|
+
v1_handler_logger.log `Feature ancestry: ${(this.sessionFeatures & Features.Ancestry) !== 0}`;
|
|
56944
|
+
v1_handler_logger.log `Feature fork: ${(this.sessionFeatures & Features.Fork) !== 0}`;
|
|
56887
56945
|
response = {
|
|
56888
56946
|
type: types_MessageType.PeerInfo,
|
|
56889
56947
|
value: ourPeerInfo,
|
|
@@ -56923,22 +56981,22 @@ class handler_FuzzTarget {
|
|
|
56923
56981
|
break;
|
|
56924
56982
|
}
|
|
56925
56983
|
case types_MessageType.StateRoot: {
|
|
56926
|
-
v1_handler_logger.log
|
|
56984
|
+
v1_handler_logger.log `--> Received unexpected 'StateRoot' message from the fuzzer. Closing.`;
|
|
56927
56985
|
this.sender.close();
|
|
56928
56986
|
return;
|
|
56929
56987
|
}
|
|
56930
56988
|
case types_MessageType.State: {
|
|
56931
|
-
v1_handler_logger.log
|
|
56989
|
+
v1_handler_logger.log `--> Received unexpected 'State' message from the fuzzer. Closing.`;
|
|
56932
56990
|
this.sender.close();
|
|
56933
56991
|
return;
|
|
56934
56992
|
}
|
|
56935
56993
|
case types_MessageType.Error: {
|
|
56936
|
-
v1_handler_logger.log
|
|
56994
|
+
v1_handler_logger.log `--> Received unexpected 'Error' message from the fuzzer. Closing.`;
|
|
56937
56995
|
this.sender.close();
|
|
56938
56996
|
return;
|
|
56939
56997
|
}
|
|
56940
56998
|
default: {
|
|
56941
|
-
v1_handler_logger.log
|
|
56999
|
+
v1_handler_logger.log `--> Received unexpected message type ${JSON.stringify(message)} from the fuzzer. Closing.`;
|
|
56942
57000
|
this.sender.close();
|
|
56943
57001
|
try {
|
|
56944
57002
|
debug_assertNever(message);
|
|
@@ -56949,16 +57007,16 @@ class handler_FuzzTarget {
|
|
|
56949
57007
|
}
|
|
56950
57008
|
}
|
|
56951
57009
|
if (response !== null) {
|
|
56952
|
-
v1_handler_logger.trace
|
|
57010
|
+
v1_handler_logger.trace `<-- responding with: ${response.type}`;
|
|
56953
57011
|
const encoded = encoder_Encoder.encodeObject(types_messageCodec, response, this.spec);
|
|
56954
57012
|
this.sender.send(encoded);
|
|
56955
57013
|
}
|
|
56956
57014
|
else {
|
|
56957
|
-
v1_handler_logger.warn
|
|
57015
|
+
v1_handler_logger.warn `<-- no response generated for: ${message.type}`;
|
|
56958
57016
|
}
|
|
56959
57017
|
}
|
|
56960
57018
|
onClose({ error }) {
|
|
56961
|
-
v1_handler_logger.log
|
|
57019
|
+
v1_handler_logger.log `Closing the v1 handler. Reason: ${error !== undefined ? error.message : "close"}.`;
|
|
56962
57020
|
}
|
|
56963
57021
|
/** Check if a specific feature is enabled in the session */
|
|
56964
57022
|
hasFeature(feature) {
|
|
@@ -57004,7 +57062,7 @@ function startIpcServer(name, newMessageHandler) {
|
|
|
57004
57062
|
const logger = Logger.new(import.meta.filename, "ext-ipc");
|
|
57005
57063
|
// Create the IPC server
|
|
57006
57064
|
const server = (0,external_node_net_namespaceObject.createServer)((socket) => {
|
|
57007
|
-
logger.log
|
|
57065
|
+
logger.log `Client connected`;
|
|
57008
57066
|
const messageHandler = newMessageHandler(new IpcSender(socket));
|
|
57009
57067
|
// Handle incoming data from the client
|
|
57010
57068
|
socket.on("data", handleMessageFragmentation(async (data) => {
|
|
@@ -57016,23 +57074,23 @@ function startIpcServer(name, newMessageHandler) {
|
|
|
57016
57074
|
await messageHandler.onSocketMessage(data);
|
|
57017
57075
|
}
|
|
57018
57076
|
catch (e) {
|
|
57019
|
-
logger.error
|
|
57077
|
+
logger.error `Received invalid data on socket: ${e}. Closing connection.`;
|
|
57020
57078
|
socket.end();
|
|
57021
57079
|
}
|
|
57022
57080
|
finally {
|
|
57023
57081
|
socket.resume();
|
|
57024
57082
|
}
|
|
57025
57083
|
}, () => {
|
|
57026
|
-
logger.error
|
|
57084
|
+
logger.error `Received too much data on socket. Closing connection.`;
|
|
57027
57085
|
socket.end();
|
|
57028
57086
|
}));
|
|
57029
57087
|
// Handle client disconnection
|
|
57030
57088
|
socket.on("end", () => {
|
|
57031
|
-
logger.log
|
|
57089
|
+
logger.log `Client disconnected`;
|
|
57032
57090
|
messageHandler.onClose({});
|
|
57033
57091
|
});
|
|
57034
57092
|
socket.on("error", (error) => {
|
|
57035
|
-
logger.error
|
|
57093
|
+
logger.error `Socket error: ${error}`;
|
|
57036
57094
|
messageHandler.onClose({ error });
|
|
57037
57095
|
socket.end();
|
|
57038
57096
|
});
|
|
@@ -57047,14 +57105,14 @@ function startIpcServer(name, newMessageHandler) {
|
|
|
57047
57105
|
path: socketPath,
|
|
57048
57106
|
signal: controller.signal,
|
|
57049
57107
|
}, () => {
|
|
57050
|
-
logger.log
|
|
57108
|
+
logger.log `IPC server is listening at ${socketPath}`;
|
|
57051
57109
|
});
|
|
57052
57110
|
// Handle server errors
|
|
57053
57111
|
server.on("error", (err) => {
|
|
57054
57112
|
throw err;
|
|
57055
57113
|
});
|
|
57056
57114
|
return () => {
|
|
57057
|
-
logger.info
|
|
57115
|
+
logger.info `Closing IPC server.`;
|
|
57058
57116
|
// stop accepting new connections
|
|
57059
57117
|
server.close();
|
|
57060
57118
|
// abort the server
|
|
@@ -57199,7 +57257,7 @@ class JamnpIpcHandler {
|
|
|
57199
57257
|
// decode the message as `StreamEnvelope`
|
|
57200
57258
|
const envelope = decoder_Decoder.decodeObject(StreamEnvelope.Codec, msg);
|
|
57201
57259
|
const streamId = envelope.streamId;
|
|
57202
|
-
jamnp_handler_logger.log
|
|
57260
|
+
jamnp_handler_logger.log `[${streamId}] incoming message: ${envelope.type} ${envelope.data}`;
|
|
57203
57261
|
// check if this is a already known stream id
|
|
57204
57262
|
const streamHandler = this.streams.get(streamId);
|
|
57205
57263
|
const streamSender = new EnvelopeSender(streamId, this.sender);
|
|
@@ -57207,13 +57265,13 @@ class JamnpIpcHandler {
|
|
|
57207
57265
|
if (streamHandler === undefined) {
|
|
57208
57266
|
// closing or message of unknown stream - ignore.
|
|
57209
57267
|
if (envelope.type !== StreamEnvelopeType.Open) {
|
|
57210
|
-
jamnp_handler_logger.warn
|
|
57268
|
+
jamnp_handler_logger.warn `[${streamId}] (unknown) got invalid type ${envelope.type}.`;
|
|
57211
57269
|
return;
|
|
57212
57270
|
}
|
|
57213
57271
|
const newStream = decoder_Decoder.decodeObject(NewStream.Codec, envelope.data);
|
|
57214
57272
|
const handler = this.streamHandlers.get(newStream.streamByte);
|
|
57215
57273
|
if (handler !== undefined) {
|
|
57216
|
-
jamnp_handler_logger.log
|
|
57274
|
+
jamnp_handler_logger.log `[${streamId}] new stream for ${handler.kind}`;
|
|
57217
57275
|
// insert the stream
|
|
57218
57276
|
this.streams.set(streamId, handler);
|
|
57219
57277
|
// Just send back the same stream byte.
|
|
@@ -57234,7 +57292,7 @@ class JamnpIpcHandler {
|
|
|
57234
57292
|
if (envelope.type !== StreamEnvelopeType.Msg) {
|
|
57235
57293
|
// display a warning but only if the stream was not pending for confirmation.
|
|
57236
57294
|
if (!this.pendingStreams.delete(streamId)) {
|
|
57237
|
-
jamnp_handler_logger.warn
|
|
57295
|
+
jamnp_handler_logger.warn `[${streamId}] got invalid type ${envelope.type}.`;
|
|
57238
57296
|
}
|
|
57239
57297
|
return;
|
|
57240
57298
|
}
|
|
@@ -57243,7 +57301,7 @@ class JamnpIpcHandler {
|
|
|
57243
57301
|
}
|
|
57244
57302
|
/** Notify about termination of the underlying socket. */
|
|
57245
57303
|
onClose({ error }) {
|
|
57246
|
-
jamnp_handler_logger.log
|
|
57304
|
+
jamnp_handler_logger.log `Closing the handler. Reason: ${error !== undefined ? error.message : "close"}.`;
|
|
57247
57305
|
// Socket closed - we should probably clear everything.
|
|
57248
57306
|
for (const [streamId, handler] of this.streams.entries()) {
|
|
57249
57307
|
handler.onClose(streamId, error === undefined);
|
|
@@ -57260,7 +57318,7 @@ class JamnpIpcHandler {
|
|
|
57260
57318
|
}
|
|
57261
57319
|
/** Wait for the handler to be finished either via close or error. */
|
|
57262
57320
|
waitForEnd() {
|
|
57263
|
-
jamnp_handler_logger.log
|
|
57321
|
+
jamnp_handler_logger.log `Waiting for the handler to be closed.`;
|
|
57264
57322
|
return this.onEnd.listen;
|
|
57265
57323
|
}
|
|
57266
57324
|
}
|
|
@@ -57389,7 +57447,7 @@ class FuzzHandler {
|
|
|
57389
57447
|
async getSerializedState(value) {
|
|
57390
57448
|
const state = await this.api.getPostSerializedState(value);
|
|
57391
57449
|
if (state === null) {
|
|
57392
|
-
ipc_logger.warn
|
|
57450
|
+
ipc_logger.warn `Fuzzer requested non-existing state for: ${value}`;
|
|
57393
57451
|
return [];
|
|
57394
57452
|
}
|
|
57395
57453
|
return Array.from(state).map(([key, value]) => {
|
|
@@ -57415,7 +57473,7 @@ class FuzzHandler {
|
|
|
57415
57473
|
if (res.isOk) {
|
|
57416
57474
|
return res;
|
|
57417
57475
|
}
|
|
57418
|
-
ipc_logger.log
|
|
57476
|
+
ipc_logger.log `Rejecting block with error: ${res.error}. ${res.details}`;
|
|
57419
57477
|
return result_Result.error(ErrorMessage.create({ message: res.error }));
|
|
57420
57478
|
}
|
|
57421
57479
|
async importBlockV0(value) {
|
|
@@ -57423,11 +57481,11 @@ class FuzzHandler {
|
|
|
57423
57481
|
if (res.isOk) {
|
|
57424
57482
|
return res.ok;
|
|
57425
57483
|
}
|
|
57426
|
-
ipc_logger.warn
|
|
57484
|
+
ipc_logger.warn `Fuzzer sent incorrect block with error ${res.error}. ${res.details}`;
|
|
57427
57485
|
return this.api.getBestStateRootHash();
|
|
57428
57486
|
}
|
|
57429
57487
|
async getPeerInfo(value) {
|
|
57430
|
-
ipc_logger.info
|
|
57488
|
+
ipc_logger.info `Fuzzer ${value} connected.`;
|
|
57431
57489
|
return types_PeerInfo.create({
|
|
57432
57490
|
name: this.api.nodeName,
|
|
57433
57491
|
appVersion: this.api.nodeVersion,
|
|
@@ -57438,7 +57496,7 @@ class FuzzHandler {
|
|
|
57438
57496
|
});
|
|
57439
57497
|
}
|
|
57440
57498
|
async getPeerInfoV0(value) {
|
|
57441
|
-
ipc_logger.info
|
|
57499
|
+
ipc_logger.info `Fuzzer ${value} connected.`;
|
|
57442
57500
|
return PeerInfo.create({
|
|
57443
57501
|
name: this.api.nodeName,
|
|
57444
57502
|
appVersion: this.api.nodeVersion,
|
|
@@ -57471,7 +57529,7 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
|
|
|
57471
57529
|
Logger.configureAll(process.env.JAM_LOG ?? "", Level.LOG);
|
|
57472
57530
|
const machine = networkStateMachine();
|
|
57473
57531
|
const channel = MessageChannelStateMachine.receiveChannel(machine, external_node_worker_threads_namespaceObject.parentPort);
|
|
57474
|
-
channel.then((channel) => jam_network_main(channel)).catch((e) => jam_network_logger.error
|
|
57532
|
+
channel.then((channel) => jam_network_main(channel)).catch((e) => jam_network_logger.error `${e}`);
|
|
57475
57533
|
}
|
|
57476
57534
|
/**
|
|
57477
57535
|
* JAM networking worker.
|
|
@@ -57482,7 +57540,7 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
|
|
|
57482
57540
|
*/
|
|
57483
57541
|
async function jam_network_main(channel) {
|
|
57484
57542
|
await initAll();
|
|
57485
|
-
jam_network_logger.trace
|
|
57543
|
+
jam_network_logger.trace `🛜 Network starting ${channel.currentState()}`;
|
|
57486
57544
|
// Await the configuration object
|
|
57487
57545
|
// TODO [ToDr] The whole state machine needs to die.
|
|
57488
57546
|
const ready = channel.currentState().stateName !== "ready(network)"
|
|
@@ -57493,7 +57551,7 @@ async function jam_network_main(channel) {
|
|
|
57493
57551
|
const key = await ed25519_privateKey(config.key);
|
|
57494
57552
|
const lmdb = new LmdbRoot(config.genericConfig.dbPath);
|
|
57495
57553
|
const blocks = new LmdbBlocks(config.genericConfig.chainSpec, lmdb);
|
|
57496
|
-
jam_network_logger.info
|
|
57554
|
+
jam_network_logger.info `🛜 Listening at ${config.host}:${config.port}`;
|
|
57497
57555
|
const network = await setup({
|
|
57498
57556
|
host: config.host,
|
|
57499
57557
|
port: config.port,
|
|
@@ -57506,7 +57564,7 @@ async function jam_network_main(channel) {
|
|
|
57506
57564
|
ready.waitForState("finished").then(() => network.network.stop());
|
|
57507
57565
|
await network.network.start();
|
|
57508
57566
|
});
|
|
57509
|
-
jam_network_logger.info
|
|
57567
|
+
jam_network_logger.info `🛜 Network worker finished. Closing channel.`;
|
|
57510
57568
|
// Close the comms to gracefuly close the app.
|
|
57511
57569
|
finished.currentState().close(channel);
|
|
57512
57570
|
}
|
|
@@ -57534,7 +57592,7 @@ async function startNetwork(config) {
|
|
|
57534
57592
|
}
|
|
57535
57593
|
|
|
57536
57594
|
;// CONCATENATED MODULE: ./packages/jam/node/package.json
|
|
57537
|
-
const package_namespaceObject = {"rE":"0.1.
|
|
57595
|
+
const package_namespaceObject = {"rE":"0.1.2"};
|
|
57538
57596
|
;// CONCATENATED MODULE: ./packages/jam/node/main.ts
|
|
57539
57597
|
|
|
57540
57598
|
|
|
@@ -57552,8 +57610,8 @@ async function main_main(config, withRelPath) {
|
|
|
57552
57610
|
throw new Error("The main binary cannot be running as a Worker!");
|
|
57553
57611
|
}
|
|
57554
57612
|
await initAll();
|
|
57555
|
-
common_logger.info
|
|
57556
|
-
common_logger.info
|
|
57613
|
+
common_logger.info `🫐 Typeberry ${package_namespaceObject.rE}. GP: ${CURRENT_VERSION} (${CURRENT_SUITE})`;
|
|
57614
|
+
common_logger.info `🎸 Starting node: ${config.nodeName}.`;
|
|
57557
57615
|
const chainSpec = getChainSpec(config.node.flavor);
|
|
57558
57616
|
const { rootDb, dbPath, genesisHeaderHash } = openDatabase(config.nodeName, config.node.chainSpec.genesisHeader, withRelPath(config.node.databaseBasePath));
|
|
57559
57617
|
// Initialize the database with genesis state and block if there isn't one.
|
|
@@ -57596,30 +57654,30 @@ async function main_main(config, withRelPath) {
|
|
|
57596
57654
|
return importer.finish(port);
|
|
57597
57655
|
});
|
|
57598
57656
|
await importerFinished.currentState().waitForWorkerToFinish();
|
|
57599
|
-
common_logger.log
|
|
57657
|
+
common_logger.log `[main] ☠️ Closing the extensions`;
|
|
57600
57658
|
closeExtensions();
|
|
57601
|
-
common_logger.log
|
|
57659
|
+
common_logger.log `[main] ☠️ Closing the authorship module`;
|
|
57602
57660
|
closeAuthorship();
|
|
57603
|
-
common_logger.log
|
|
57661
|
+
common_logger.log `[main] ☠️ Closing the networking module`;
|
|
57604
57662
|
closeNetwork();
|
|
57605
|
-
common_logger.log
|
|
57663
|
+
common_logger.log `[main] 🛢️ Closing the database`;
|
|
57606
57664
|
await rootDb.close();
|
|
57607
|
-
common_logger.info
|
|
57665
|
+
common_logger.info `[main] ✅ Done.`;
|
|
57608
57666
|
},
|
|
57609
57667
|
};
|
|
57610
57668
|
return api;
|
|
57611
57669
|
}
|
|
57612
57670
|
const initAuthorship = async (importerReady, isAuthoring, config) => {
|
|
57613
57671
|
if (!isAuthoring) {
|
|
57614
|
-
common_logger.log
|
|
57672
|
+
common_logger.log `✍️ Authorship off: disabled`;
|
|
57615
57673
|
return () => Promise.resolve();
|
|
57616
57674
|
}
|
|
57617
|
-
common_logger.info
|
|
57675
|
+
common_logger.info `✍️ Starting block generator.`;
|
|
57618
57676
|
const { generator, finish } = await startBlockGenerator(config);
|
|
57619
57677
|
// relay blocks from generator to importer
|
|
57620
57678
|
importerReady.doUntil("finished", async (importer, port) => {
|
|
57621
57679
|
generator.currentState().onBlock.on((b) => {
|
|
57622
|
-
common_logger.log
|
|
57680
|
+
common_logger.log `✍️ Produced block. Size: [${b.length}]`;
|
|
57623
57681
|
importer.sendBlock(port, b);
|
|
57624
57682
|
});
|
|
57625
57683
|
});
|
|
@@ -57627,7 +57685,7 @@ const initAuthorship = async (importerReady, isAuthoring, config) => {
|
|
|
57627
57685
|
};
|
|
57628
57686
|
const initNetwork = async (importerReady, workerConfig, genesisHeaderHash, networkConfig, bestHeader) => {
|
|
57629
57687
|
if (networkConfig === null) {
|
|
57630
|
-
common_logger.log
|
|
57688
|
+
common_logger.log `🛜 Networking off: no config`;
|
|
57631
57689
|
return () => Promise.resolve();
|
|
57632
57690
|
}
|
|
57633
57691
|
const { key, host, port, bootnodes } = networkConfig;
|
|
@@ -58833,16 +58891,12 @@ class PartiallyUpdatedState {
|
|
|
58833
58891
|
*
|
|
58834
58892
|
* NOTE the info may be updated compared to what is in the state.
|
|
58835
58893
|
*
|
|
58836
|
-
* Takes into account newly created services as well.
|
|
58894
|
+
* Takes into account ejected and newly created services as well.
|
|
58837
58895
|
*/
|
|
58838
58896
|
getServiceInfo(destination) {
|
|
58839
58897
|
if (destination === null) {
|
|
58840
58898
|
return null;
|
|
58841
58899
|
}
|
|
58842
|
-
const isEjected = this.stateUpdate.services.servicesRemoved.some((x) => x === destination);
|
|
58843
|
-
if (isEjected) {
|
|
58844
|
-
return null;
|
|
58845
|
-
}
|
|
58846
58900
|
const maybeNewService = this.stateUpdate.services.servicesUpdates.find((update) => update.serviceId === destination);
|
|
58847
58901
|
if (maybeNewService !== undefined) {
|
|
58848
58902
|
return maybeNewService.action.account;
|
|
@@ -59577,7 +59631,7 @@ class AccumulateExternalities {
|
|
|
59577
59631
|
/** https://graypaper.fluffylabs.dev/#/7e6ff6a/362802362d02?v=0.6.7 */
|
|
59578
59632
|
const validatorsManager = this.updatedState.getPrivilegedServices().validatorsManager;
|
|
59579
59633
|
if (validatorsManager !== this.currentServiceId) {
|
|
59580
|
-
accumulate_externalities_logger.trace
|
|
59634
|
+
accumulate_externalities_logger.trace `Current service id (${this.currentServiceId}) is not a validators manager. (expected: ${validatorsManager}) and cannot update validators data. Ignoring`;
|
|
59581
59635
|
return result_Result.error(UnprivilegedError);
|
|
59582
59636
|
}
|
|
59583
59637
|
this.updatedState.stateUpdate.validatorsData = validatorsData;
|
|
@@ -59592,11 +59646,11 @@ class AccumulateExternalities {
|
|
|
59592
59646
|
// NOTE `coreIndex` is already verified in the HC, so this is infallible.
|
|
59593
59647
|
const currentAuthManager = this.updatedState.getPrivilegedServices().authManager[coreIndex];
|
|
59594
59648
|
if (currentAuthManager !== this.currentServiceId) {
|
|
59595
|
-
accumulate_externalities_logger.trace
|
|
59649
|
+
accumulate_externalities_logger.trace `Current service id (${this.currentServiceId}) is not an auth manager of core ${coreIndex} (expected: ${currentAuthManager}) and cannot update authorization queue. Ignoring`;
|
|
59596
59650
|
return result_Result.error(UpdatePrivilegesError.UnprivilegedService);
|
|
59597
59651
|
}
|
|
59598
59652
|
if (authManager === null && Compatibility.isGreaterOrEqual(GpVersion.V0_7_1)) {
|
|
59599
|
-
accumulate_externalities_logger.trace
|
|
59653
|
+
accumulate_externalities_logger.trace `The new auth manager is not a valid service id. Ignoring`;
|
|
59600
59654
|
return result_Result.error(UpdatePrivilegesError.InvalidServiceId);
|
|
59601
59655
|
}
|
|
59602
59656
|
this.updatedState.stateUpdate.authorizationQueues.set(coreIndex, authQueue);
|
|
@@ -60477,7 +60531,7 @@ class Assign {
|
|
|
60477
60531
|
const memoryReadResult = memory.loadInto(res, authorizationQueueStart);
|
|
60478
60532
|
// error while reading the memory.
|
|
60479
60533
|
if (memoryReadResult.isError) {
|
|
60480
|
-
logger_logger.trace
|
|
60534
|
+
logger_logger.trace `ASSIGN() <- PANIC`;
|
|
60481
60535
|
return PvmExecution.Panic;
|
|
60482
60536
|
}
|
|
60483
60537
|
if (maybeCoreIndex >= this.chainSpec.coresCount) {
|
|
@@ -60492,18 +60546,18 @@ class Assign {
|
|
|
60492
60546
|
const result = this.partialState.updateAuthorizationQueue(coreIndex, fixedSizeAuthQueue, authManager);
|
|
60493
60547
|
if (result.isOk) {
|
|
60494
60548
|
regs.set(IN_OUT_REG, HostCallResult.OK);
|
|
60495
|
-
logger_logger.trace
|
|
60549
|
+
logger_logger.trace `ASSIGN(${coreIndex}, ${fixedSizeAuthQueue}) <- OK`;
|
|
60496
60550
|
return;
|
|
60497
60551
|
}
|
|
60498
60552
|
const e = result.error;
|
|
60499
60553
|
if (e === UpdatePrivilegesError.UnprivilegedService) {
|
|
60500
60554
|
regs.set(IN_OUT_REG, HostCallResult.HUH);
|
|
60501
|
-
logger_logger.trace
|
|
60555
|
+
logger_logger.trace `ASSIGN(${coreIndex}, ${fixedSizeAuthQueue}) <- HUH`;
|
|
60502
60556
|
return;
|
|
60503
60557
|
}
|
|
60504
60558
|
if (e === UpdatePrivilegesError.InvalidServiceId) {
|
|
60505
60559
|
regs.set(IN_OUT_REG, HostCallResult.WHO);
|
|
60506
|
-
logger_logger.trace
|
|
60560
|
+
logger_logger.trace `ASSIGN(${coreIndex}, ${fixedSizeAuthQueue}) <- HUH`;
|
|
60507
60561
|
return;
|
|
60508
60562
|
}
|
|
60509
60563
|
debug_assertNever(e);
|
|
@@ -60569,7 +60623,7 @@ class Bless {
|
|
|
60569
60623
|
decoder.resetTo(0);
|
|
60570
60624
|
const memoryReadResult = memory.loadInto(result, memIndex);
|
|
60571
60625
|
if (memoryReadResult.isError) {
|
|
60572
|
-
logger_logger.trace
|
|
60626
|
+
logger_logger.trace `BLESS(${manager}, ${validator}) <- PANIC`;
|
|
60573
60627
|
return PvmExecution.Panic;
|
|
60574
60628
|
}
|
|
60575
60629
|
const { serviceId, gas } = decoder.object(serviceIdAndGasCodec);
|
|
@@ -60582,24 +60636,24 @@ class Bless {
|
|
|
60582
60636
|
const authorizersDecoder = decoder_Decoder.fromBlob(res);
|
|
60583
60637
|
const memoryReadResult = memory.loadInto(res, authorization);
|
|
60584
60638
|
if (memoryReadResult.isError) {
|
|
60585
|
-
logger_logger.trace
|
|
60639
|
+
logger_logger.trace `BLESS(${manager}, ${validator}, ${autoAccumulateEntries}) <- PANIC`;
|
|
60586
60640
|
return PvmExecution.Panic;
|
|
60587
60641
|
}
|
|
60588
60642
|
const authorizers = tryAsPerCore(authorizersDecoder.sequenceFixLen(descriptors_codec.u32.asOpaque(), this.chainSpec.coresCount), this.chainSpec);
|
|
60589
60643
|
const updateResult = this.partialState.updatePrivilegedServices(manager, authorizers, validator, autoAccumulateEntries);
|
|
60590
60644
|
if (updateResult.isOk) {
|
|
60591
|
-
logger_logger.trace
|
|
60645
|
+
logger_logger.trace `BLESS(${manager}, ${authorizers}, ${validator}, ${autoAccumulateEntries}) <- OK`;
|
|
60592
60646
|
regs.set(bless_IN_OUT_REG, HostCallResult.OK);
|
|
60593
60647
|
return;
|
|
60594
60648
|
}
|
|
60595
60649
|
const e = updateResult.error;
|
|
60596
60650
|
if (e === UpdatePrivilegesError.UnprivilegedService) {
|
|
60597
|
-
logger_logger.trace
|
|
60651
|
+
logger_logger.trace `BLESS(${manager}, ${authorizers}, ${validator}, ${autoAccumulateEntries}) <- HUH`;
|
|
60598
60652
|
regs.set(bless_IN_OUT_REG, HostCallResult.HUH);
|
|
60599
60653
|
return;
|
|
60600
60654
|
}
|
|
60601
60655
|
if (e === UpdatePrivilegesError.InvalidServiceId) {
|
|
60602
|
-
logger_logger.trace
|
|
60656
|
+
logger_logger.trace `BLESS(${manager}, ${authorizers}, ${validator}, ${autoAccumulateEntries}) <- WHO`;
|
|
60603
60657
|
regs.set(bless_IN_OUT_REG, HostCallResult.WHO);
|
|
60604
60658
|
return;
|
|
60605
60659
|
}
|
|
@@ -60629,7 +60683,7 @@ class GasHostCall {
|
|
|
60629
60683
|
}
|
|
60630
60684
|
execute(gas, regs) {
|
|
60631
60685
|
const gasValue = gas.get();
|
|
60632
|
-
logger_logger.trace
|
|
60686
|
+
logger_logger.trace `GAS <- ${gasValue}`;
|
|
60633
60687
|
regs.set(7, numbers_tryAsU64(gasValue));
|
|
60634
60688
|
return Promise.resolve(undefined);
|
|
60635
60689
|
}
|
|
@@ -60661,7 +60715,7 @@ class Checkpoint {
|
|
|
60661
60715
|
async execute(gas, regs) {
|
|
60662
60716
|
await this.gasHostCall.execute(gas, regs);
|
|
60663
60717
|
this.partialState.checkpoint();
|
|
60664
|
-
logger_logger.trace
|
|
60718
|
+
logger_logger.trace `CHECKPOINT()`;
|
|
60665
60719
|
return;
|
|
60666
60720
|
}
|
|
60667
60721
|
}
|
|
@@ -60700,18 +60754,18 @@ class Designate {
|
|
|
60700
60754
|
const memoryReadResult = memory.loadInto(res, validatorsStart);
|
|
60701
60755
|
// error while reading the memory.
|
|
60702
60756
|
if (memoryReadResult.isError) {
|
|
60703
|
-
logger_logger.trace
|
|
60757
|
+
logger_logger.trace `DESIGNATE() <- PANIC`;
|
|
60704
60758
|
return PvmExecution.Panic;
|
|
60705
60759
|
}
|
|
60706
60760
|
const decoder = decoder_Decoder.fromBlob(res);
|
|
60707
60761
|
const validatorsData = decoder.sequenceFixLen(ValidatorData.Codec, this.chainSpec.validatorsCount);
|
|
60708
60762
|
const result = this.partialState.updateValidatorsData(tryAsPerValidator(validatorsData, this.chainSpec));
|
|
60709
60763
|
if (result.isError) {
|
|
60710
|
-
logger_logger.trace
|
|
60764
|
+
logger_logger.trace `DESIGNATE([${validatorsData[0]}, ${validatorsData[1]}, ...]) <- HUH`;
|
|
60711
60765
|
regs.set(designate_IN_OUT_REG, HostCallResult.HUH);
|
|
60712
60766
|
}
|
|
60713
60767
|
else {
|
|
60714
|
-
logger_logger.trace
|
|
60768
|
+
logger_logger.trace `DESIGNATE([${validatorsData[0]}, ${validatorsData[1]}, ...]) <- OK`;
|
|
60715
60769
|
regs.set(designate_IN_OUT_REG, HostCallResult.OK);
|
|
60716
60770
|
}
|
|
60717
60771
|
}
|
|
@@ -60752,17 +60806,17 @@ class Eject {
|
|
|
60752
60806
|
const previousCodeHash = bytes_Bytes.zero(hash_HASH_SIZE).asOpaque();
|
|
60753
60807
|
const memoryReadResult = memory.loadInto(previousCodeHash.raw, preimageHashStart);
|
|
60754
60808
|
if (memoryReadResult.isError) {
|
|
60755
|
-
logger_logger.trace
|
|
60809
|
+
logger_logger.trace `EJECT(${serviceId}) <- PANIC`;
|
|
60756
60810
|
return PvmExecution.Panic;
|
|
60757
60811
|
}
|
|
60758
60812
|
// cannot eject self
|
|
60759
60813
|
if (serviceId === this.currentServiceId) {
|
|
60760
60814
|
regs.set(eject_IN_OUT_REG, HostCallResult.WHO);
|
|
60761
|
-
logger_logger.trace
|
|
60815
|
+
logger_logger.trace `EJECT(${serviceId}, ${previousCodeHash}) <- WHO`;
|
|
60762
60816
|
return;
|
|
60763
60817
|
}
|
|
60764
60818
|
const result = this.partialState.eject(serviceId, previousCodeHash);
|
|
60765
|
-
logger_logger.trace
|
|
60819
|
+
logger_logger.trace `EJECT(${serviceId}, ${previousCodeHash}) <- ${resultToString(result)}`;
|
|
60766
60820
|
// All good!
|
|
60767
60821
|
if (result.isOk) {
|
|
60768
60822
|
regs.set(eject_IN_OUT_REG, HostCallResult.OK);
|
|
@@ -60814,11 +60868,11 @@ class Forget {
|
|
|
60814
60868
|
const memoryReadResult = memory.loadInto(hash.raw, hashStart);
|
|
60815
60869
|
// error while reading the memory.
|
|
60816
60870
|
if (memoryReadResult.isError) {
|
|
60817
|
-
logger_logger.trace
|
|
60871
|
+
logger_logger.trace `FORGET(${hash}, ${length}) <- PANIC`;
|
|
60818
60872
|
return PvmExecution.Panic;
|
|
60819
60873
|
}
|
|
60820
60874
|
const result = this.partialState.forgetPreimage(hash.asOpaque(), length);
|
|
60821
|
-
logger_logger.trace
|
|
60875
|
+
logger_logger.trace `FORGET(${hash}, ${length}) <- ${resultToString(result)}`;
|
|
60822
60876
|
if (result.isOk) {
|
|
60823
60877
|
regs.set(forget_IN_OUT_REG, HostCallResult.OK);
|
|
60824
60878
|
}
|
|
@@ -60871,11 +60925,11 @@ class New {
|
|
|
60871
60925
|
const memoryReadResult = memory.loadInto(codeHash.raw, codeHashStart);
|
|
60872
60926
|
// error while reading the memory.
|
|
60873
60927
|
if (memoryReadResult.isError) {
|
|
60874
|
-
logger_logger.trace
|
|
60928
|
+
logger_logger.trace `NEW(${codeHash}, ${codeLength}, ${gas}, ${allowance}, ${gratisStorage}) <- PANIC`;
|
|
60875
60929
|
return PvmExecution.Panic;
|
|
60876
60930
|
}
|
|
60877
60931
|
const assignedId = this.partialState.newService(codeHash.asOpaque(), codeLength, gas, allowance, gratisStorage);
|
|
60878
|
-
logger_logger.trace
|
|
60932
|
+
logger_logger.trace `NEW(${codeHash}, ${codeLength}, ${gas}, ${allowance}, ${gratisStorage}) <- ${resultToString(assignedId)}`;
|
|
60879
60933
|
if (assignedId.isOk) {
|
|
60880
60934
|
regs.set(new_IN_OUT_REG, numbers_tryAsU64(assignedId.ok));
|
|
60881
60935
|
return;
|
|
@@ -60930,11 +60984,11 @@ class Provide {
|
|
|
60930
60984
|
const preimage = bytes_BytesBlob.blobFrom(new Uint8Array(length));
|
|
60931
60985
|
const memoryReadResult = memory.loadInto(preimage.raw, preimageStart);
|
|
60932
60986
|
if (memoryReadResult.isError) {
|
|
60933
|
-
logger_logger.trace
|
|
60987
|
+
logger_logger.trace `PROVIDE(${serviceId}, ${preimage.toStringTruncated()}) <- PANIC`;
|
|
60934
60988
|
return PvmExecution.Panic;
|
|
60935
60989
|
}
|
|
60936
60990
|
const result = this.partialState.providePreimage(serviceId, preimage);
|
|
60937
|
-
logger_logger.trace
|
|
60991
|
+
logger_logger.trace `PROVIDE(${serviceId}, ${preimage.toStringTruncated()}) <- ${resultToString(result)}`;
|
|
60938
60992
|
if (result.isOk) {
|
|
60939
60993
|
regs.set(provide_IN_OUT_REG, HostCallResult.OK);
|
|
60940
60994
|
return;
|
|
@@ -60988,11 +61042,11 @@ class Query {
|
|
|
60988
61042
|
const memoryReadResult = memory.loadInto(hash.raw, hashStart);
|
|
60989
61043
|
// error while reading the memory.
|
|
60990
61044
|
if (memoryReadResult.isError) {
|
|
60991
|
-
logger_logger.trace
|
|
61045
|
+
logger_logger.trace `QUERY(${hash}, ${length}) <- PANIC`;
|
|
60992
61046
|
return PvmExecution.Panic;
|
|
60993
61047
|
}
|
|
60994
61048
|
const result = this.partialState.checkPreimageStatus(hash.asOpaque(), length);
|
|
60995
|
-
logger_logger.trace
|
|
61049
|
+
logger_logger.trace `QUERY(${hash}, ${length}) <- ${result}`;
|
|
60996
61050
|
const zero = numbers_tryAsU64(0n);
|
|
60997
61051
|
if (result === null) {
|
|
60998
61052
|
regs.set(IN_OUT_REG_1, HostCallResult.NONE);
|
|
@@ -61053,11 +61107,11 @@ class Solicit {
|
|
|
61053
61107
|
const hash = bytes_Bytes.zero(hash_HASH_SIZE);
|
|
61054
61108
|
const memoryReadResult = memory.loadInto(hash.raw, hashStart);
|
|
61055
61109
|
if (memoryReadResult.isError) {
|
|
61056
|
-
logger_logger.trace
|
|
61110
|
+
logger_logger.trace `SOLICIT(${hash}, ${length}) <- PANIC`;
|
|
61057
61111
|
return PvmExecution.Panic;
|
|
61058
61112
|
}
|
|
61059
61113
|
const result = this.partialState.requestPreimage(hash.asOpaque(), length);
|
|
61060
|
-
logger_logger.trace
|
|
61114
|
+
logger_logger.trace `SOLICIT(${hash}, ${length}) <- ${resultToString(result)}`;
|
|
61061
61115
|
if (result.isOk) {
|
|
61062
61116
|
regs.set(solicit_IN_OUT_REG, HostCallResult.OK);
|
|
61063
61117
|
return;
|
|
@@ -61129,11 +61183,11 @@ class Transfer {
|
|
|
61129
61183
|
const memoryReadResult = memory.loadInto(memo.raw, memoStart);
|
|
61130
61184
|
// page fault while reading the memory.
|
|
61131
61185
|
if (memoryReadResult.isError) {
|
|
61132
|
-
logger_logger.trace
|
|
61186
|
+
logger_logger.trace `TRANSFER(${destination}, ${amount}, ${onTransferGas}, ${memo}) <- PANIC`;
|
|
61133
61187
|
return PvmExecution.Panic;
|
|
61134
61188
|
}
|
|
61135
61189
|
const transferResult = this.partialState.transfer(destination, amount, onTransferGas, memo);
|
|
61136
|
-
logger_logger.trace
|
|
61190
|
+
logger_logger.trace `TRANSFER(${destination}, ${amount}, ${onTransferGas}, ${memo}) <- ${resultToString(transferResult)}`;
|
|
61137
61191
|
// All good!
|
|
61138
61192
|
if (transferResult.isOk) {
|
|
61139
61193
|
regs.set(transfer_IN_OUT_REG, HostCallResult.OK);
|
|
@@ -61192,11 +61246,11 @@ class Upgrade {
|
|
|
61192
61246
|
const codeHash = bytes_Bytes.zero(hash_HASH_SIZE);
|
|
61193
61247
|
const memoryReadResult = memory.loadInto(codeHash.raw, codeHashStart);
|
|
61194
61248
|
if (memoryReadResult.isError) {
|
|
61195
|
-
logger_logger.trace
|
|
61249
|
+
logger_logger.trace `UPGRADE(${codeHash}, ${gas}, ${allowance}) <- PANIC`;
|
|
61196
61250
|
return PvmExecution.Panic;
|
|
61197
61251
|
}
|
|
61198
61252
|
this.partialState.upgradeService(codeHash.asOpaque(), gas, allowance);
|
|
61199
|
-
logger_logger.trace
|
|
61253
|
+
logger_logger.trace `UPGRADE(${codeHash}, ${gas}, ${allowance})`;
|
|
61200
61254
|
regs.set(upgrade_IN_OUT_REG, HostCallResult.OK);
|
|
61201
61255
|
}
|
|
61202
61256
|
}
|
|
@@ -61230,11 +61284,11 @@ class Yield {
|
|
|
61230
61284
|
const hash = bytes_Bytes.zero(hash_HASH_SIZE);
|
|
61231
61285
|
const memoryReadResult = memory.loadInto(hash.raw, hashStart);
|
|
61232
61286
|
if (memoryReadResult.isError) {
|
|
61233
|
-
logger_logger.trace
|
|
61287
|
+
logger_logger.trace `YIELD() <- PANIC`;
|
|
61234
61288
|
return PvmExecution.Panic;
|
|
61235
61289
|
}
|
|
61236
61290
|
this.partialState.yield(hash);
|
|
61237
|
-
logger_logger.trace
|
|
61291
|
+
logger_logger.trace `YIELD(${hash})`;
|
|
61238
61292
|
regs.set(yield_IN_OUT_REG, HostCallResult.OK);
|
|
61239
61293
|
}
|
|
61240
61294
|
}
|
|
@@ -61276,10 +61330,10 @@ class Fetch {
|
|
|
61276
61330
|
const chunk = value === null ? new Uint8Array() : value.raw.subarray(Number(offset), Number(offset + length));
|
|
61277
61331
|
const storeResult = memory.storeFrom(output, chunk);
|
|
61278
61332
|
if (storeResult.isError) {
|
|
61279
|
-
logger_logger.trace
|
|
61333
|
+
logger_logger.trace `FETCH(${kind}) <- PANIC`;
|
|
61280
61334
|
return PvmExecution.Panic;
|
|
61281
61335
|
}
|
|
61282
|
-
logger_logger.trace
|
|
61336
|
+
logger_logger.trace `FETCH(${kind}) <- ${value?.toStringTruncated()}`;
|
|
61283
61337
|
// write result
|
|
61284
61338
|
regs.set(fetch_IN_OUT_REG, value === null ? HostCallResult.NONE : valueLength);
|
|
61285
61339
|
}
|
|
@@ -61387,8 +61441,8 @@ var FetchKind;
|
|
|
61387
61441
|
|
|
61388
61442
|
|
|
61389
61443
|
const info_IN_OUT_REG = 7;
|
|
61390
|
-
const OFFSET_REG = Compatibility.isSuite(TestSuite.W3F_DAVXY) ? 9 : 11;
|
|
61391
|
-
const LEN_REG = Compatibility.isSuite(TestSuite.W3F_DAVXY) ? 10 : 12;
|
|
61444
|
+
const OFFSET_REG = Compatibility.isSuite(TestSuite.W3F_DAVXY) || Compatibility.isGreaterOrEqual(GpVersion.V0_7_2) ? 9 : 11;
|
|
61445
|
+
const LEN_REG = Compatibility.isSuite(TestSuite.W3F_DAVXY) || Compatibility.isGreaterOrEqual(GpVersion.V0_7_2) ? 10 : 12;
|
|
61392
61446
|
/**
|
|
61393
61447
|
* Return info about some account.
|
|
61394
61448
|
*
|
|
@@ -61405,7 +61459,7 @@ const LEN_REG = Compatibility.isSuite(TestSuite.W3F_DAVXY) ? 10 : 12;
|
|
|
61405
61459
|
* a = last accumulation timeslot
|
|
61406
61460
|
* p = parent service
|
|
61407
61461
|
*
|
|
61408
|
-
* https://graypaper.fluffylabs.dev/#/
|
|
61462
|
+
* https://graypaper.fluffylabs.dev/#/ab2cdbd/333b00333b00?v=0.7.2
|
|
61409
61463
|
*/
|
|
61410
61464
|
class Info {
|
|
61411
61465
|
currentServiceId;
|
|
@@ -61435,13 +61489,15 @@ class Info {
|
|
|
61435
61489
|
const offset = minU64(regs.get(OFFSET_REG), valueLength);
|
|
61436
61490
|
// l
|
|
61437
61491
|
const length = minU64(regs.get(LEN_REG), numbers_tryAsU64(valueLength - offset));
|
|
61492
|
+
// NOTE: casting to `Number` is safe in both places, since we are always bounded
|
|
61493
|
+
// by the actual `encodedInfo.length`, which is equal `96`.
|
|
61438
61494
|
const chunk = encodedInfo.raw.subarray(Number(offset), Number(offset + length));
|
|
61439
61495
|
const writeResult = memory.storeFrom(outputStart, chunk);
|
|
61440
61496
|
if (writeResult.isError) {
|
|
61441
|
-
logger_logger.trace
|
|
61497
|
+
logger_logger.trace `INFO(${serviceId}) <- PANIC`;
|
|
61442
61498
|
return PvmExecution.Panic;
|
|
61443
61499
|
}
|
|
61444
|
-
logger_logger.trace
|
|
61500
|
+
logger_logger.trace `INFO(${serviceId}) <- ${bytes_BytesBlob.blobFrom(chunk)}`;
|
|
61445
61501
|
if (accountInfo === null) {
|
|
61446
61502
|
regs.set(info_IN_OUT_REG, HostCallResult.NONE);
|
|
61447
61503
|
return;
|
|
@@ -61454,7 +61510,7 @@ class Info {
|
|
|
61454
61510
|
*
|
|
61455
61511
|
* Used exclusively by `info` host call.
|
|
61456
61512
|
*
|
|
61457
|
-
* https://graypaper.fluffylabs.dev/#/
|
|
61513
|
+
* https://graypaper.fluffylabs.dev/#/ab2cdbd/33920033b500?v=0.7.2
|
|
61458
61514
|
*/
|
|
61459
61515
|
const codecServiceAccountInfoWithThresholdBalance = descriptors_codec.object({
|
|
61460
61516
|
codeHash: descriptors_codec.bytes(hash_HASH_SIZE),
|
|
@@ -61502,7 +61558,7 @@ class LogHostCall {
|
|
|
61502
61558
|
memory.loadInto(target, targetStart);
|
|
61503
61559
|
}
|
|
61504
61560
|
memory.loadInto(message, msgStart);
|
|
61505
|
-
logger_logger.trace
|
|
61561
|
+
logger_logger.trace `SERVICE [${this.currentServiceId}] [${lvl}] ${decoder.decode(target)} ${decoder.decode(message)}`;
|
|
61506
61562
|
return Promise.resolve(undefined);
|
|
61507
61563
|
}
|
|
61508
61564
|
}
|
|
@@ -61542,12 +61598,12 @@ class Lookup {
|
|
|
61542
61598
|
const preImageHash = bytes_Bytes.zero(hash_HASH_SIZE);
|
|
61543
61599
|
const memoryReadResult = memory.loadInto(preImageHash.raw, hashAddress);
|
|
61544
61600
|
if (memoryReadResult.isError) {
|
|
61545
|
-
logger_logger.trace
|
|
61601
|
+
logger_logger.trace `LOOKUP(${serviceId}, ${preImageHash}) <- PANIC`;
|
|
61546
61602
|
return PvmExecution.Panic;
|
|
61547
61603
|
}
|
|
61548
61604
|
// v
|
|
61549
61605
|
const preImage = this.account.lookup(serviceId, preImageHash);
|
|
61550
|
-
logger_logger.trace
|
|
61606
|
+
logger_logger.trace `LOOKUP(${serviceId}, ${preImageHash}) <- ${preImage?.toStringTruncated()}...`;
|
|
61551
61607
|
const preImageLength = preImage === null ? numbers_tryAsU64(0) : numbers_tryAsU64(preImage.raw.length);
|
|
61552
61608
|
const preimageBlobOffset = regs.get(10);
|
|
61553
61609
|
const lengthToWrite = regs.get(11);
|
|
@@ -61609,7 +61665,7 @@ class Read {
|
|
|
61609
61665
|
const rawKey = bytes_BytesBlob.blobFrom(new Uint8Array(storageKeyLengthClamped));
|
|
61610
61666
|
const memoryReadResult = memory.loadInto(rawKey.raw, storageKeyStartAddress);
|
|
61611
61667
|
if (memoryReadResult.isError) {
|
|
61612
|
-
logger_logger.trace
|
|
61668
|
+
logger_logger.trace `READ(${serviceId}, ${rawKey}) <- PANIC`;
|
|
61613
61669
|
return PvmExecution.Panic;
|
|
61614
61670
|
}
|
|
61615
61671
|
// v
|
|
@@ -61627,15 +61683,15 @@ class Read {
|
|
|
61627
61683
|
const chunk = value === null ? new Uint8Array(0) : value.raw.subarray(Number(offset), Number(offset + blobLength));
|
|
61628
61684
|
const memoryWriteResult = memory.storeFrom(destinationAddress, chunk);
|
|
61629
61685
|
if (memoryWriteResult.isError) {
|
|
61630
|
-
logger_logger.trace
|
|
61686
|
+
logger_logger.trace `READ(${serviceId}, ${rawKey}) <- PANIC`;
|
|
61631
61687
|
return PvmExecution.Panic;
|
|
61632
61688
|
}
|
|
61633
61689
|
if (value === null) {
|
|
61634
|
-
logger_logger.trace
|
|
61690
|
+
logger_logger.trace `READ(${serviceId}, ${rawKey}) <- NONE`;
|
|
61635
61691
|
regs.set(read_IN_OUT_REG, HostCallResult.NONE);
|
|
61636
61692
|
return;
|
|
61637
61693
|
}
|
|
61638
|
-
logger_logger.trace
|
|
61694
|
+
logger_logger.trace `READ(${serviceId}, ${rawKey}) <- ${bytes_BytesBlob.blobFrom(chunk).toStringTruncated()}`;
|
|
61639
61695
|
regs.set(read_IN_OUT_REG, valueLength);
|
|
61640
61696
|
}
|
|
61641
61697
|
}
|
|
@@ -61678,7 +61734,7 @@ class Write {
|
|
|
61678
61734
|
const rawStorageKey = new Uint8Array(storageKeyLengthClamped);
|
|
61679
61735
|
const keyLoadingResult = memory.loadInto(rawStorageKey, storageKeyStartAddress);
|
|
61680
61736
|
if (keyLoadingResult.isError) {
|
|
61681
|
-
logger_logger.trace
|
|
61737
|
+
logger_logger.trace `WRITE() <- PANIC`;
|
|
61682
61738
|
return PvmExecution.Panic;
|
|
61683
61739
|
}
|
|
61684
61740
|
// k
|
|
@@ -61688,14 +61744,14 @@ class Write {
|
|
|
61688
61744
|
const valueLoadingResult = memory.loadInto(value, valueStart);
|
|
61689
61745
|
// Note [MaSo] this is ok to return bcs if valueLength is 0, then this panic won't happen
|
|
61690
61746
|
if (valueLoadingResult.isError) {
|
|
61691
|
-
logger_logger.trace
|
|
61747
|
+
logger_logger.trace `WRITE(${storageKey}) <- PANIC`;
|
|
61692
61748
|
return PvmExecution.Panic;
|
|
61693
61749
|
}
|
|
61694
61750
|
/** https://graypaper.fluffylabs.dev/#/9a08063/33af0133b201?v=0.6.6 */
|
|
61695
61751
|
const maybeValue = valueLength === 0n ? null : bytes_BytesBlob.blobFrom(value);
|
|
61696
61752
|
// a
|
|
61697
61753
|
const result = this.account.write(storageKey, maybeValue);
|
|
61698
|
-
logger_logger.trace
|
|
61754
|
+
logger_logger.trace `WRITE(${storageKey}, ${maybeValue?.toStringTruncated()}) <- ${resultToString(result)}`;
|
|
61699
61755
|
if (result.isError) {
|
|
61700
61756
|
regs.set(write_IN_OUT_REG, HostCallResult.FULL);
|
|
61701
61757
|
return;
|
|
@@ -61887,18 +61943,18 @@ class Accumulate {
|
|
|
61887
61943
|
async pvmAccumulateInvocation(slot, serviceId, operands, gas, entropy, inputStateUpdate) {
|
|
61888
61944
|
const service = this.state.getService(serviceId);
|
|
61889
61945
|
if (service === null) {
|
|
61890
|
-
accumulate_logger.log
|
|
61946
|
+
accumulate_logger.log `Service with id ${serviceId} not found.`;
|
|
61891
61947
|
return result_Result.error(PvmInvocationError.NoService);
|
|
61892
61948
|
}
|
|
61893
61949
|
const codeHash = service.getInfo().codeHash;
|
|
61894
61950
|
// TODO [ToDr] Should we check that the preimage is still available?
|
|
61895
61951
|
const code = service.getPreimage(codeHash.asOpaque());
|
|
61896
61952
|
if (code === null) {
|
|
61897
|
-
accumulate_logger.log
|
|
61953
|
+
accumulate_logger.log `Code with hash ${codeHash} not found for service ${serviceId}.`;
|
|
61898
61954
|
return result_Result.error(PvmInvocationError.NoPreimage);
|
|
61899
61955
|
}
|
|
61900
61956
|
if (code.length > W_C) {
|
|
61901
|
-
accumulate_logger.log
|
|
61957
|
+
accumulate_logger.log `Code with hash ${codeHash} is too long for service ${serviceId}.`;
|
|
61902
61958
|
return result_Result.error(PvmInvocationError.PreimageTooLong);
|
|
61903
61959
|
}
|
|
61904
61960
|
const nextServiceId = generateNextServiceId({ serviceId, entropy, timeslot: slot }, this.chainSpec);
|
|
@@ -61920,10 +61976,10 @@ class Accumulate {
|
|
|
61920
61976
|
if (result.hasStatus()) {
|
|
61921
61977
|
const status = result.status;
|
|
61922
61978
|
if (status === status_Status.OOG || status === status_Status.PANIC) {
|
|
61923
|
-
accumulate_logger.trace
|
|
61979
|
+
accumulate_logger.trace `[${serviceId}] accumulate finished with ${status_Status[status]} reverting to checkpoint.`;
|
|
61924
61980
|
return result_Result.ok({ stateUpdate: checkpoint, consumedGas: common_tryAsServiceGas(result.consumedGas) });
|
|
61925
61981
|
}
|
|
61926
|
-
accumulate_logger.trace
|
|
61982
|
+
accumulate_logger.trace `[${serviceId}] accumulate finished with ${status_Status[status]}`;
|
|
61927
61983
|
}
|
|
61928
61984
|
/**
|
|
61929
61985
|
* PVM invocation returned a hash so we override whatever `yield` host call
|
|
@@ -61948,14 +62004,14 @@ class Accumulate {
|
|
|
61948
62004
|
* https://graypaper.fluffylabs.dev/#/7e6ff6a/18d70118d701?v=0.6.7
|
|
61949
62005
|
*/
|
|
61950
62006
|
async accumulateSingleService(serviceId, operands, gasCost, slot, entropy, inputStateUpdate) {
|
|
61951
|
-
accumulate_logger.log
|
|
62007
|
+
accumulate_logger.log `Accumulating service ${serviceId}, items: ${operands.length} at slot: ${slot}.`;
|
|
61952
62008
|
const result = await this.pvmAccumulateInvocation(slot, serviceId, operands, gasCost, entropy, inputStateUpdate);
|
|
61953
62009
|
if (result.isError) {
|
|
61954
62010
|
// https://graypaper.fluffylabs.dev/#/7e6ff6a/2fb6012fb601?v=0.6.7
|
|
61955
|
-
accumulate_logger.log
|
|
62011
|
+
accumulate_logger.log `Accumulation failed for ${serviceId}.`;
|
|
61956
62012
|
return { stateUpdate: null, consumedGas: 0n };
|
|
61957
62013
|
}
|
|
61958
|
-
accumulate_logger.log
|
|
62014
|
+
accumulate_logger.log `Accumulation successful for ${serviceId}. Consumed: ${result.ok.consumedGas}`;
|
|
61959
62015
|
return result.ok;
|
|
61960
62016
|
}
|
|
61961
62017
|
/**
|
|
@@ -62004,6 +62060,7 @@ class Accumulate {
|
|
|
62004
62060
|
const serviceIds = accumulateData.getServiceIds();
|
|
62005
62061
|
let gasCost = common_tryAsServiceGas(0);
|
|
62006
62062
|
let currentState = inputStateUpdate;
|
|
62063
|
+
const currentManager = (inputStateUpdate.privilegedServices ?? this.state.privilegedServices).manager;
|
|
62007
62064
|
for (const serviceId of serviceIds) {
|
|
62008
62065
|
const checkpoint = AccumulationStateUpdate.copyFrom(currentState);
|
|
62009
62066
|
const { consumedGas, stateUpdate } = await this.accumulateSingleService(serviceId, accumulateData.getOperands(serviceId), accumulateData.getGasCost(serviceId), slot, entropy, currentState);
|
|
@@ -62013,6 +62070,21 @@ class Accumulate {
|
|
|
62013
62070
|
serviceStatistics.gasUsed = common_tryAsServiceGas(serviceStatistics.gasUsed + consumedGas);
|
|
62014
62071
|
statistics.set(serviceId, serviceStatistics);
|
|
62015
62072
|
currentState = stateUpdate === null ? checkpoint : stateUpdate;
|
|
62073
|
+
if (Compatibility.is(GpVersion.V0_7_0) && serviceId === currentManager) {
|
|
62074
|
+
const newV = currentState.privilegedServices?.validatorsManager;
|
|
62075
|
+
if (currentState.privilegedServices !== null && newV !== undefined && serviceIds.includes(newV)) {
|
|
62076
|
+
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+`;
|
|
62077
|
+
// Since serviceIds already contains newV, this service gets accumulated twice.
|
|
62078
|
+
// To avoid double-counting, we skip stats and gas cost tracking here.
|
|
62079
|
+
// We need this accumulation to get the correct `validatorsManager`
|
|
62080
|
+
const { stateUpdate } = await this.accumulateSingleService(newV, accumulateData.getOperands(newV), accumulateData.getGasCost(newV), slot, entropy, checkpoint);
|
|
62081
|
+
const correctV = stateUpdate?.privilegedServices?.validatorsManager ?? this.state.privilegedServices.validatorsManager;
|
|
62082
|
+
currentState.privilegedServices = PrivilegedServices.create({
|
|
62083
|
+
...currentState.privilegedServices,
|
|
62084
|
+
validatorsManager: correctV,
|
|
62085
|
+
});
|
|
62086
|
+
}
|
|
62087
|
+
}
|
|
62016
62088
|
}
|
|
62017
62089
|
return {
|
|
62018
62090
|
state: currentState,
|
|
@@ -62157,11 +62229,14 @@ class DeferredTransfers {
|
|
|
62157
62229
|
async transition({ pendingTransfers, timeslot, servicesUpdate: inputServicesUpdate, entropy, }) {
|
|
62158
62230
|
// https://graypaper.fluffylabs.dev/#/7e6ff6a/187a03187a03?v=0.6.7
|
|
62159
62231
|
const transferStatistics = new Map();
|
|
62160
|
-
const services = uniquePreserveOrder(pendingTransfers.
|
|
62232
|
+
const services = uniquePreserveOrder(pendingTransfers.map((x) => x.destination));
|
|
62161
62233
|
let currentStateUpdate = AccumulationStateUpdate.new(inputServicesUpdate);
|
|
62162
62234
|
for (const serviceId of services) {
|
|
62163
62235
|
const partiallyUpdatedState = new PartiallyUpdatedState(this.state, currentStateUpdate);
|
|
62164
|
-
|
|
62236
|
+
// https://graypaper.fluffylabs.dev/#/38c4e62/18750318ae03?v=0.7.0
|
|
62237
|
+
const transfers = pendingTransfers
|
|
62238
|
+
.filter((pendingTransfer) => pendingTransfer.destination === serviceId)
|
|
62239
|
+
.toSorted((a, b) => a.source - b.source);
|
|
62165
62240
|
const info = partiallyUpdatedState.getServiceInfo(serviceId);
|
|
62166
62241
|
if (info === null) {
|
|
62167
62242
|
return result_Result.error(DeferredTransfersErrorCode.ServiceInfoNotExist);
|
|
@@ -62181,13 +62256,13 @@ class DeferredTransfers {
|
|
|
62181
62256
|
const isCodeCorrect = code !== null && code.length <= W_C;
|
|
62182
62257
|
if (!hasTransfers || !isCodeCorrect) {
|
|
62183
62258
|
if (code === null) {
|
|
62184
|
-
deferred_transfers_logger.trace
|
|
62259
|
+
deferred_transfers_logger.trace `Skipping ON_TRANSFER execution for service ${serviceId} because code is null`;
|
|
62185
62260
|
}
|
|
62186
62261
|
else if (!hasTransfers) {
|
|
62187
|
-
deferred_transfers_logger.trace
|
|
62262
|
+
deferred_transfers_logger.trace `Skipping ON_TRANSFER execution for service ${serviceId} because there are no transfers`;
|
|
62188
62263
|
}
|
|
62189
62264
|
else {
|
|
62190
|
-
deferred_transfers_logger.trace
|
|
62265
|
+
deferred_transfers_logger.trace `Skipping ON_TRANSFER execution for service ${serviceId} because code is too long`;
|
|
62191
62266
|
}
|
|
62192
62267
|
}
|
|
62193
62268
|
else {
|
|
@@ -62815,7 +62890,7 @@ function verifyRefineContexts(minLookupSlot, contexts, recentBlocksPartialUpdate
|
|
|
62815
62890
|
headerChain.isAncestor(context.lookupAnchorSlot, context.lookupAnchor, context.anchor);
|
|
62816
62891
|
if (!isInChain) {
|
|
62817
62892
|
if (process.env.SKIP_LOOKUP_ANCHOR_CHECK !== undefined) {
|
|
62818
|
-
verify_contextual_logger.warn
|
|
62893
|
+
verify_contextual_logger.warn `Lookup anchor check for ${context.lookupAnchor} would fail, but override is active.`;
|
|
62819
62894
|
}
|
|
62820
62895
|
else {
|
|
62821
62896
|
return result_Result.error(ReportsError.SegmentRootLookupInvalid, `Lookup anchor is not found in chain. Hash: ${context.lookupAnchor} (slot: ${context.lookupAnchorSlot})`);
|
|
@@ -63702,7 +63777,7 @@ class OnChain {
|
|
|
63702
63777
|
reports: availableReports,
|
|
63703
63778
|
entropy: entropy[0],
|
|
63704
63779
|
});
|
|
63705
|
-
chain_stf_logger.log
|
|
63780
|
+
chain_stf_logger.log `${timerAccumulate()}`;
|
|
63706
63781
|
if (accumulateResult.isError) {
|
|
63707
63782
|
return stfError(StfErrorKind.Accumulate, accumulateResult);
|
|
63708
63783
|
}
|
|
@@ -63833,7 +63908,7 @@ class Importer {
|
|
|
63833
63908
|
this.stf = new OnChain(spec, state, blocks, hasher);
|
|
63834
63909
|
this.state = state;
|
|
63835
63910
|
this.currentHash = currentBestHeaderHash;
|
|
63836
|
-
logger.info
|
|
63911
|
+
logger.info `😎 Best time slot: ${state.timeslot} (header hash: ${currentBestHeaderHash})`;
|
|
63837
63912
|
}
|
|
63838
63913
|
async importBlock(block, omitSealVerification) {
|
|
63839
63914
|
const timer = measure("importBlock");
|
|
@@ -63841,20 +63916,20 @@ class Importer {
|
|
|
63841
63916
|
const maybeBestHeader = await this.importBlockInternal(block, omitSealVerification);
|
|
63842
63917
|
if (maybeBestHeader.isOk) {
|
|
63843
63918
|
const bestHeader = maybeBestHeader.ok;
|
|
63844
|
-
this.logger.info
|
|
63845
|
-
this.logger.log
|
|
63919
|
+
this.logger.info `🧊 Best block: #${timeSlot} (${bestHeader.hash})`;
|
|
63920
|
+
this.logger.log `${timer()}`;
|
|
63846
63921
|
return maybeBestHeader;
|
|
63847
63922
|
}
|
|
63848
|
-
this.logger.log
|
|
63849
|
-
this.logger.log
|
|
63923
|
+
this.logger.log `❌ Rejected block #${timeSlot}: ${resultToString(maybeBestHeader)}`;
|
|
63924
|
+
this.logger.log `${timer()}`;
|
|
63850
63925
|
return maybeBestHeader;
|
|
63851
63926
|
}
|
|
63852
63927
|
async importBlockInternal(block, omitSealVerification = false) {
|
|
63853
63928
|
const logger = this.logger;
|
|
63854
|
-
logger.log
|
|
63929
|
+
logger.log `🧱 Attempting to import a new block`;
|
|
63855
63930
|
const timerVerify = measure("import:verify");
|
|
63856
63931
|
const hash = await this.verifier.verifyBlock(block);
|
|
63857
|
-
logger.log
|
|
63932
|
+
logger.log `${timerVerify()}`;
|
|
63858
63933
|
if (hash.isError) {
|
|
63859
63934
|
return importerError(ImporterErrorKind.Verifier, hash);
|
|
63860
63935
|
}
|
|
@@ -63874,10 +63949,10 @@ class Importer {
|
|
|
63874
63949
|
}
|
|
63875
63950
|
const timeSlot = block.header.view().timeSlotIndex.materialize();
|
|
63876
63951
|
const headerHash = hash.ok;
|
|
63877
|
-
logger.log
|
|
63952
|
+
logger.log `🧱 Verified block: Got hash ${headerHash} for block at slot ${timeSlot}.`;
|
|
63878
63953
|
const timerStf = measure("import:stf");
|
|
63879
63954
|
const res = await this.stf.transition(block, headerHash, omitSealVerification);
|
|
63880
|
-
logger.log
|
|
63955
|
+
logger.log `${timerStf()}`;
|
|
63881
63956
|
if (res.isError) {
|
|
63882
63957
|
return importerError(ImporterErrorKind.Stf, res);
|
|
63883
63958
|
}
|
|
@@ -63886,7 +63961,7 @@ class Importer {
|
|
|
63886
63961
|
const timerState = measure("import:state");
|
|
63887
63962
|
const updateResult = await this.states.updateAndSetState(headerHash, this.state, update);
|
|
63888
63963
|
if (updateResult.isError) {
|
|
63889
|
-
logger.error
|
|
63964
|
+
logger.error `🧱 Unable to update state: ${resultToString(updateResult)}`;
|
|
63890
63965
|
return importerError(ImporterErrorKind.Update, updateResult);
|
|
63891
63966
|
}
|
|
63892
63967
|
const newState = this.states.getState(headerHash);
|
|
@@ -63897,17 +63972,17 @@ class Importer {
|
|
|
63897
63972
|
// the state of a parent block to support forks and create a fresh STF.
|
|
63898
63973
|
this.state.updateBackend(newState.backend);
|
|
63899
63974
|
this.currentHash = headerHash;
|
|
63900
|
-
logger.log
|
|
63975
|
+
logger.log `${timerState()}`;
|
|
63901
63976
|
// insert new state and the block to DB.
|
|
63902
63977
|
const timerDb = measure("import:db");
|
|
63903
63978
|
const writeBlocks = this.blocks.insertBlock(new WithHash(headerHash, block));
|
|
63904
63979
|
// Computation of the state root may happen asynchronously,
|
|
63905
63980
|
// but we still need to wait for it before next block can be imported
|
|
63906
63981
|
const stateRoot = await this.states.getStateRoot(newState);
|
|
63907
|
-
logger.log
|
|
63982
|
+
logger.log `🧱 Storing post-state-root for ${headerHash}: ${stateRoot}.`;
|
|
63908
63983
|
const writeStateRoot = this.blocks.setPostStateRoot(headerHash, stateRoot);
|
|
63909
63984
|
await Promise.all([writeBlocks, writeStateRoot]);
|
|
63910
|
-
logger.log
|
|
63985
|
+
logger.log `${timerDb()}`;
|
|
63911
63986
|
// finally update the best block
|
|
63912
63987
|
await this.blocks.setBestHeaderHash(headerHash);
|
|
63913
63988
|
return result_Result.ok(new WithHash(headerHash, block.header.view()));
|
|
@@ -63955,7 +64030,7 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
|
|
|
63955
64030
|
Logger.configureAll(process.env.JAM_LOG ?? "", Level.LOG);
|
|
63956
64031
|
const machine = importerStateMachine();
|
|
63957
64032
|
const channel = MessageChannelStateMachine.receiveChannel(machine, external_node_worker_threads_namespaceObject.parentPort);
|
|
63958
|
-
channel.then((channel) => importer_main(channel)).catch((e) => importer_logger.error
|
|
64033
|
+
channel.then((channel) => importer_main(channel)).catch((e) => importer_logger.error `${e}`);
|
|
63959
64034
|
}
|
|
63960
64035
|
const keccakHasher = KeccakHasher.create();
|
|
63961
64036
|
async function createImporter(config) {
|
|
@@ -63977,7 +64052,7 @@ async function createImporter(config) {
|
|
|
63977
64052
|
*/
|
|
63978
64053
|
async function importer_main(channel) {
|
|
63979
64054
|
const wasmPromise = initAll();
|
|
63980
|
-
importer_logger.info
|
|
64055
|
+
importer_logger.info `📥 Importer starting ${channel.currentState()}`;
|
|
63981
64056
|
// Await the configuration object
|
|
63982
64057
|
const ready = await channel.waitForState("ready(importer)");
|
|
63983
64058
|
let closeDb = async () => { };
|
|
@@ -63989,7 +64064,7 @@ async function importer_main(channel) {
|
|
|
63989
64064
|
};
|
|
63990
64065
|
// TODO [ToDr] this is shit, since we have circular dependency.
|
|
63991
64066
|
worker.setImporter(importer);
|
|
63992
|
-
importer_logger.info
|
|
64067
|
+
importer_logger.info `📥 Importer waiting for blocks.`;
|
|
63993
64068
|
worker.onBlock.on(async (block) => {
|
|
63994
64069
|
const res = await importer.importBlock(block, config.omitSealVerification);
|
|
63995
64070
|
if (res.isOk) {
|
|
@@ -63998,7 +64073,7 @@ async function importer_main(channel) {
|
|
|
63998
64073
|
});
|
|
63999
64074
|
await wasmPromise;
|
|
64000
64075
|
});
|
|
64001
|
-
importer_logger.info
|
|
64076
|
+
importer_logger.info `📥 Importer finished. Closing channel.`;
|
|
64002
64077
|
// close the database
|
|
64003
64078
|
await closeDb();
|
|
64004
64079
|
// Close the comms to gracefuly close the app.
|
|
@@ -64019,8 +64094,8 @@ async function importer_main(channel) {
|
|
|
64019
64094
|
const zeroHash = bytes_Bytes.zero(hash_HASH_SIZE).asOpaque();
|
|
64020
64095
|
async function mainImporter(config, withRelPath) {
|
|
64021
64096
|
await initAll();
|
|
64022
|
-
common_logger.info
|
|
64023
|
-
common_logger.info
|
|
64097
|
+
common_logger.info `🫐 Typeberry ${package_namespaceObject.rE}. GP: ${CURRENT_VERSION} (${CURRENT_SUITE})`;
|
|
64098
|
+
common_logger.info `🎸 Starting importer: ${config.nodeName}.`;
|
|
64024
64099
|
const chainSpec = getChainSpec(config.node.flavor);
|
|
64025
64100
|
const { rootDb, dbPath, genesisHeaderHash } = openDatabase(config.nodeName, config.node.chainSpec.genesisHeader, withRelPath(config.node.databaseBasePath));
|
|
64026
64101
|
// Initialize the database with genesis state and block if there isn't one.
|
|
@@ -64047,9 +64122,9 @@ async function mainImporter(config, withRelPath) {
|
|
|
64047
64122
|
return importer.getBestStateRootHash() ?? zeroHash;
|
|
64048
64123
|
},
|
|
64049
64124
|
async close() {
|
|
64050
|
-
common_logger.log
|
|
64125
|
+
common_logger.log `[main] 🛢️ Closing the database`;
|
|
64051
64126
|
await lmdb.close();
|
|
64052
|
-
common_logger.info
|
|
64127
|
+
common_logger.info `[main] ✅ Done.`;
|
|
64053
64128
|
},
|
|
64054
64129
|
};
|
|
64055
64130
|
return api;
|
|
@@ -64076,7 +64151,7 @@ function getFuzzDetails() {
|
|
|
64076
64151
|
};
|
|
64077
64152
|
}
|
|
64078
64153
|
async function mainFuzz(fuzzConfig, withRelPath) {
|
|
64079
|
-
main_fuzz_logger.info
|
|
64154
|
+
main_fuzz_logger.info `💨 Fuzzer V${fuzzConfig.version} starting up.`;
|
|
64080
64155
|
const { jamNodeConfig: config } = fuzzConfig;
|
|
64081
64156
|
let runningNode = null;
|
|
64082
64157
|
const fuzzSeed = BigInt(Date.now());
|
|
@@ -64146,20 +64221,20 @@ async function mainFuzz(fuzzConfig, withRelPath) {
|
|
|
64146
64221
|
|
|
64147
64222
|
const importBlocks = async (node, blocksToImport) => {
|
|
64148
64223
|
const logger = Logger.new(import.meta.filename, "jam");
|
|
64149
|
-
logger.info
|
|
64224
|
+
logger.info `📖 Reading ${blocksToImport.length} blocks`;
|
|
64150
64225
|
const reader = startBlocksReader({
|
|
64151
64226
|
files: blocksToImport,
|
|
64152
64227
|
chainSpec: node.chainSpec,
|
|
64153
64228
|
});
|
|
64154
64229
|
for (const block of reader) {
|
|
64155
|
-
logger.log
|
|
64230
|
+
logger.log `📖 Importing block: #${block.header.view().timeSlotIndex.materialize()}`;
|
|
64156
64231
|
const res = await node.importBlock(block);
|
|
64157
64232
|
if (res.isError) {
|
|
64158
|
-
logger.error
|
|
64233
|
+
logger.error `📖 ${resultToString(res)}`;
|
|
64159
64234
|
}
|
|
64160
64235
|
}
|
|
64161
64236
|
// close the importer.
|
|
64162
|
-
logger.info
|
|
64237
|
+
logger.info `All blocks scheduled to be imported.`;
|
|
64163
64238
|
return await node.close();
|
|
64164
64239
|
};
|
|
64165
64240
|
function* startBlocksReader(options) {
|
|
@@ -64196,7 +64271,7 @@ function readJsonBlock(file, chainSpec) {
|
|
|
64196
64271
|
var minimist = __nccwpck_require__(8595);
|
|
64197
64272
|
var minimist_default = /*#__PURE__*/__nccwpck_require__.n(minimist);
|
|
64198
64273
|
;// CONCATENATED MODULE: ./bin/jam/package.json
|
|
64199
|
-
const jam_package_namespaceObject = {"rE":"0.1.
|
|
64274
|
+
const jam_package_namespaceObject = {"rE":"0.1.2"};
|
|
64200
64275
|
;// CONCATENATED MODULE: ./bin/jam/args.ts
|
|
64201
64276
|
|
|
64202
64277
|
|
|
@@ -64356,6 +64431,7 @@ function parseFuzzVersion(v) {
|
|
|
64356
64431
|
|
|
64357
64432
|
|
|
64358
64433
|
|
|
64434
|
+
|
|
64359
64435
|
const prepareConfigFile = (args) => {
|
|
64360
64436
|
const nodeConfig = loadConfig(args.args.configPath);
|
|
64361
64437
|
const nodeName = args.command === Command.Dev ? `${args.args.nodeName}-${args.args.index}` : args.args.nodeName;
|
|
@@ -64382,14 +64458,8 @@ const prepareConfigFile = (args) => {
|
|
|
64382
64458
|
};
|
|
64383
64459
|
if (import.meta.url === (0,external_node_url_namespaceObject.pathToFileURL)(process.argv[1]).href) {
|
|
64384
64460
|
Logger.configureAll(process.env.JAM_LOG ?? "", Level.LOG);
|
|
64385
|
-
const relPath = `${import.meta.dirname}/../..`;
|
|
64386
|
-
const withRelPath = (p) => {
|
|
64387
|
-
if (p.startsWith("/")) {
|
|
64388
|
-
return p;
|
|
64389
|
-
}
|
|
64390
|
-
return `${relPath}/${p}`;
|
|
64391
|
-
};
|
|
64392
64461
|
let args;
|
|
64462
|
+
const withRelPath = workspacePathFix(`${import.meta.dirname}/../..`);
|
|
64393
64463
|
try {
|
|
64394
64464
|
const parsed = parseArgs(process.argv.slice(2), withRelPath);
|
|
64395
64465
|
if (parsed === null) {
|