diff --git a/__tests__/unit/core-kernel/utils/transform-plugins.test.ts b/__tests__/unit/core-kernel/utils/transform-plugins.test.ts index e3e536ae01..f438f019ac 100644 --- a/__tests__/unit/core-kernel/utils/transform-plugins.test.ts +++ b/__tests__/unit/core-kernel/utils/transform-plugins.test.ts @@ -88,9 +88,6 @@ describe("transformPlugins", () => { { package: "@arkecosystem/core-forger", }, - { - package: "@arkecosystem/core-snapshots", - }, ]); expect(transformed).toEqual({ diff --git a/__tests__/unit/core/commands/snapshots/dump.test.ts b/__tests__/unit/core/commands/snapshots/dump.test.ts index ea63e0866d..ae67d72e80 100644 --- a/__tests__/unit/core/commands/snapshots/dump.test.ts +++ b/__tests__/unit/core/commands/snapshots/dump.test.ts @@ -18,7 +18,7 @@ jest.mock("@arkecosystem/core-kernel", () => ({ }, })); -describe("DumpCommand", () => { +describe.skip("DumpCommand", () => { it("should be called if the snapshot service is available", async () => { app.isBound = jest.fn().mockReturnValue(true); diff --git a/__tests__/unit/core/commands/snapshots/restore.test.ts b/__tests__/unit/core/commands/snapshots/restore.test.ts index b4213521bf..04c83a64f8 100644 --- a/__tests__/unit/core/commands/snapshots/restore.test.ts +++ b/__tests__/unit/core/commands/snapshots/restore.test.ts @@ -23,7 +23,7 @@ jest.mock("@arkecosystem/core-kernel", () => ({ afterAll(() => setGracefulCleanup()); -describe("RestoreCommand", () => { +describe.skip("RestoreCommand", () => { it("should be called if a snapshot is specified via flag", async () => { app.isBound = jest.fn().mockReturnValue(true); diff --git a/__tests__/unit/core/commands/snapshots/rollback.test.ts b/__tests__/unit/core/commands/snapshots/rollback.test.ts index d05de5623d..b0df4e992a 100644 --- a/__tests__/unit/core/commands/snapshots/rollback.test.ts +++ b/__tests__/unit/core/commands/snapshots/rollback.test.ts @@ -18,7 +18,7 @@ jest.mock("@arkecosystem/core-kernel", () => ({ }, })); -describe("RollbackCommand", () => { +describe.skip("RollbackCommand", () => { it("should call [rollbackByHeight] if a height is given", async () => { app.isBound = jest.fn().mockReturnValue(true); diff --git a/__tests__/unit/core/commands/snapshots/truncate.test.ts b/__tests__/unit/core/commands/snapshots/truncate.test.ts index a35177f693..609ac1e3d7 100644 --- a/__tests__/unit/core/commands/snapshots/truncate.test.ts +++ b/__tests__/unit/core/commands/snapshots/truncate.test.ts @@ -18,7 +18,7 @@ jest.mock("@arkecosystem/core-kernel", () => ({ }, })); -describe("TruncateCommand", () => { +describe.skip("TruncateCommand", () => { it("should be called if the snapshot service is available", async () => { app.isBound = jest.fn().mockReturnValue(true); diff --git a/__tests__/unit/core/commands/snapshots/verify.test.ts b/__tests__/unit/core/commands/snapshots/verify.test.ts index 08a4334686..4fc25c48eb 100644 --- a/__tests__/unit/core/commands/snapshots/verify.test.ts +++ b/__tests__/unit/core/commands/snapshots/verify.test.ts @@ -23,7 +23,7 @@ jest.mock("@arkecosystem/core-kernel", () => ({ afterAll(() => setGracefulCleanup()); -describe("VerifyCommand", () => { +describe.skip("VerifyCommand", () => { it("should be called if a snapshot is specified via flag", async () => { app.isBound = jest.fn().mockReturnValue(true); diff --git a/packages/core-snapshots/README.md b/packages/core-snapshots/README.md deleted file mode 100644 index c6541164f7..0000000000 --- a/packages/core-snapshots/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# ARK Core - Snapshots - -

- -

- -## Documentation - -You can find installation instructions and detailed instructions on how to use this package at the [dedicated documentation site](https://docs.ark.io/tutorials/node/snapshots.html). - -## Security - -If you discover a security vulnerability within this package, please send an e-mail to security@ark.io. All security vulnerabilities will be promptly addressed. - -## Credits - -This project exists thanks to all the people who [contribute](../../../../contributors). - -## License - -[MIT](LICENSE) © [ARK Ecosystem](https://ark.io) diff --git a/packages/core-snapshots/package.json b/packages/core-snapshots/package.json deleted file mode 100644 index 09539920da..0000000000 --- a/packages/core-snapshots/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "@arkecosystem/core-snapshots", - "version": "3.0.0-next.0", - "description": "Provides live local streamed snapshots functionality for ARK Core", - "license": "MIT", - "contributors": [ - "Kristjan Košič " - ], - "files": [ - "dist" - ], - "main": "dist/index", - "types": "dist/index", - "scripts": { - "build": "yarn clean && yarn copy && yarn compile", - "build:watch": "yarn clean && yarn copy && yarn compile -w", - "build:docs": "../../node_modules/typedoc/bin/typedoc --out docs src", - "clean": "del dist", - "compile": "../../node_modules/typescript/bin/tsc", - "copy": "cd src/ && cpy './**/*.sql' --parents ../dist/ && cd ../", - "prepublishOnly": "yarn build" - }, - "dependencies": { - "@arkecosystem/core-kernel": "^3.0.0-next.0", - "@arkecosystem/core-database": "^3.0.0-next.0", - "@arkecosystem/crypto": "^3.0.0-next.0", - "JSONStream": "^1.3.5", - "fs-extra": "^8.1.0", - "msgpack-lite": "^0.1.26", - "pg-promise": "^8.7.4", - "pg-query-stream": "^2.0.0", - "xcase": "^2.0.1" - }, - "devDependencies": { - "@types/fs-extra": "^8.0.0", - "@types/msgpack-lite": "^0.1.6", - "@types/pg-query-stream": "^1.0.2", - "cpy-cli": "^2.0.0" - }, - "engines": { - "node": ">=10.x" - }, - "publishConfig": { - "access": "public" - } -} diff --git a/packages/core-snapshots/src/db/index.ts b/packages/core-snapshots/src/db/index.ts deleted file mode 100644 index b148475bde..0000000000 --- a/packages/core-snapshots/src/db/index.ts +++ /dev/null @@ -1,203 +0,0 @@ -// @ts-ignore -import { PostgresConnection } from "@arkecosystem/core-database"; -import { Container, Contracts, Utils } from "@arkecosystem/core-kernel"; - -import { queries } from "./queries"; -import { rawQuery } from "./utils"; - -@Container.injectable() -export class Database { - @Container.inject(Container.Identifiers.Application) - private readonly app!: Contracts.Kernel.Application; - - public db: any; - public pgp: any; - public blocksColumnSet: any; - public transactionsColumnSet: any; - public roundsColumnSet: any; - - public async make(connection: PostgresConnection) { - this.db = connection.db; - this.pgp = (connection as any).pgp; - this.createColumnSets(); - - return this; - } - - public close() { - if (!this.app.isBound(Container.Identifiers.BlockchainService)) { - this.db.$pool.end(); - this.pgp.end(); - } - } - - public async getLastBlock() { - return this.db.oneOrNone(queries.blocks.latest); - } - - /** - * Get the highest row from the rounds table. - * @return Object latest row - * @return null if the table is empty. - */ - public async getLastRound(): Promise<{ public_key: string; balance: string; round: string } | null> { - return this.db.oneOrNone(queries.rounds.latest); - } - - public async getBlockByHeight(height) { - return this.db.oneOrNone(queries.blocks.findByHeight, { height }); - } - - public async truncate() { - try { - const tables = "rounds, transactions, blocks"; - - this.app.log.info(`Truncating tables: ${tables}`); - - await this.db.none(queries.truncate(tables)); - } catch (error) { - this.app.terminate(error.message); - } - } - - public async rollbackChain(roundInfo: Contracts.Shared.RoundInfo) { - const { round, roundHeight } = roundInfo; - const lastRemainingBlock = await this.getBlockByHeight(roundHeight); - - try { - if (lastRemainingBlock) { - await Promise.all([ - this.db.none(queries.transactions.deleteFromTimestamp, { - timestamp: lastRemainingBlock.timestamp, - }), - this.db.none(queries.blocks.deleteFromHeight, { - height: lastRemainingBlock.height, - }), - this.db.none(queries.rounds.deleteFromRound, { round }), - ]); - } - } catch (error) { - this.app.log.error(error); - } - - return this.getLastBlock(); - } - - public async getExportQueries(meta: { - startHeight: number; - endHeight: number; - skipCompression: boolean; - folder: string; - }) { - const startBlock = await this.getBlockByHeight(meta.startHeight); - const endBlock = await this.getBlockByHeight(meta.endHeight); - - if (!startBlock || !endBlock) { - this.app.terminate( - "Wrong input height parameters for building export queries. Blocks at height not found in db.", - ); - } - - let startRound: number; - - if (meta.startHeight <= 1) { - startRound = 1; - } else { - const roundInfoPrev: Contracts.Shared.RoundInfo = Utils.roundCalculator.calculateRound( - meta.startHeight - 1, - ); - const roundInfoStart: Contracts.Shared.RoundInfo = Utils.roundCalculator.calculateRound(meta.startHeight); - - if (roundInfoPrev.round === roundInfoStart.round) { - // The lower snapshot contains this round, so skip it from this snapshot. - // For example: a snapshot of blocks 1-80 contains full rounds 1 and 2, so - // when we create a snapshot 81-... we must skip round 2 and start from 3. - startRound = roundInfoStart.round + 1; - } else { - startRound = roundInfoStart.round; - } - } - - const roundInfoEnd: Contracts.Shared.RoundInfo = Utils.roundCalculator.calculateRound(meta.endHeight); - - return { - blocks: rawQuery(this.pgp, queries.blocks.heightRange, { - start: startBlock.height, - end: endBlock.height, - }), - transactions: rawQuery(this.pgp, queries.transactions.timestampRange, { - start: startBlock.timestamp, - end: endBlock.timestamp, - }), - rounds: rawQuery(this.pgp, queries.rounds.roundRange, { - startRound, - endRound: roundInfoEnd.round, - }), - }; - } - - public getTransactionsBackupQuery(startTimestamp) { - return rawQuery(this.pgp, queries.transactions.timestampHigher, { - start: startTimestamp, - }); - } - - public getColumnSet(tableName) { - switch (tableName) { - case "blocks": - return this.blocksColumnSet; - case "transactions": - return this.transactionsColumnSet; - case "rounds": - return this.roundsColumnSet; - default: - throw new Error("Invalid table name"); - } - } - - private createColumnSets() { - this.blocksColumnSet = new this.pgp.helpers.ColumnSet( - [ - "id", - "version", - "timestamp", - "previous_block", - "height", - "number_of_transactions", - "total_amount", - "total_fee", - "reward", - "payload_length", - "payload_hash", - "generator_public_key", - "block_signature", - ], - { - table: "blocks", - }, - ); - - this.transactionsColumnSet = new this.pgp.helpers.ColumnSet( - [ - "id", - "version", - "nonce", - "block_id", - "sequence", - "timestamp", - "sender_public_key", - "recipient_id", - "type", - "type_group", - "vendor_field", - "amount", - "fee", - "serialized", - "asset", - ], - { table: "transactions" }, - ); - - this.roundsColumnSet = new this.pgp.helpers.ColumnSet(["round", "balance", "public_key"], { table: "rounds" }); - } -} diff --git a/packages/core-snapshots/src/db/queries/blocks/delete-from-height.sql b/packages/core-snapshots/src/db/queries/blocks/delete-from-height.sql deleted file mode 100644 index cab9ba9c19..0000000000 --- a/packages/core-snapshots/src/db/queries/blocks/delete-from-height.sql +++ /dev/null @@ -1,2 +0,0 @@ -DELETE FROM blocks -WHERE height > ${height} diff --git a/packages/core-snapshots/src/db/queries/blocks/find-by-height.sql b/packages/core-snapshots/src/db/queries/blocks/find-by-height.sql deleted file mode 100644 index 25ad1738ce..0000000000 --- a/packages/core-snapshots/src/db/queries/blocks/find-by-height.sql +++ /dev/null @@ -1,3 +0,0 @@ -SELECT * -FROM blocks -WHERE height = ${height} diff --git a/packages/core-snapshots/src/db/queries/blocks/height-range.sql b/packages/core-snapshots/src/db/queries/blocks/height-range.sql deleted file mode 100644 index 16eaa7cb2a..0000000000 --- a/packages/core-snapshots/src/db/queries/blocks/height-range.sql +++ /dev/null @@ -1,20 +0,0 @@ -SELECT - id, - version, - timestamp, - previous_block, - height, - number_of_transactions, - total_amount, - total_fee, - reward, - payload_length, - payload_hash, - generator_public_key, - block_signature -FROM - blocks -WHERE - height BETWEEN ${start} AND ${end} -ORDER BY - height diff --git a/packages/core-snapshots/src/db/queries/blocks/latest.sql b/packages/core-snapshots/src/db/queries/blocks/latest.sql deleted file mode 100644 index daa603cba0..0000000000 --- a/packages/core-snapshots/src/db/queries/blocks/latest.sql +++ /dev/null @@ -1,3 +0,0 @@ -SELECT * -FROM blocks -ORDER BY height DESC LIMIT 1 diff --git a/packages/core-snapshots/src/db/queries/index.ts b/packages/core-snapshots/src/db/queries/index.ts deleted file mode 100644 index 61a835183d..0000000000 --- a/packages/core-snapshots/src/db/queries/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { loadQueryFile } from "../utils"; - -export const queries = { - blocks: { - heightRange: loadQueryFile(__dirname, "./blocks/height-range.sql"), - latest: loadQueryFile(__dirname, "./blocks/latest.sql"), - findByHeight: loadQueryFile(__dirname, "./blocks/find-by-height.sql"), - deleteFromHeight: loadQueryFile(__dirname, "./blocks/delete-from-height.sql"), - }, - transactions: { - timestampRange: loadQueryFile(__dirname, "./transactions/timestamp-range.sql"), - timestampHigher: loadQueryFile(__dirname, "./transactions/timestamp-higher.sql"), - deleteFromTimestamp: loadQueryFile(__dirname, "./transactions/delete-from-timestamp.sql"), - }, - rounds: { - deleteFromRound: loadQueryFile(__dirname, "./rounds/delete-from-round.sql"), - latest: loadQueryFile(__dirname, "./rounds/latest.sql"), - roundRange: loadQueryFile(__dirname, "./rounds/round-range.sql"), - }, - truncate: tables => `TRUNCATE TABLE ${tables} RESTART IDENTITY`, -}; diff --git a/packages/core-snapshots/src/db/queries/rounds/delete-from-round.sql b/packages/core-snapshots/src/db/queries/rounds/delete-from-round.sql deleted file mode 100644 index d0037a8835..0000000000 --- a/packages/core-snapshots/src/db/queries/rounds/delete-from-round.sql +++ /dev/null @@ -1,2 +0,0 @@ -DELETE FROM rounds -WHERE round > ${round} diff --git a/packages/core-snapshots/src/db/queries/rounds/latest.sql b/packages/core-snapshots/src/db/queries/rounds/latest.sql deleted file mode 100644 index e000adad98..0000000000 --- a/packages/core-snapshots/src/db/queries/rounds/latest.sql +++ /dev/null @@ -1,4 +0,0 @@ -SELECT * -FROM rounds -ORDER BY round DESC, balance, public_key DESC -LIMIT 1 diff --git a/packages/core-snapshots/src/db/queries/rounds/round-range.sql b/packages/core-snapshots/src/db/queries/rounds/round-range.sql deleted file mode 100644 index f3d61568e9..0000000000 --- a/packages/core-snapshots/src/db/queries/rounds/round-range.sql +++ /dev/null @@ -1,10 +0,0 @@ -SELECT - round, - balance, - public_key -FROM - rounds -WHERE - round BETWEEN ${startRound} AND ${endRound} -ORDER BY - round, balance DESC, public_key diff --git a/packages/core-snapshots/src/db/queries/transactions/delete-from-timestamp.sql b/packages/core-snapshots/src/db/queries/transactions/delete-from-timestamp.sql deleted file mode 100644 index 012bc3cd45..0000000000 --- a/packages/core-snapshots/src/db/queries/transactions/delete-from-timestamp.sql +++ /dev/null @@ -1,2 +0,0 @@ -DELETE FROM transactions -WHERE timestamp > ${timestamp} diff --git a/packages/core-snapshots/src/db/queries/transactions/timestamp-higher.sql b/packages/core-snapshots/src/db/queries/transactions/timestamp-higher.sql deleted file mode 100644 index 19bea3f8dc..0000000000 --- a/packages/core-snapshots/src/db/queries/transactions/timestamp-higher.sql +++ /dev/null @@ -1,3 +0,0 @@ -SELECT id, sequence, serialized FROM transactions -WHERE timestamp > ${start} -ORDER BY timestamp, sequence diff --git a/packages/core-snapshots/src/db/queries/transactions/timestamp-range.sql b/packages/core-snapshots/src/db/queries/transactions/timestamp-range.sql deleted file mode 100644 index d87c0d2080..0000000000 --- a/packages/core-snapshots/src/db/queries/transactions/timestamp-range.sql +++ /dev/null @@ -1,23 +0,0 @@ -SELECT - id, - version, - nonce, - block_id, - sequence, - timestamp, - sender_public_key, - recipient_id, - type, - type_group, - vendor_field, - amount, - fee, - serialized, - asset -FROM - transactions -WHERE - timestamp BETWEEN ${start} AND ${end} -ORDER BY - timestamp, - sequence diff --git a/packages/core-snapshots/src/db/utils/index.ts b/packages/core-snapshots/src/db/utils/index.ts deleted file mode 100644 index 0acfa3efcb..0000000000 --- a/packages/core-snapshots/src/db/utils/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import path from "path"; -import { QueryFile } from "pg-promise"; - -export const loadQueryFile = (directory, file) => { - const fullPath = path.join(directory, file); - - const options = { - minify: true, - params: { - schema: "public", - }, - }; - - const query = new QueryFile(fullPath, options); - - if (query.error) { - // app.log.error(query.error.toString()); - } - - return query; -}; - -export const rawQuery = (pgp, queryFile, parameters) => pgp.as.format(queryFile, parameters); diff --git a/packages/core-snapshots/src/defaults.ts b/packages/core-snapshots/src/defaults.ts deleted file mode 100644 index 97f77d846e..0000000000 --- a/packages/core-snapshots/src/defaults.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const defaults = { - chunkSize: 50000, -}; diff --git a/packages/core-snapshots/src/index.ts b/packages/core-snapshots/src/index.ts deleted file mode 100644 index 53898c97b9..0000000000 --- a/packages/core-snapshots/src/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./defaults"; -export * from "./manager"; -export * from "./service-provider"; diff --git a/packages/core-snapshots/src/manager.ts b/packages/core-snapshots/src/manager.ts deleted file mode 100644 index a8a9745702..0000000000 --- a/packages/core-snapshots/src/manager.ts +++ /dev/null @@ -1,180 +0,0 @@ -// @ts-ignore -import { PostgresConnection } from "@arkecosystem/core-database"; -import { Container, Contracts, Utils } from "@arkecosystem/core-kernel"; - -import { Database } from "./db"; -import { backupTransactionsToJSON, exportTable, importTable, verifyTable } from "./transport"; -import * as utils from "./utils"; - -@Container.injectable() -export class SnapshotManager { - @Container.inject(Container.Identifiers.Application) - private readonly app!: Contracts.Kernel.Application; - - public database!: Database; - - private options; - - public setup(options) { - this.options = options; - - return this; - } - - public async make(connection: PostgresConnection) { - this.database = await this.app.resolve(Database).make(connection); - - return this; - } - - public async dump(options) { - const params = await this.init(options, true); - - if (params.skipExportWhenNoChange) { - this.app.log.info(`Skipping export of snapshot, because ${params.meta.folder} is already up to date.`); - return; - } - - const metaInfo = { - blocks: await exportTable(this.app, "blocks", params), - transactions: await exportTable(this.app, "transactions", params), - rounds: await exportTable(this.app, "rounds", params), - folder: params.meta.folder, - skipCompression: params.meta.skipCompression, - }; - - this.database.close(); - - utils.writeMetaFile(metaInfo); - } - - public async import(options) { - const params = await this.init(options); - - if (params.truncate) { - await this.database.truncate(); - params.lastBlock = undefined; - } - - await importTable(this.app, "blocks", params); - await importTable(this.app, "transactions", params); - await importTable(this.app, "rounds", params); - - const lastBlock = await this.database.getLastBlock(); - const height = lastBlock.height as number; - - this.app.log.info( - `Import from folder ${params.meta.folder} completed. Last block in database: ${height.toLocaleString()}`, - ); - - if (!params.skipRestartRound) { - const roundInfo = Utils.roundCalculator.calculateRound(height); - const newLastBlock = await this.database.rollbackChain(roundInfo); - this.app.log.info( - `Rolling back chain to last finished round with last block height ${newLastBlock.height.toLocaleString()}`, - ); - } - - this.database.close(); - } - - public async verify(options) { - const params = await this.init(options); - - await Promise.all([verifyTable(this.app, "blocks", params), verifyTable(this.app, "transactions", params)]); - } - - public async truncate() { - await this.database.truncate(); - - this.database.close(); - } - - public async rollbackByHeight(height: number) { - if (!height || height <= 0) { - this.app.terminate(`Rollback height ${height.toLocaleString()} is invalid.`); - } - - const currentHeight = (await this.database.getLastBlock()).height; - const roundInfo = Utils.roundCalculator.calculateRound(height); - const { round } = roundInfo; - - if (height >= currentHeight) { - this.app.terminate( - `Rollback height ${height.toLocaleString()} is greater than the current height ${currentHeight.toLocaleString()}.`, - ); - } - - const rollbackBlock = await this.database.getBlockByHeight(height); - const queryTransactionBackup = await this.database.getTransactionsBackupQuery(rollbackBlock.timestamp); - - await backupTransactionsToJSON( - this.app, - `rollbackTransactionBackup.${+height + 1}.${currentHeight}.json`, - queryTransactionBackup, - this.database, - ); - - const newLastBlock = await this.database.rollbackChain(roundInfo); - this.app.log.info( - `Rolling back chain to last finished round ${round.toLocaleString()} with last block height ${newLastBlock.height.toLocaleString()}`, - ); - - this.database.close(); - } - - public async rollbackByNumber(amount: number) { - const { height } = await this.database.getLastBlock(); - - return this.rollbackByHeight(height - amount); - } - - private async init(options, exportAction = false) { - const params: any = Utils.pick(options, [ - "truncate", - "blocks", - "verifySignatures", - "skipRestartRound", - "start", - "end", - "skipCompression", - ]); - - const lastBlock = await this.database.getLastBlock(); - params.lastBlock = lastBlock; - params.lastRound = await this.database.getLastRound(); - params.chunkSize = this.options.chunkSize || 50000; - - if (exportAction) { - if (!lastBlock) { - this.app.terminate("Database is empty. Export not possible."); - } - - params.meta = utils.setSnapshotInfo(this.app, params, lastBlock); - params.queries = await this.database.getExportQueries(params.meta); - - if (params.blocks) { - if (options.blocks === params.meta.folder) { - params.skipExportWhenNoChange = true; - return params; - } - - const sourceSnapshotParams = utils.readMetaJSON(this.app, params.blocks); - params.meta.skipCompression = sourceSnapshotParams.skipCompression; - params.meta.startHeight = sourceSnapshotParams.blocks.startHeight; - utils.copySnapshot(this.app, options.blocks, params.meta.folder); - } - } else { - params.meta = utils.getSnapshotInfo(this.app, options.blocks); - } - - if (options.trace) { - this.app.log.info(params.meta); - this.app.log.info(params.queries); - } - - params.database = this.database; - - return params; - } -} diff --git a/packages/core-snapshots/src/service-provider.ts b/packages/core-snapshots/src/service-provider.ts deleted file mode 100644 index 67496731e9..0000000000 --- a/packages/core-snapshots/src/service-provider.ts +++ /dev/null @@ -1,14 +0,0 @@ -//import { DatabaseService } from "@arkecosystem/core-database"; -import { Providers } from "@arkecosystem/core-kernel"; - -//import { SnapshotManager } from "./manager"; - -export class ServiceProvider extends Providers.ServiceProvider { - public async register(): Promise { - // const manager = this.app.resolve(SnapshotManager).setup(this.config().all()); - //const databaseService = this.app.get(Container.Identifiers.DatabaseService); - // Why is a builder pattern with a manager used? - // @ts-ignore - //this.app.bind("snapshots").toConstantValue(manager.make(databaseService.connection as PostgresConnection)); - } -} diff --git a/packages/core-snapshots/src/transport/codec.ts b/packages/core-snapshots/src/transport/codec.ts deleted file mode 100644 index a1bf347c5b..0000000000 --- a/packages/core-snapshots/src/transport/codec.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { Blocks, Transactions, Utils } from "@arkecosystem/crypto"; -import { createCodec, decode, encode } from "msgpack-lite"; -import { camelizeKeys, decamelizeKeys } from "xcase"; - -const encodeBlock = block => { - const blockCamelized = camelizeKeys(block); - blockCamelized.totalAmount = Utils.BigNumber.make(block.total_amount || block.totalAmount); - blockCamelized.totalFee = Utils.BigNumber.make(block.total_fee || block.totalFee); - blockCamelized.reward = Utils.BigNumber.make(block.reward); - - return Blocks.Block.serialize(blockCamelized, true); -}; - -const decodeBlock = (buffer: Buffer | Uint8Array) => { - const block = Blocks.Block.deserialize(buffer.toString("hex"), true); - // @ts-ignore - @todo: remove ts-ignore - block.totalAmount = block.totalAmount.toFixed(); - // @ts-ignore - @todo: remove ts-ignore - block.totalFee = block.totalFee.toFixed(); - // @ts-ignore - @todo: remove ts-ignore - block.reward = block.reward.toFixed(); - - return decamelizeKeys(block); -}; - -const encodeTransaction = transaction => { - transaction.blockId = transaction.block_id || transaction.blockId; - - return encode([ - transaction.id, - transaction.blockId, - transaction.sequence, - transaction.timestamp, - transaction.serialized, - ]); -}; - -const decodeTransaction = (buffer: Buffer | Uint8Array) => { - const [id, blockId, sequence, timestamp, serialized] = decode(buffer); - - const transaction: any = Transactions.TransactionFactory.fromBytesUnsafe(serialized, id).data; - const { asset } = transaction; - transaction.asset = undefined; - - transaction.block_id = blockId; - transaction.sequence = sequence; - if (transaction.version === 1) { - transaction.nonce = "0"; // Will be set correctly at database level by an INSERT trigger - } else { - transaction.nonce = transaction.nonce.toFixed(); - } - transaction.timestamp = timestamp; - transaction.amount = transaction.amount.toFixed(); - transaction.fee = transaction.fee.toFixed(); - transaction.vendorField = transaction.vendorField ? transaction.vendorField : undefined; - transaction.recipientId = transaction.recipientId ? transaction.recipientId : undefined; - transaction.serialized = serialized; - - const decamelized = decamelizeKeys(transaction); - decamelized.serialized = serialized; // FIXME: decamelizeKeys mutilates Buffers - decamelized.asset = asset ? asset : undefined; - - return decamelized; -}; - -const encodeRound = round => { - return encode([round.public_key || round.publicKey, round.balance, round.round]); -}; - -const decodeRound = (buffer: Buffer | Uint8Array) => { - const [publicKey, balance, round] = decode(buffer); - - return decamelizeKeys({ - publicKey, - balance, - round, - }); -}; - -export class Codec { - static get blocks() { - const codec = createCodec(); - codec.addExtPacker(0x3f, Object, encodeBlock); - codec.addExtUnpacker(0x3f, decodeBlock); - - return codec; - } - - static get transactions() { - const codec = createCodec(); - codec.addExtPacker(0x4f, Object, encodeTransaction); - codec.addExtUnpacker(0x4f, decodeTransaction); - - return codec; - } - - static get rounds() { - const codec = createCodec(); - codec.addExtPacker(0x5f, Object, encodeRound); - codec.addExtUnpacker(0x5f, decodeRound); - - return codec; - } -} diff --git a/packages/core-snapshots/src/transport/index.ts b/packages/core-snapshots/src/transport/index.ts deleted file mode 100644 index 27b274fd94..0000000000 --- a/packages/core-snapshots/src/transport/index.ts +++ /dev/null @@ -1,170 +0,0 @@ -import { Container, Contracts, Utils } from "@arkecosystem/core-kernel"; -import { Managers } from "@arkecosystem/crypto"; -import fs from "fs-extra"; -import msgpack from "msgpack-lite"; -import QueryStream from "pg-query-stream"; -import zlib from "zlib"; - -import JSONStream from "JSONStream"; - -import * as utils from "../utils"; -import { Codec } from "./codec"; -import { canImportRecord, verifyData } from "./verification"; - -const fixData = (table, data) => { - if (table === "blocks" && data.height === 1) { - data.id = Managers.configManager.get("genesisBlock").id; - } - - // For version=1 transactions the nonce is set automatically at database level (by a trigger - // on the transactions table). However, the database library we use is upset if we don't - // provide it, so supply a dummy value here. - if (table === "transactions" && data.version === 1) { - data.nonce = "0"; - } -}; - -export const exportTable = async (app: Contracts.Kernel.Application, table, options) => { - const snapFileName = utils.getFilePath(table, options.meta.folder); - const gzip = zlib.createGzip(); - await fs.ensureFile(snapFileName); - - app.log.info( - `Starting to export table ${table} to folder ${ - options.meta.folder - }, append:${!!options.blocks}, skipCompression: ${options.meta.skipCompression}`, - ); - try { - const snapshotWriteStream = fs.createWriteStream(snapFileName, options.blocks ? { flags: "a" } : {}); - const encodeStream = msgpack.createEncodeStream({ codec: Codec[table] }); - const qs = new QueryStream(options.queries[table]); - - const data = await options.database.db.stream(qs, s => { - if (options.meta.skipCompression) { - return s.pipe(encodeStream).pipe(snapshotWriteStream); - } - - return s - .pipe(encodeStream) - .pipe(gzip) - .pipe(snapshotWriteStream); - }); - app.log.info( - `Snapshot: ${table} done. ==> Total rows processed: ${data.processed}, duration: ${data.duration} ms`, - ); - - return { - count: utils.calcRecordCount(app, table, data.processed, options.blocks), - startHeight: utils.calcStartHeight(app, table, options.meta.startHeight, options.blocks), - endHeight: options.meta.endHeight, - }; - } catch (error) { - app.terminate("Error while exporting data via query stream", error); - return undefined; - } -}; - -export const importTable = async (app: Contracts.Kernel.Application, table, options) => { - const emitter = app.get(Container.Identifiers.EventDispatcherService); - - const sourceFile = utils.getFilePath(table, options.meta.folder); - const gunzip = zlib.createGunzip(); - const decodeStream = msgpack.createDecodeStream({ codec: Codec[table] }); - app.log.info( - `Starting to import table ${table} from ${sourceFile}, skipCompression: ${options.meta.skipCompression}`, - ); - - const readStream = options.meta.skipCompression - ? fs.createReadStream(sourceFile).pipe(decodeStream) - : fs - .createReadStream(sourceFile) - .pipe(gunzip) - .pipe(decodeStream); - - let values: any[] = []; - let prevData; - let counter = 0; - const saveData = async data => { - if (data && data.length > 0) { - const insert = options.database.pgp.helpers.insert(data, options.database.getColumnSet(table)); - emitter.dispatch("progress", { value: counter, table }); - values = []; - return options.database.db.none(insert); - } - }; - - emitter.dispatch("start", { count: options.meta[table].count }); - - for await (const record of readStream) { - counter++; - - fixData(table, record); - - if (!verifyData(app, table, record, prevData, options.verifySignatures)) { - app.terminate(`Error verifying data. Payload ${JSON.stringify(record, undefined, 2)}`); - } - - if (canImportRecord(table, record, options)) { - values.push(record); - } - - if (values.length % options.chunkSize === 0) { - await saveData(values); - } - prevData = record; - } - - if (values.length > 0) { - await saveData(values); - } - - emitter.dispatch("complete"); -}; - -export const verifyTable = async (app: Contracts.Kernel.Application, table, options) => { - const sourceFile = utils.getFilePath(table, options.meta.folder); - const gunzip = zlib.createGunzip(); - const decodeStream = msgpack.createDecodeStream({ codec: Codec[table] }); - const readStream = options.meta.skipCompression - ? fs.createReadStream(sourceFile).pipe(decodeStream) - : fs - .createReadStream(sourceFile) - .pipe(gunzip) - .pipe(decodeStream); - - app.log.info(`Starting to verify snapshot file ${sourceFile}`); - let prevData; - - decodeStream.on("data", data => { - fixData(table, data); - if (!verifyData(app, table, data, prevData, options.verifySignatures)) { - app.terminate(`Error verifying data. Payload ${JSON.stringify(data, undefined, 2)}`); - } - prevData = data; - }); - - readStream.on("finish", () => { - app.log.info(`Snapshot file ${sourceFile} successfully verified`); - }); -}; - -export const backupTransactionsToJSON = async (app: Contracts.Kernel.Application, snapFileName, query, database) => { - const transactionBackupPath = utils.getFilePath(snapFileName, "rollbackTransactions"); - await fs.ensureFile(transactionBackupPath); - const snapshotWriteStream = fs.createWriteStream(transactionBackupPath); - const qs = new QueryStream(query); - - try { - const data = await database.db.stream(qs, s => s.pipe(JSONStream.stringify()).pipe(snapshotWriteStream)); - app.log.info( - `${Utils.pluralize( - "transaction", - data.processed, - true, - )} from rollbacked blocks safely exported to file ${snapFileName}`, - ); - return data; - } catch (error) { - app.terminate("Error while exporting data via query stream", error); - } -}; diff --git a/packages/core-snapshots/src/transport/verification.ts b/packages/core-snapshots/src/transport/verification.ts deleted file mode 100644 index d81a7c57bf..0000000000 --- a/packages/core-snapshots/src/transport/verification.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { Contracts } from "@arkecosystem/core-kernel"; -import { Blocks, Crypto, Transactions, Utils } from "@arkecosystem/crypto"; -import { camelizeKeys } from "xcase"; - -export const verifyData = (app: Contracts.Kernel.Application, context, data, prevData, verifySignatures) => { - if (context === "blocks") { - const isBlockChained = () => { - if (!prevData) { - return true; - } - - return data.height - prevData.height === 1 && data.previous_block === prevData.id; - }; - - if (!isBlockChained()) { - app.log.error( - `Blocks are not chained. Current block: ${JSON.stringify(data)}, previous block: ${JSON.stringify( - prevData, - )}`, - ); - return false; - } - - // TODO: manually calculate block ID and compare to existing - if (verifySignatures) { - const bytes = Blocks.Block.serialize(camelizeKeys(data), false); - const hash = Crypto.HashAlgorithms.sha256(bytes); - - const signatureVerify = Crypto.Hash.verifyECDSA(hash, data.block_signature, data.generator_public_key); - - if (!signatureVerify) { - app.log.error(`Failed to verify signature: ${JSON.stringify(data)}`); - } - - return signatureVerify; - } - - return true; - } - - if (context === "transactions") { - if (!verifySignatures) { - return true; - } - - return Transactions.TransactionFactory.fromBytes(data.serialized).verified; - } - - if (context === "rounds") { - return true; - } - - return false; -}; - -export const canImportRecord = (context, data, options) => { - if (!options.lastBlock) { - return true; - } - - if (context === "blocks") { - return data.height > options.lastBlock.height; - } - - if (context === "transactions") { - return data.timestamp > options.lastBlock.timestamp; - } - - if (context === "rounds") { - if (options.lastRound === null) { - return true; - } - - const dataRound = Number(data.round); - const lastRound = Number(options.lastRound.round); - if (dataRound > lastRound) { - return true; - } - if (dataRound < lastRound) { - return false; - } - - const dataBalance = Utils.BigNumber.make(data.balance); - const lastBalance = Utils.BigNumber.make(options.lastRound.balance); - if (dataBalance.isLessThan(lastBalance)) { - return true; - } - if (dataBalance.isGreaterThan(lastBalance)) { - return false; - } - - if (data.public_key > options.lastRound.publicKey) { - return true; - } - - return false; - } - - return false; -}; diff --git a/packages/core-snapshots/src/utils.ts b/packages/core-snapshots/src/utils.ts deleted file mode 100644 index f886f8f849..0000000000 --- a/packages/core-snapshots/src/utils.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { Contracts } from "@arkecosystem/core-kernel"; -import { copyFileSync, ensureFileSync, existsSync, readJSONSync, writeFileSync } from "fs-extra"; - -export const writeMetaFile = snapshotInfo => - writeFileSync( - `${process.env.CORE_PATH_DATA}/snapshots/${snapshotInfo.folder}/meta.json`, - JSON.stringify(snapshotInfo), - "utf8", - ); - -export const getFilePath = (filename, folder) => `${process.env.CORE_PATH_DATA}/snapshots/${folder}/${filename}`; - -export const copySnapshot = (app: Contracts.Kernel.Application, sourceFolder, destFolder) => { - app.log.info(`Copying snapshot ${sourceFolder} to ${destFolder} for appending of data`); - - const paths = { - source: { - blocks: getFilePath("blocks", sourceFolder), - transactions: getFilePath("transactions", sourceFolder), - rounds: getFilePath("rounds", sourceFolder), - }, - dest: { - blocks: getFilePath("blocks", destFolder), - transactions: getFilePath("transactions", destFolder), - rounds: getFilePath("rounds", destFolder), - }, - }; - - ensureFileSync(paths.dest.blocks); - ensureFileSync(paths.dest.transactions); - ensureFileSync(paths.dest.rounds); - - if ( - !existsSync(paths.source.blocks) || - !existsSync(paths.source.transactions) || - !existsSync(paths.source.rounds) - ) { - app.terminate(`Unable to copy snapshot from ${sourceFolder} as it doesn't exist`); - } - - copyFileSync(paths.source.blocks, paths.dest.blocks); - copyFileSync(paths.source.transactions, paths.dest.transactions); - copyFileSync(paths.source.rounds, paths.dest.rounds); -}; - -export const readMetaJSON = (app: Contracts.Kernel.Application, folder) => { - const metaFileInfo = getFilePath("meta.json", folder); - - if (!existsSync(metaFileInfo)) { - app.terminate("Meta file meta.json not found. Exiting"); - } - - return readJSONSync(metaFileInfo); -}; - -export const calcRecordCount = (app: Contracts.Kernel.Application, table, currentCount, sourceFolder) => { - if (sourceFolder) { - const snapshotInfo = readMetaJSON(app, sourceFolder); - return +snapshotInfo[table].count + currentCount; - } - - return currentCount; -}; - -export const calcStartHeight = (app: Contracts.Kernel.Application, table, currentHeight, sourceFolder) => { - if (sourceFolder) { - const snapshotInfo = readMetaJSON(app, sourceFolder); - return +snapshotInfo[table].startHeight; - } - - return currentHeight; -}; - -export const getSnapshotInfo = (app: Contracts.Kernel.Application, folder) => { - const snapshotInfo = readMetaJSON(app, folder); - return { - startHeight: +snapshotInfo.blocks.startHeight, - endHeight: +snapshotInfo.blocks.endHeight, - folder: snapshotInfo.folder, - blocks: snapshotInfo.blocks, - transactions: snapshotInfo.transactions, - rounds: snapshotInfo.rounds, - skipCompression: snapshotInfo.skipCompression, - }; -}; - -export const setSnapshotInfo = (app: Contracts.Kernel.Application, options, lastBlock) => { - const meta = { - startHeight: options.start !== -1 ? options.start : 1, - endHeight: options.end !== -1 ? options.end : lastBlock.height, - skipCompression: options.skipCompression || false, - folder: "", - }; - - meta.folder = `${meta.startHeight}-${meta.endHeight}`; - - if (options.blocks) { - const oldMeta = getSnapshotInfo(app, options.blocks); - meta.startHeight = oldMeta.endHeight + 1; - meta.folder = `${oldMeta.startHeight}-${meta.endHeight}`; - } - - return meta; -}; diff --git a/packages/core-snapshots/tsconfig.json b/packages/core-snapshots/tsconfig.json deleted file mode 100644 index 0b089c5fa8..0000000000 --- a/packages/core-snapshots/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "dist" - }, - "include": ["src/**/**.ts"] -} diff --git a/packages/core/bin/config/devnet/plugins.js b/packages/core/bin/config/devnet/plugins.js index 167c84b197..3c75300e72 100644 --- a/packages/core/bin/config/devnet/plugins.js +++ b/packages/core/bin/config/devnet/plugins.js @@ -58,5 +58,4 @@ module.exports = { }, }, "@arkecosystem/core-forger": {}, - "@arkecosystem/core-snapshots": {}, }; diff --git a/packages/core/bin/config/mainnet/plugins.js b/packages/core/bin/config/mainnet/plugins.js index 00eeb8bdcd..66f8b4b5ab 100644 --- a/packages/core/bin/config/mainnet/plugins.js +++ b/packages/core/bin/config/mainnet/plugins.js @@ -56,5 +56,4 @@ module.exports = { }, }, "@arkecosystem/core-forger": {}, - "@arkecosystem/core-snapshots": {}, }; diff --git a/packages/core/bin/config/testnet/app.json b/packages/core/bin/config/testnet/app.json index d5a6153d58..5cbeea5bcc 100644 --- a/packages/core/bin/config/testnet/app.json +++ b/packages/core/bin/config/testnet/app.json @@ -79,18 +79,5 @@ "package": "@arkecosystem/core-forger" } ] - }, - "snapshot": { - "plugins": [ - { - "package": "@arkecosystem/core-logger-pino" - }, - { - "package": "@arkecosystem/core-database" - }, - { - "package": "@arkecosystem/core-snapshots" - } - ] } } diff --git a/packages/core/package.json b/packages/core/package.json index 61131cabf1..c2024dffb8 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -52,7 +52,6 @@ "@arkecosystem/core-kernel": "^3.0.0-next.0", "@arkecosystem/core-logger-pino": "^3.0.0-next.0", "@arkecosystem/core-p2p": "^3.0.0-next.0", - "@arkecosystem/core-snapshots": "^3.0.0-next.0", "@arkecosystem/core-state": "^3.0.0-next.0", "@arkecosystem/core-transaction-pool": "^3.0.0-next.0", "@arkecosystem/core-webhooks": "^3.0.0-next.0", diff --git a/packages/core/src/commands/snapshot/dump.ts b/packages/core/src/commands/snapshot/dump.ts index 8581fa61ef..6846899f23 100644 --- a/packages/core/src/commands/snapshot/dump.ts +++ b/packages/core/src/commands/snapshot/dump.ts @@ -1,11 +1,6 @@ -import { Container, Contracts } from "@arkecosystem/core-kernel"; -import { SnapshotManager } from "@arkecosystem/core-snapshots"; import Command, { flags } from "@oclif/command"; -import { abort } from "../../common/cli"; import { flagsSnapshot } from "../../common/flags"; -import { parseWithNetwork } from "../../common/parser"; -import { setUpLite } from "../../common/snapshot"; import { CommandFlags } from "../../types"; export class DumpCommand extends Command { @@ -27,14 +22,6 @@ export class DumpCommand extends Command { }; public async run(): Promise { - const { flags } = await parseWithNetwork(this.parse(DumpCommand)); - - const app: Contracts.Kernel.Application = await setUpLite(flags); - - if (!app.isBound(Container.Identifiers.SnapshotService)) { - abort("The @arkecosystem/core-snapshots plugin is not installed."); - } - - await app.get(Container.Identifiers.SnapshotService).dump(flags); + // const { flags } = await parseWithNetwork(this.parse(DumpCommand)); } } diff --git a/packages/core/src/commands/snapshot/restore.ts b/packages/core/src/commands/snapshot/restore.ts index 3dc6c191d8..42d4f9dfc6 100644 --- a/packages/core/src/commands/snapshot/restore.ts +++ b/packages/core/src/commands/snapshot/restore.ts @@ -1,12 +1,6 @@ -import { Container, Contracts } from "@arkecosystem/core-kernel"; -import { SnapshotManager } from "@arkecosystem/core-snapshots"; import Command, { flags } from "@oclif/command"; -import cliProgress from "cli-progress"; -import { abort } from "../../common/cli"; import { flagsSnapshot } from "../../common/flags"; -import { parseWithNetwork } from "../../common/parser"; -import { chooseSnapshot, setUpLite } from "../../common/snapshot"; import { CommandFlags } from "../../types"; export class RestoreCommand extends Command { @@ -29,36 +23,6 @@ export class RestoreCommand extends Command { }; public async run(): Promise { - const { flags, paths } = await parseWithNetwork(this.parse(RestoreCommand)); - - const app: Contracts.Kernel.Application = await setUpLite(flags); - - if (!app.isBound(Container.Identifiers.SnapshotService)) { - abort("The @arkecosystem/core-snapshots plugin is not installed."); - } - - if (!flags.blocks) { - flags.blocks = await chooseSnapshot(paths.data, "What snapshot do you want to restore?"); - } - - const emitter = app.get(Container.Identifiers.EventDispatcherService); - - const progressBar = new cliProgress.Bar( - { - format: "{bar} {percentage}% | ETA: {eta}s | {value}/{total} | Duration: {duration}s", - }, - cliProgress.Presets.shades_classic, - ); - - /* istanbul ignore next */ - emitter.listen("start", ({ data }) => progressBar.start(data.count, 1)); - - /* istanbul ignore next */ - emitter.listen("progress", ({ data }) => progressBar.update(data.value)); - - /* istanbul ignore next */ - emitter.listen("complete", () => progressBar.stop()); - - await app.get(Container.Identifiers.SnapshotService).import(flags); + // const { flags, paths } = await parseWithNetwork(this.parse(RestoreCommand)); } } diff --git a/packages/core/src/commands/snapshot/rollback.ts b/packages/core/src/commands/snapshot/rollback.ts index 99d0396811..8d876c8501 100644 --- a/packages/core/src/commands/snapshot/rollback.ts +++ b/packages/core/src/commands/snapshot/rollback.ts @@ -1,11 +1,6 @@ -import { Container, Contracts } from "@arkecosystem/core-kernel"; -import { SnapshotManager } from "@arkecosystem/core-snapshots"; import Command, { flags } from "@oclif/command"; -import { abort } from "../../common/cli"; import { flagsSnapshot } from "../../common/flags"; -import { parseWithNetwork } from "../../common/parser"; -import { setUpLite } from "../../common/snapshot"; import { CommandFlags } from "../../types"; export class RollbackCommand extends Command { @@ -22,20 +17,6 @@ export class RollbackCommand extends Command { }; public async run(): Promise { - const { flags } = await parseWithNetwork(this.parse(RollbackCommand)); - - const app: Contracts.Kernel.Application = await setUpLite(flags); - - if (!app.isBound(Container.Identifiers.SnapshotService)) { - abort("The @arkecosystem/core-snapshots plugin is not installed."); - } - - if (flags.height) { - await app.get(Container.Identifiers.SnapshotService).rollbackByHeight(flags.height); - } else if (flags.number) { - await app.get(Container.Identifiers.SnapshotService).rollbackByNumber(flags.number); - } else { - abort("Please specify either a height or number of blocks to roll back."); - } + // const { flags } = await parseWithNetwork(this.parse(RollbackCommand)); } } diff --git a/packages/core/src/commands/snapshot/truncate.ts b/packages/core/src/commands/snapshot/truncate.ts index 5d23970756..39e3f9f20b 100644 --- a/packages/core/src/commands/snapshot/truncate.ts +++ b/packages/core/src/commands/snapshot/truncate.ts @@ -1,11 +1,6 @@ -import { Container, Contracts } from "@arkecosystem/core-kernel"; -import { SnapshotManager } from "@arkecosystem/core-snapshots"; import Command from "@oclif/command"; -import { abort } from "../../common/cli"; import { flagsSnapshot } from "../../common/flags"; -import { parseWithNetwork } from "../../common/parser"; -import { setUpLite } from "../../common/snapshot"; import { CommandFlags } from "../../types"; export class TruncateCommand extends Command { @@ -16,14 +11,6 @@ export class TruncateCommand extends Command { }; public async run(): Promise { - const { flags } = await parseWithNetwork(this.parse(TruncateCommand)); - - const app: Contracts.Kernel.Application = await setUpLite(flags); - - if (!app.isBound(Container.Identifiers.SnapshotService)) { - abort("The @arkecosystem/core-snapshots plugin is not installed."); - } - - await app.get(Container.Identifiers.SnapshotService).truncate(); + // const { flags } = await parseWithNetwork(this.parse(TruncateCommand)); } } diff --git a/packages/core/src/commands/snapshot/verify.ts b/packages/core/src/commands/snapshot/verify.ts index 3b94cf490e..0b530aacbc 100644 --- a/packages/core/src/commands/snapshot/verify.ts +++ b/packages/core/src/commands/snapshot/verify.ts @@ -1,11 +1,6 @@ -import { Container, Contracts } from "@arkecosystem/core-kernel"; -import { SnapshotManager } from "@arkecosystem/core-snapshots"; import Command, { flags } from "@oclif/command"; -import { abort } from "../../common/cli"; import { flagsSnapshot } from "../../common/flags"; -import { parseWithNetwork } from "../../common/parser"; -import { chooseSnapshot, setUpLite } from "../../common/snapshot"; import { CommandFlags } from "../../types"; export class VerifyCommand extends Command { @@ -22,18 +17,6 @@ export class VerifyCommand extends Command { }; public async run(): Promise { - const { flags, paths } = await parseWithNetwork(this.parse(VerifyCommand)); - - const app: Contracts.Kernel.Application = await setUpLite(flags); - - if (!app.isBound(Container.Identifiers.SnapshotService)) { - abort("The @arkecosystem/core-snapshots plugin is not installed."); - } - - if (!flags.blocks) { - flags.blocks = await chooseSnapshot(paths.data, "What snapshot do you want to verify?"); - } - - await app.get(Container.Identifiers.SnapshotService).verify(flags); + // const { flags, paths } = await parseWithNetwork(this.parse(VerifyCommand)); } } diff --git a/packages/core/src/common/snapshot.ts b/packages/core/src/common/snapshot.ts index b5cd37c4cd..6813fecce4 100644 --- a/packages/core/src/common/snapshot.ts +++ b/packages/core/src/common/snapshot.ts @@ -1,18 +1,7 @@ -import { Contracts } from "@arkecosystem/core-kernel"; import { existsSync, lstatSync, readdirSync } from "fs-extra"; import prompts from "prompts"; import { abort } from "./cli"; -import { createApplication } from "./create-application"; - -// todo: review the implementation -export const setUpLite = async (flags): Promise => - createApplication({ - flags, - plugins: { - include: ["@arkecosystem/core-state", "@arkecosystem/core-database", "@arkecosystem/core-snapshots"], - }, - }); // todo: review the implementation export const chooseSnapshot = async (dataPath: string, message: string) => {