Skip to content

Commit

Permalink
refactor(crypro): make deserializers static (#3234)
Browse files Browse the repository at this point in the history
  • Loading branch information
spkjp committed Nov 22, 2019
1 parent 7d7a4a8 commit c5b5301
Show file tree
Hide file tree
Showing 8 changed files with 40 additions and 43 deletions.
6 changes: 3 additions & 3 deletions __tests__/unit/crypto/blocks/deserializer.test.ts
Original file line number Diff line number Diff line change
@@ -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";
Expand All @@ -9,15 +9,15 @@ 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);

configManager.set("exceptions.outlookTable", {});
});

it("should correctly deserialize a block", () => {
const deserialized = deserializer.deserialize(dummyBlock2.serializedFull).data;
const deserialized = Deserializer.deserialize(dummyBlock2.serializedFull).data;

const blockFields = [
"id",
Expand Down
24 changes: 12 additions & 12 deletions __tests__/unit/crypto/transactions/deserializer.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ 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";

Expand Down Expand Up @@ -51,7 +51,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);

Expand Down Expand Up @@ -108,7 +108,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);

Expand All @@ -125,7 +125,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);

Expand All @@ -143,7 +143,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);

Expand Down Expand Up @@ -241,7 +241,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);

Expand All @@ -266,7 +266,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);
});
Expand Down Expand Up @@ -302,7 +302,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);
});
Expand Down Expand Up @@ -378,7 +378,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);

Expand Down Expand Up @@ -422,7 +422,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);

Expand Down Expand Up @@ -463,7 +463,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);

Expand Down Expand Up @@ -518,7 +518,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);
});
});

Expand Down
2 changes: 1 addition & 1 deletion benchmark/transaction/deserialize/methods.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@ const {
} = require('@arkecosystem/crypto')

exports.deserialize = data => {
return Transactions.deserializer.deserialize(data)
return Transactions.Deserializer.deserialize(data)
}
4 changes: 2 additions & 2 deletions packages/crypto/src/blocks/block.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -54,7 +54,7 @@ export class Block implements IBlock {
}

public static deserialize(hexString: string, headerOnly = false): IBlockData {
return deserializer.deserialize(hexString, headerOnly).data;
return Deserializer.deserialize(hexString, headerOnly).data;
}

public static serializeWithTransactions(block: IBlockData) {
Expand Down
10 changes: 4 additions & 6 deletions packages/crypto/src/blocks/deserializer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,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 } = {},
Expand Down Expand Up @@ -47,7 +47,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();
Expand Down Expand Up @@ -86,7 +86,7 @@ class Deserializer {
block.blockSignature = buf.readBytes(signatureLength()).toString("hex");
}

private deserializeTransactions(
private static deserializeTransactions(
block: IBlockData,
buf: ByteBuffer,
deserializeTransactionsUnchecked: boolean = false,
Expand All @@ -111,5 +111,3 @@ class Deserializer {
return transactions;
}
}

export const deserializer = new Deserializer();
6 changes: 3 additions & 3 deletions packages/crypto/src/blocks/factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -52,7 +52,7 @@ export class BlockFactory {
if (block) {
const serialized: string = Block.serializeWithTransactions(data).toString("hex");
const block: IBlock = new Block({
...deserializer.deserialize(serialized, false, options),
...Deserializer.deserialize(serialized, false, options),
id: data.id,
});
block.serialized = serialized;
Expand All @@ -64,7 +64,7 @@ export class BlockFactory {
}

private static fromSerialized(serialized: string): IBlock {
const deserialized: { data: IBlockData; transactions: ITransaction[] } = deserializer.deserialize(serialized);
const deserialized: { data: IBlockData; transactions: ITransaction[] } = Deserializer.deserialize(serialized);

const validated: IBlockData | undefined = Block.applySchema(deserialized.data);

Expand Down
23 changes: 11 additions & 12 deletions packages/crypto/src/transactions/deserializer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,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);
Expand Down Expand Up @@ -42,7 +42,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();
Expand All @@ -61,7 +61,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()) {
Expand All @@ -73,23 +73,23 @@ 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 {
this.deserializeSchnorrOrECDSA(transaction, buf);
}
}

private deserializeSchnorrOrECDSA(transaction: ITransactionData, buf: ByteBuffer): void {
private static deserializeSchnorrOrECDSA(transaction: ITransactionData, buf: ByteBuffer): void {
if (this.detectSchnorr(buf)) {
this.deserializeSchnorr(transaction, buf);
} else {
this.deserializeECDSA(transaction, buf);
}
}

private deserializeECDSA(transaction: ITransactionData, buf: ByteBuffer): void {
private static deserializeECDSA(transaction: ITransactionData, buf: ByteBuffer): void {
const currentSignatureLength = (): number => {
buf.mark();

Expand Down Expand Up @@ -136,7 +136,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);
};
Expand Down Expand Up @@ -173,7 +173,7 @@ class Deserializer {
}
}

private detectSchnorr(buf: ByteBuffer): boolean {
private static detectSchnorr(buf: ByteBuffer): boolean {
const remaining: number = buf.remaining();

// `signature` / `secondSignature`
Expand All @@ -195,7 +195,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;

Expand All @@ -212,7 +212,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");
}
Expand All @@ -225,4 +225,3 @@ class Deserializer {
}
}

export const deserializer = new Deserializer();
8 changes: 4 additions & 4 deletions packages/crypto/src/transactions/factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -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;

Expand Down Expand Up @@ -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);
Expand All @@ -77,7 +77,7 @@ export class TransactionFactory {

private static fromSerialized(serialized: string, strict = 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);
Expand Down

0 comments on commit c5b5301

Please sign in to comment.