diff --git a/__tests__/unit/core-magistrate/transactions/bridgechain-registration.test.ts b/__tests__/unit/core-magistrate/transactions/bridgechain-registration.test.ts index 900d27eafd..64f2d970a1 100644 --- a/__tests__/unit/core-magistrate/transactions/bridgechain-registration.test.ts +++ b/__tests__/unit/core-magistrate/transactions/bridgechain-registration.test.ts @@ -27,7 +27,7 @@ describe("Bridgechain registration transaction", () => { const serialized = Transactions.TransactionFactory.fromData(bridgechainRegistration).serialized.toString( "hex", ); - const deserialized = Transactions.deserializer.deserialize(serialized); + const deserialized = Transactions.Deserializer.deserialize(serialized); checkCommonFields(deserialized, bridgechainRegistration); @@ -46,7 +46,7 @@ describe("Bridgechain registration transaction", () => { const serialized = Transactions.TransactionFactory.fromData(bridgechainRegistration).serialized.toString( "hex", ); - const deserialized = Transactions.deserializer.deserialize(serialized); + const deserialized = Transactions.Deserializer.deserialize(serialized); checkCommonFields(deserialized, bridgechainRegistration); diff --git a/__tests__/unit/core-magistrate/transactions/bridgechain-resignation.test.ts b/__tests__/unit/core-magistrate/transactions/bridgechain-resignation.test.ts index 4eac794632..14655b9ce0 100644 --- a/__tests__/unit/core-magistrate/transactions/bridgechain-resignation.test.ts +++ b/__tests__/unit/core-magistrate/transactions/bridgechain-resignation.test.ts @@ -26,7 +26,7 @@ describe("Bridgechain registration transaction", () => { const serialized = Transactions.TransactionFactory.fromData(bridgechainResignation).serialized.toString( "hex", ); - const deserialized = Transactions.deserializer.deserialize(serialized); + const deserialized = Transactions.Deserializer.deserialize(serialized); checkCommonFields(deserialized, bridgechainResignation); }); diff --git a/__tests__/unit/core-magistrate/transactions/bridgechain-update.test.ts b/__tests__/unit/core-magistrate/transactions/bridgechain-update.test.ts index d7da7a13cb..1a64a2db3e 100644 --- a/__tests__/unit/core-magistrate/transactions/bridgechain-update.test.ts +++ b/__tests__/unit/core-magistrate/transactions/bridgechain-update.test.ts @@ -27,7 +27,7 @@ describe("Bridgechain update ser/deser", () => { .getStruct(); const serialized = Transactions.TransactionFactory.fromData(businessResignation).serialized.toString("hex"); - const deserialized = Transactions.deserializer.deserialize(serialized); + const deserialized = Transactions.Deserializer.deserialize(serialized); checkCommonFields(deserialized, businessResignation); }); diff --git a/__tests__/unit/core-magistrate/transactions/business-registration.test.ts b/__tests__/unit/core-magistrate/transactions/business-registration.test.ts index 6731ac03c6..7925505637 100644 --- a/__tests__/unit/core-magistrate/transactions/business-registration.test.ts +++ b/__tests__/unit/core-magistrate/transactions/business-registration.test.ts @@ -32,7 +32,7 @@ describe("Business registration transaction", () => { const serialized = Transactions.TransactionFactory.fromData(businessRegistration).serialized.toString( "hex", ); - const deserialized = Transactions.deserializer.deserialize(serialized); + const deserialized = Transactions.Deserializer.deserialize(serialized); checkCommonFields(deserialized, businessRegistration); @@ -48,7 +48,7 @@ describe("Business registration transaction", () => { const serialized = Transactions.TransactionFactory.fromData(businessRegistration).serialized.toString( "hex", ); - const deserialized = Transactions.deserializer.deserialize(serialized); + const deserialized = Transactions.Deserializer.deserialize(serialized); checkCommonFields(deserialized, businessRegistration); @@ -64,7 +64,7 @@ describe("Business registration transaction", () => { const serialized = Transactions.TransactionFactory.fromData(businessRegistration).serialized.toString( "hex", ); - const deserialized = Transactions.deserializer.deserialize(serialized); + const deserialized = Transactions.Deserializer.deserialize(serialized); checkCommonFields(deserialized, businessRegistration); @@ -80,7 +80,7 @@ describe("Business registration transaction", () => { const serialized = Transactions.TransactionFactory.fromData(businessRegistration).serialized.toString( "hex", ); - const deserialized = Transactions.deserializer.deserialize(serialized); + const deserialized = Transactions.Deserializer.deserialize(serialized); checkCommonFields(deserialized, businessRegistration); diff --git a/__tests__/unit/core-magistrate/transactions/business-resgination.test.ts b/__tests__/unit/core-magistrate/transactions/business-resgination.test.ts index 5853ba5f6d..3d2e416ab5 100644 --- a/__tests__/unit/core-magistrate/transactions/business-resgination.test.ts +++ b/__tests__/unit/core-magistrate/transactions/business-resgination.test.ts @@ -22,7 +22,7 @@ describe("Business resignation ser/deser", () => { .getStruct(); const serialized = Transactions.TransactionFactory.fromData(businessResignation).serialized.toString("hex"); - const deserialized = Transactions.deserializer.deserialize(serialized); + const deserialized = Transactions.Deserializer.deserialize(serialized); checkCommonFields(deserialized, businessResignation); }); diff --git a/__tests__/unit/core-magistrate/transactions/business-update.test.ts b/__tests__/unit/core-magistrate/transactions/business-update.test.ts index c99c500928..d4dab5c340 100644 --- a/__tests__/unit/core-magistrate/transactions/business-update.test.ts +++ b/__tests__/unit/core-magistrate/transactions/business-update.test.ts @@ -24,7 +24,7 @@ describe("Business update transaction", () => { .getStruct(); const serialized = Transactions.TransactionFactory.fromData(businessResignation).serialized.toString("hex"); - const deserialized = Transactions.deserializer.deserialize(serialized); + const deserialized = Transactions.Deserializer.deserialize(serialized); checkCommonFields(deserialized, businessResignation); }); @@ -36,7 +36,7 @@ describe("Business update transaction", () => { .getStruct(); const serialized = Transactions.TransactionFactory.fromData(businessResignation).serialized.toString("hex"); - const deserialized = Transactions.deserializer.deserialize(serialized); + const deserialized = Transactions.Deserializer.deserialize(serialized); checkCommonFields(deserialized, businessResignation); }); @@ -48,7 +48,7 @@ describe("Business update transaction", () => { .getStruct(); const serialized = Transactions.TransactionFactory.fromData(businessResignation).serialized.toString("hex"); - const deserialized = Transactions.deserializer.deserialize(serialized); + const deserialized = Transactions.Deserializer.deserialize(serialized); checkCommonFields(deserialized, businessResignation); }); diff --git a/__tests__/unit/crypto/blocks/deserializer.test.ts b/__tests__/unit/crypto/blocks/deserializer.test.ts index 486a882a5b..0802387908 100644 --- a/__tests__/unit/crypto/blocks/deserializer.test.ts +++ b/__tests__/unit/crypto/blocks/deserializer.test.ts @@ -1,4 +1,4 @@ -import { deserializer } from "../../../../packages/crypto/src/blocks/deserializer"; +import { Deserializer } from "../../../../packages/crypto/src/blocks/deserializer"; import { Serializer } from "../../../../packages/crypto/src/blocks/serializer"; import { configManager } from "../../../../packages/crypto/src/managers"; import { dummyBlock2, dummyBlock3 } from "../fixtures/block"; @@ -9,7 +9,7 @@ describe("block deserializer", () => { const outlookTableBlockId = "123456"; configManager.set("exceptions.outlookTable", { [dummyBlock3.id]: outlookTableBlockId }); - const deserialized = deserializer.deserialize(Serializer.serialize(dummyBlock3).toString("hex"), true).data; + const deserialized = Deserializer.deserialize(Serializer.serialize(dummyBlock3).toString("hex"), true).data; expect(deserialized.id).toEqual(outlookTableBlockId); @@ -17,7 +17,7 @@ describe("block deserializer", () => { }); it("should correctly deserialize a block", () => { - const deserialized = deserializer.deserialize(dummyBlock2.serializedFull).data; + const deserialized = Deserializer.deserialize(dummyBlock2.serializedFull).data; const blockFields = [ "id", diff --git a/__tests__/unit/crypto/transactions/deserializer.test.ts b/__tests__/unit/crypto/transactions/deserializer.test.ts index 8c1d766a58..31e680edd7 100644 --- a/__tests__/unit/crypto/transactions/deserializer.test.ts +++ b/__tests__/unit/crypto/transactions/deserializer.test.ts @@ -15,11 +15,11 @@ import { IKeyPair, ITransaction, ITransactionData } from "../../../../packages/c import { configManager } from "../../../../packages/crypto/src/managers"; import { TransactionFactory, Utils as TransactionUtils, Verifier } from "../../../../packages/crypto/src/transactions"; import { BuilderFactory } from "../../../../packages/crypto/src/transactions/builders"; -import { deserializer } from "../../../../packages/crypto/src/transactions/deserializer"; +import { Deserializer } from "../../../../packages/crypto/src/transactions/deserializer"; import { Serializer } from "../../../../packages/crypto/src/transactions/serializer"; import { legacyMultiSignatureRegistration } from "./__fixtures__/transaction"; -describe("Transaction serializer / deserializer", () => { +describe("Transaction serializer / Deserializer", () => { const checkCommonFields = (deserialized: ITransaction, expected) => { const fieldsToCheck = ["version", "network", "type", "senderPublicKey", "fee", "amount"]; if (deserialized.data.version === 1) { @@ -48,7 +48,7 @@ describe("Transaction serializer / deserializer", () => { it("should ser/deserialize giving back original fields", () => { const serialized = TransactionFactory.fromData(transfer).serialized.toString("hex"); - const deserialized = deserializer.deserialize(serialized); + const deserialized = Deserializer.deserialize(serialized); checkCommonFields(deserialized, transfer); @@ -105,7 +105,7 @@ describe("Transaction serializer / deserializer", () => { .getStruct(); const serialized = TransactionFactory.fromData(secondSignature).serialized.toString("hex"); - const deserialized = deserializer.deserialize(serialized); + const deserialized = Deserializer.deserialize(serialized); checkCommonFields(deserialized, secondSignature); @@ -122,7 +122,7 @@ describe("Transaction serializer / deserializer", () => { .getStruct(); const serialized = TransactionFactory.fromData(delegateRegistration).serialized.toString("hex"); - const deserialized = deserializer.deserialize(serialized); + const deserialized = Deserializer.deserialize(serialized); checkCommonFields(deserialized, delegateRegistration); @@ -140,7 +140,7 @@ describe("Transaction serializer / deserializer", () => { .getStruct(); const serialized = TransactionFactory.fromData(vote).serialized.toString("hex"); - const deserialized = deserializer.deserialize(serialized); + const deserialized = Deserializer.deserialize(serialized); checkCommonFields(deserialized, vote); @@ -236,7 +236,7 @@ describe("Transaction serializer / deserializer", () => { it("should ser/deserialize giving back original fields", () => { const serialized = TransactionFactory.fromData(ipfsTransaction).serialized.toString("hex"); - const deserialized = deserializer.deserialize(serialized); + const deserialized = Deserializer.deserialize(serialized); checkCommonFields(deserialized, ipfsTransaction); @@ -261,7 +261,7 @@ describe("Transaction serializer / deserializer", () => { .getStruct(); const serialized = TransactionFactory.fromData(delegateResignation).serialized.toString("hex"); - const deserialized = deserializer.deserialize(serialized); + const deserialized = Deserializer.deserialize(serialized); checkCommonFields(deserialized, delegateResignation); }); @@ -296,7 +296,7 @@ describe("Transaction serializer / deserializer", () => { .getStruct(); const serialized = TransactionFactory.fromData(multiPayment).serialized.toString("hex"); - const deserialized = deserializer.deserialize(serialized); + const deserialized = Deserializer.deserialize(serialized); checkCommonFields(deserialized, multiPayment); }); @@ -371,7 +371,7 @@ describe("Transaction serializer / deserializer", () => { .getStruct(); const serialized = TransactionFactory.fromData(htlcLock).serialized.toString("hex"); - const deserialized = deserializer.deserialize(serialized); + const deserialized = Deserializer.deserialize(serialized); checkCommonFields(deserialized, htlcLock); @@ -414,7 +414,7 @@ describe("Transaction serializer / deserializer", () => { .getStruct(); const serialized = TransactionFactory.fromData(htlcClaim).serialized.toString("hex"); - const deserialized = deserializer.deserialize(serialized); + const deserialized = Deserializer.deserialize(serialized); checkCommonFields(deserialized, htlcClaim); @@ -454,7 +454,7 @@ describe("Transaction serializer / deserializer", () => { .getStruct(); const serialized = TransactionFactory.fromData(htlcRefund).serialized.toString("hex"); - const deserialized = deserializer.deserialize(serialized); + const deserialized = Deserializer.deserialize(serialized); checkCommonFields(deserialized, htlcRefund); @@ -508,7 +508,7 @@ describe("Transaction serializer / deserializer", () => { transactionWrongType.type = 55; const serialized = serializeWrongType(transactionWrongType).toString("hex"); - expect(() => deserializer.deserialize(serialized)).toThrow(UnkownTransactionError); + expect(() => Deserializer.deserialize(serialized)).toThrow(UnkownTransactionError); }); }); diff --git a/benchmark/transaction/deserialize/methods.js b/benchmark/transaction/deserialize/methods.js index 93a6deeef3..118017f014 100644 --- a/benchmark/transaction/deserialize/methods.js +++ b/benchmark/transaction/deserialize/methods.js @@ -3,5 +3,5 @@ const { } = require('@arkecosystem/crypto') exports.deserialize = data => { - return Transactions.deserializer.deserialize(data) + return Transactions.Deserializer.deserialize(data) } diff --git a/packages/crypto/src/blocks/block.ts b/packages/crypto/src/blocks/block.ts index 5739d6747b..e58657ab22 100644 --- a/packages/crypto/src/blocks/block.ts +++ b/packages/crypto/src/blocks/block.ts @@ -4,7 +4,7 @@ import { IBlock, IBlockData, IBlockJson, IBlockVerification, ITransaction, ITran import { configManager } from "../managers/config"; import { BigNumber, isException } from "../utils"; import { validator } from "../validation"; -import { deserializer } from "./deserializer"; +import { Deserializer } from "./deserializer"; import { Serializer } from "./serializer"; export class Block implements IBlock { @@ -46,7 +46,7 @@ export class Block implements IBlock { } public static deserialize(hexString: string, headerOnly: boolean = false): IBlockData { - return deserializer.deserialize(hexString, headerOnly).data; + return Deserializer.deserialize(hexString, headerOnly).data; } public static serializeWithTransactions(block: IBlockData) { diff --git a/packages/crypto/src/blocks/deserializer.ts b/packages/crypto/src/blocks/deserializer.ts index f1505a05a2..95c50c786c 100644 --- a/packages/crypto/src/blocks/deserializer.ts +++ b/packages/crypto/src/blocks/deserializer.ts @@ -5,8 +5,8 @@ import { TransactionFactory } from "../transactions"; import { BigNumber } from "../utils"; import { Block } from "./block"; -class Deserializer { - public deserialize( +export class Deserializer { + public static deserialize( serializedHex: string, headerOnly: boolean = false, options: { deserializeTransactionsUnchecked?: boolean } = {}, @@ -46,7 +46,7 @@ class Deserializer { return { data: block, transactions }; } - private deserializeHeader(block: IBlockData, buf: ByteBuffer): void { + private static deserializeHeader(block: IBlockData, buf: ByteBuffer): void { block.version = buf.readUint32(); block.timestamp = buf.readUint32(); block.height = buf.readUint32(); @@ -85,7 +85,7 @@ class Deserializer { block.blockSignature = buf.readBytes(signatureLength()).toString("hex"); } - private deserializeTransactions( + private static deserializeTransactions( block: IBlockData, buf: ByteBuffer, deserializeTransactionsUnchecked: boolean = false, @@ -110,5 +110,3 @@ class Deserializer { return transactions; } } - -export const deserializer = new Deserializer(); diff --git a/packages/crypto/src/blocks/factory.ts b/packages/crypto/src/blocks/factory.ts index e9c06911cd..635183722e 100644 --- a/packages/crypto/src/blocks/factory.ts +++ b/packages/crypto/src/blocks/factory.ts @@ -2,7 +2,7 @@ import { Hash, HashAlgorithms } from "../crypto"; import { IBlock, IBlockData, IBlockJson, IKeyPair, ITransaction } from "../interfaces"; import { BigNumber } from "../utils"; import { Block } from "./block"; -import { deserializer } from "./deserializer"; +import { Deserializer } from "./deserializer"; export class BlockFactory { // @TODO: add a proper type hint for data @@ -45,14 +45,14 @@ export class BlockFactory { data = Block.applySchema(data); const serialized: string = Block.serializeWithTransactions(data).toString("hex"); - const block: IBlock = new Block({ ...deserializer.deserialize(serialized, false, options), id: data.id }); + const block: IBlock = new Block({ ...Deserializer.deserialize(serialized, false, options), id: data.id }); block.serialized = serialized; return block; } private static fromSerialized(serialized: string): IBlock { - const deserialized: { data: IBlockData; transactions: ITransaction[] } = deserializer.deserialize(serialized); + const deserialized: { data: IBlockData; transactions: ITransaction[] } = Deserializer.deserialize(serialized); deserialized.data = Block.applySchema(deserialized.data); const block: IBlock = new Block(deserialized); diff --git a/packages/crypto/src/transactions/deserializer.ts b/packages/crypto/src/transactions/deserializer.ts index 92ad9b5b2a..8ffa8c6bf3 100644 --- a/packages/crypto/src/transactions/deserializer.ts +++ b/packages/crypto/src/transactions/deserializer.ts @@ -11,8 +11,8 @@ import { BigNumber, isSupportedTansactionVersion } from "../utils"; import { TransactionTypeFactory } from "./types"; // Reference: https://github.com/ArkEcosystem/AIPs/blob/master/AIPS/aip-11.md -class Deserializer { - public deserialize(serialized: string | Buffer, options: IDeserializeOptions = {}): ITransaction { +export class Deserializer { + public static deserialize(serialized: string | Buffer, options: IDeserializeOptions = {}): ITransaction { const data = {} as ITransactionData; const buffer: ByteBuffer = this.getByteBuffer(serialized); @@ -39,7 +39,7 @@ class Deserializer { return instance; } - private deserializeCommon(transaction: ITransactionData, buf: ByteBuffer): void { + private static deserializeCommon(transaction: ITransactionData, buf: ByteBuffer): void { buf.skip(1); // Skip 0xFF marker transaction.version = buf.readUint8(); transaction.network = buf.readUint8(); @@ -58,7 +58,7 @@ class Deserializer { transaction.amount = BigNumber.ZERO; } - private deserializeVendorField(transaction: ITransaction, buf: ByteBuffer): void { + private static deserializeVendorField(transaction: ITransaction, buf: ByteBuffer): void { const vendorFieldLength: number = buf.readUint8(); if (vendorFieldLength > 0) { if (transaction.hasVendorField()) { @@ -70,7 +70,7 @@ class Deserializer { } } - private deserializeSignatures(transaction: ITransactionData, buf: ByteBuffer): void { + private static deserializeSignatures(transaction: ITransactionData, buf: ByteBuffer): void { if (transaction.version === 1) { this.deserializeECDSA(transaction, buf); } else { @@ -78,7 +78,7 @@ class Deserializer { } } - private deserializeSchnorrOrECDSA(transaction: ITransactionData, buf: ByteBuffer): void { + private static deserializeSchnorrOrECDSA(transaction: ITransactionData, buf: ByteBuffer): void { if (this.detectSchnorr(buf)) { this.deserializeSchnorr(transaction, buf); } else { @@ -86,7 +86,7 @@ class Deserializer { } } - private deserializeECDSA(transaction: ITransactionData, buf: ByteBuffer): void { + private static deserializeECDSA(transaction: ITransactionData, buf: ByteBuffer): void { const currentSignatureLength = (): number => { buf.mark(); @@ -133,7 +133,7 @@ class Deserializer { } } - private deserializeSchnorr(transaction: ITransactionData, buf: ByteBuffer): void { + private static deserializeSchnorr(transaction: ITransactionData, buf: ByteBuffer): void { const canReadNonMultiSignature = () => { return buf.remaining() && (buf.remaining() % 64 === 0 || buf.remaining() % 65 !== 0); }; @@ -170,7 +170,7 @@ class Deserializer { } } - private detectSchnorr(buf: ByteBuffer): boolean { + private static detectSchnorr(buf: ByteBuffer): boolean { const remaining: number = buf.remaining(); // `signature` / `secondSignature` @@ -192,7 +192,7 @@ class Deserializer { } // tslint:disable-next-line:member-ordering - public applyV1Compatibility(transaction: ITransactionData): void { + public static applyV1Compatibility(transaction: ITransactionData): void { transaction.secondSignature = transaction.secondSignature || transaction.signSignature; transaction.typeGroup = TransactionTypeGroup.Core; @@ -205,7 +205,7 @@ class Deserializer { } } - private getByteBuffer(serialized: Buffer | string): ByteBuffer { + private static getByteBuffer(serialized: Buffer | string): ByteBuffer { if (!(serialized instanceof Buffer)) { serialized = Buffer.from(serialized, "hex"); } @@ -217,5 +217,3 @@ class Deserializer { return buffer; } } - -export const deserializer = new Deserializer(); diff --git a/packages/crypto/src/transactions/factory.ts b/packages/crypto/src/transactions/factory.ts index f65045986e..86b7f63b71 100644 --- a/packages/crypto/src/transactions/factory.ts +++ b/packages/crypto/src/transactions/factory.ts @@ -13,7 +13,7 @@ import { ITransactionJson, } from "../interfaces"; import { BigNumber, isException } from "../utils"; -import { deserializer } from "./deserializer"; +import { Deserializer } from "./deserializer"; import { Serializer } from "./serializer"; import { TransactionTypeFactory } from "./types"; import { Utils } from "./utils"; @@ -38,7 +38,7 @@ export class TransactionFactory { public static fromBytesUnsafe(buffer: Buffer, id?: string): ITransaction { try { const options: IDeserializeOptions | ISerializeOptions = { acceptLegacyVersion: true }; - const transaction = deserializer.deserialize(buffer, options); + const transaction = Deserializer.deserialize(buffer, options); transaction.data.id = id || Utils.getId(transaction.data, options); transaction.isVerified = true; @@ -67,7 +67,7 @@ export class TransactionFactory { const { version } = transaction.data; if (version === 1) { - deserializer.applyV1Compatibility(transaction.data); + Deserializer.applyV1Compatibility(transaction.data); } Serializer.serialize(transaction); @@ -77,7 +77,7 @@ export class TransactionFactory { private static fromSerialized(serialized: string, strict: boolean = true): ITransaction { try { - const transaction = deserializer.deserialize(serialized); + const transaction = Deserializer.deserialize(serialized); transaction.data.id = Utils.getId(transaction.data); const { value, error } = Verifier.verifySchema(transaction.data, strict);