Skip to content

Commit

Permalink
fix(crypto): multisig legacy allow signatures property (#3489)
Browse files Browse the repository at this point in the history
  • Loading branch information
air1one authored Feb 14, 2020
1 parent c5284aa commit 454a125
Show file tree
Hide file tree
Showing 3 changed files with 107 additions and 58 deletions.
34 changes: 32 additions & 2 deletions __tests__/unit/crypto/transactions/schemas.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ import { IMultiSignatureAsset } from "../../../../packages/crypto/src/interfaces
import { configManager } from "../../../../packages/crypto/src/managers";
import { BuilderFactory } from "../../../../packages/crypto/src/transactions";
import { TransactionTypeFactory } from "../../../../packages/crypto/src/transactions";
import { schemas } from "../../../../packages/crypto/src/transactions/types";
import { TransactionSchema } from "../../../../packages/crypto/src/transactions/types/schemas";
import { validator as Ajv } from "../../../../packages/crypto/src/validation";
import { htlcSecretHex, htlcSecretHashHex } from "../../../utils/fixtures"
import { htlcSecretHashHex, htlcSecretHex } from "../../../utils/fixtures";

let transaction;
let transactionSchema: TransactionSchema;
Expand Down Expand Up @@ -697,7 +698,7 @@ describe("Multi Signature Registration Transaction", () => {
expect(error).not.toBeUndefined();
});

it("should validate legacy multisignature", () => {
it("should not validate legacy multisignature against current multisig schema", () => {
const legacyMultiSignature = {
version: 1,
network: 23,
Expand All @@ -723,6 +724,35 @@ describe("Multi Signature Registration Transaction", () => {
};

const { error } = Ajv.validate(transactionSchema.$id, legacyMultiSignature);
expect(error).not.toBeUndefined();
});

it("should validate legacy multisignature against legacy schema", () => {
const legacyMultiSignature = {
version: 1,
network: 23,
type: 4,
timestamp: 53253482,
senderPublicKey: "0333421e69d3531a1c43c43cd4b9344e5a10640644a5fd35618b6306f3a4d7f208",
fee: "2000000000",
amount: "0",
asset: {
multiSignatureLegacy: {
keysgroup: [
"+034da006f958beba78ec54443df4a3f52237253f7ae8cbdb17dccf3feaa57f3126",
"+0310c283aac7b35b4ae6fab201d36e8322c3408331149982e16013a5bcb917081c",
"+0392a762e0123945455b7afe675e5ab98fb1586de43e5682514b9454d6edced724",
],
lifetime: 24,
min: 2,
},
},
signature:
"304402206009fbf8592e2e3485bc0aa84dbbc8c78326d59191daf870693bc3446b5eeeee02200b4ff5dd53b1e337fe6fbe090f42337dcfc4242c802c340815326e3858d13d6b",
id: "32aa60577531c190e6a29d28f434367c84c2f0a62eceba5c5483a3983639d51a",
};

const { error } = Ajv.validate(schemas.multiSignatureLegacy, legacyMultiSignature);
expect(error).toBeUndefined();
});
});
Expand Down
5 changes: 5 additions & 0 deletions packages/crypto/src/transactions/registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
IpfsTransaction,
MultiPaymentTransaction,
MultiSignatureRegistrationTransaction,
schemas,
SecondSignatureRegistrationTransaction,
Transaction,
TransactionTypeFactory,
Expand Down Expand Up @@ -42,6 +43,10 @@ class TransactionRegistry {
this.registerTransactionType(HtlcLockTransaction);
this.registerTransactionType(HtlcClaimTransaction);
this.registerTransactionType(HtlcRefundTransaction);

// registering multisignature legacy schema separate after splitting the main
// multisignature schema into current implementation and legacy
validator.extendTransaction(schemas.multiSignatureLegacy, false);
}

public registerTransactionType(constructor: TransactionConstructor): void {
Expand Down
126 changes: 70 additions & 56 deletions packages/crypto/src/transactions/types/schemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -147,82 +147,96 @@ export const vote = extend(transactionBaseSchema, {

export const multiSignature = extend(transactionBaseSchema, {
$id: "multiSignature",
if: { properties: { version: { anyOf: [{ type: "null" }, { const: 1 }] } } },
then: { required: ["asset"] },
else: { required: ["asset", "signatures"] },
required: ["asset", "signatures"],
properties: {
type: { transactionType: TransactionType.MultiSignature },
amount: { bignumber: { minimum: 0, maximum: 0 } },
fee: { bignumber: { minimum: 1 } },
asset: {
anyOf: [
{
type: "object",
required: ["multiSignature"],
properties: {
multiSignature: {
type: "object",
required: ["multiSignature"],
required: ["min", "publicKeys"],
properties: {
multiSignature: {
type: "object",
required: ["min", "publicKeys"],
properties: {
min: {
type: "integer",
minimum: 1,
maximum: { $data: "1/publicKeys/length" },
},
publicKeys: {
type: "array",
minItems: 1,
maxItems: 16,
additionalItems: false,
uniqueItems: true,
items: { $ref: "publicKey" },
},
},
min: {
type: "integer",
minimum: 1,
maximum: { $data: "1/publicKeys/length" },
},
publicKeys: {
type: "array",
minItems: 1,
maxItems: 16,
additionalItems: false,
uniqueItems: true,
items: { $ref: "publicKey" },
},
},
},
{
},
},
signatures: {
type: "array",
minItems: { $data: "1/asset/multiSignature/min" },
maxItems: { $data: "1/asset/multiSignature/publicKeys/length" },
additionalItems: false,
uniqueItems: true,
items: { allOf: [{ minLength: 130, maxLength: 130 }, { $ref: "alphanumeric" }] },
},
},
});

// Multisignature legacy transactions have a different signatures property.
// Then we delete the "signatures" property definition to implement our own.
const transactionBaseSchemaNoSignatures = extend(transactionBaseSchema, {});
delete transactionBaseSchemaNoSignatures.properties.signatures;
export const multiSignatureLegacy = extend(transactionBaseSchemaNoSignatures, {
$id: "multiSignatureLegacy",
required: ["asset"],
properties: {
version: { anyOf: [{ type: "null" }, { const: 1 }] },
type: { transactionType: TransactionType.MultiSignature },
amount: { bignumber: { minimum: 0, maximum: 0 } },
fee: { bignumber: { minimum: 1 } },
asset: {
type: "object",
required: ["multiSignatureLegacy"],
properties: {
multiSignatureLegacy: {
type: "object",
required: ["multiSignatureLegacy"],
required: ["keysgroup", "min", "lifetime"],
properties: {
multiSignatureLegacy: {
type: "object",
required: ["keysgroup", "min", "lifetime"],
properties: {
min: {
type: "integer",
minimum: 1,
maximum: { $data: "1/keysgroup/length" },
},
lifetime: {
type: "integer",
minimum: 1,
maximum: 72,
},
keysgroup: {
type: "array",
minItems: 1,
maxItems: 16,
additionalItems: false,
items: {
allOf: [
{ type: "string", minimum: 67, maximum: 67, transform: ["toLowerCase"] },
],
},
},
min: {
type: "integer",
minimum: 1,
maximum: { $data: "1/keysgroup/length" },
},
lifetime: {
type: "integer",
minimum: 1,
maximum: 72,
},
keysgroup: {
type: "array",
minItems: 1,
maxItems: 16,
additionalItems: false,
items: {
allOf: [{ type: "string", minimum: 67, maximum: 67, transform: ["toLowerCase"] }],
},
},
},
},
],
},
},
signatures: {
type: "array",
minItems: { $data: "1/asset/multiSignature/min" },
maxItems: { $data: "1/asset/multiSignature/publicKeys/length" },
minItems: 1,
maxItems: 1,
additionalItems: false,
uniqueItems: true,
items: { allOf: [{ minLength: 130, maxLength: 130 }, { $ref: "alphanumeric" }] },
items: { $ref: "alphanumeric" },
},
},
});
Expand Down

0 comments on commit 454a125

Please sign in to comment.