From 552f886c39706a02e84a327a3d78cee307e368c3 Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Fri, 18 Oct 2019 19:56:27 +0100 Subject: [PATCH] #313 Metadata xor --- .../MetadataTransactionService.spec.ts | 82 +++++++++++++++++++ src/core/format/Convert.ts | 4 +- src/service/MetadataTransactionService.ts | 6 +- .../MetadataTransactionservice.spec.ts | 10 ++- 4 files changed, 93 insertions(+), 9 deletions(-) diff --git a/e2e/service/MetadataTransactionService.spec.ts b/e2e/service/MetadataTransactionService.spec.ts index 4e11e5cb66..968b38f763 100644 --- a/e2e/service/MetadataTransactionService.spec.ts +++ b/e2e/service/MetadataTransactionService.spec.ts @@ -303,4 +303,86 @@ describe('MetadataTransactionService', () => { }); }); }); + + describe('Announce transaction through service with delta size increase', () => { + let listener: Listener; + before (() => { + listener = new Listener(config.apiUrl); + return listener.open(); + }); + after(() => { + return listener.close(); + }); + it('should create MosaicMetadataTransaction and announce', (done) => { + const metaDataService = new MetadataTransactionService(metadataHttp); + + return metaDataService.createMetadataTransaction( + deadline, + NetworkType.MIJIN_TEST, + MetadataType.Mosaic, + targetAccount.publicAccount, + key, + newValue + 'delta' + 'extra delta', + targetAccount.publicAccount, + mosaicId, + ).subscribe((transaction: MosaicMetadataTransaction) => { + const aggregateTransaction = AggregateTransaction.createComplete(Deadline.create(), + [transaction.toAggregate(targetAccount.publicAccount)], + NetworkType.MIJIN_TEST, + [], + ); + const signedTransaction = aggregateTransaction.signWith(targetAccount, generationHash); + listener.confirmed(targetAccount.address).subscribe(() => { + done(); + }); + listener.status(targetAccount.address).subscribe((error) => { + console.log('Error:', error); + assert(false); + done(); + }); + transactionHttp.announce(signedTransaction); + }); + }); + }); + + describe('Announce transaction through service with delta size decrease', () => { + let listener: Listener; + before (() => { + listener = new Listener(config.apiUrl); + return listener.open(); + }); + after(() => { + return listener.close(); + }); + it('should create MosaicMetadataTransaction and announce', (done) => { + const metaDataService = new MetadataTransactionService(metadataHttp); + + return metaDataService.createMetadataTransaction( + deadline, + NetworkType.MIJIN_TEST, + MetadataType.Mosaic, + targetAccount.publicAccount, + key, + newValue, + targetAccount.publicAccount, + mosaicId, + ).subscribe((transaction: MosaicMetadataTransaction) => { + const aggregateTransaction = AggregateTransaction.createComplete(Deadline.create(), + [transaction.toAggregate(targetAccount.publicAccount)], + NetworkType.MIJIN_TEST, + [], + ); + const signedTransaction = aggregateTransaction.signWith(targetAccount, generationHash); + listener.confirmed(targetAccount.address).subscribe(() => { + done(); + }); + listener.status(targetAccount.address).subscribe((error) => { + console.log('Error:', error); + assert(false); + done(); + }); + transactionHttp.announce(signedTransaction); + }); + }); + }); }); diff --git a/src/core/format/Convert.ts b/src/core/format/Convert.ts index b7695c2401..c7e882493c 100644 --- a/src/core/format/Convert.ts +++ b/src/core/format/Convert.ts @@ -225,9 +225,7 @@ export class Convert { const delta: number[] = []; for (let i = 0; i < length; ++i) { const xorBuffer = buffer1[i] ^ buffer2[i]; - if (xorBuffer !== 0) { - delta.push(xorBuffer); - } + delta.push(xorBuffer); } return Convert.uint8ToHex(Uint8Array.from(delta)); } diff --git a/src/service/MetadataTransactionService.ts b/src/service/MetadataTransactionService.ts index d4f2e1a749..557c07f72a 100644 --- a/src/service/MetadataTransactionService.ts +++ b/src/service/MetadataTransactionService.ts @@ -137,7 +137,7 @@ export class MetadataTransactionService { targetPublicKey, key, newValueBytes.length - currentValueByte.length, - value, + Convert.decodeHex(Convert.xor(currentValueByte, newValueBytes)), networkType, maxFee, ); @@ -191,7 +191,7 @@ export class MetadataTransactionService { key, mosaicId, newValueBytes.length - currentValueByte.length, - value, + Convert.decodeHex(Convert.xor(currentValueByte, newValueBytes)), networkType, maxFee, ); @@ -246,7 +246,7 @@ export class MetadataTransactionService { key, namespaceId, newValueBytes.length - currentValueByte.length, - value, + Convert.decodeHex(Convert.xor(currentValueByte, newValueBytes)), networkType, maxFee, ); diff --git a/test/service/MetadataTransactionservice.spec.ts b/test/service/MetadataTransactionservice.spec.ts index 50103111e7..d8b7ee9dad 100644 --- a/test/service/MetadataTransactionservice.spec.ts +++ b/test/service/MetadataTransactionservice.spec.ts @@ -17,6 +17,7 @@ import {expect} from 'chai'; import {of as observableOf} from 'rxjs'; import {deepEqual, instance, mock, when} from 'ts-mockito'; +import { Convert } from '../../src/core/format/Convert'; import { MetadataHttp } from '../../src/infrastructure/MetadataHttp'; import { Account } from '../../src/model/account/Account'; import {NetworkType} from '../../src/model/blockchain/NetworkType'; @@ -70,7 +71,8 @@ describe('MetadataTransactionService', () => { .subscribe((transaction: AccountMetadataTransaction) => { expect(transaction.type).to.be.equal(TransactionType.ACCOUNT_METADATA_TRANSACTION); expect(transaction.scopedMetadataKey.toHex()).to.be.equal(key.toHex()); - expect(transaction.value).to.be.equal(value + deltaValue); + expect(Convert.utf8ToHex(transaction.value)) + .to.be.equal(Convert.xor(Convert.utf8ToUint8(value), Convert.utf8ToUint8(value + deltaValue))); expect(transaction.valueSizeDelta).to.be.equal(deltaValue.length); expect(transaction.targetPublicKey).to.be.equal(account.publicKey); done(); @@ -89,7 +91,8 @@ describe('MetadataTransactionService', () => { .subscribe((transaction: MosaicMetadataTransaction) => { expect(transaction.type).to.be.equal(TransactionType.MOSAIC_METADATA_TRANSACTION); expect(transaction.scopedMetadataKey.toHex()).to.be.equal(key.toHex()); - expect(transaction.value).to.be.equal(value + deltaValue); + expect(Convert.utf8ToHex(transaction.value)) + .to.be.equal(Convert.xor(Convert.utf8ToUint8(value), Convert.utf8ToUint8(value + deltaValue))); expect(transaction.targetMosaicId.toHex()).to.be.equal(targetIdHex); expect(transaction.valueSizeDelta).to.be.equal(deltaValue.length); expect(transaction.targetPublicKey).to.be.equal(account.publicKey); @@ -109,7 +112,8 @@ describe('MetadataTransactionService', () => { .subscribe((transaction: NamespaceMetadataTransaction) => { expect(transaction.type).to.be.equal(TransactionType.NAMESPACE_METADATA_TRANSACTION); expect(transaction.scopedMetadataKey.toHex()).to.be.equal(key.toHex()); - expect(transaction.value).to.be.equal(value + deltaValue); + expect(Convert.utf8ToHex(transaction.value)) + .to.be.equal(Convert.xor(Convert.utf8ToUint8(value), Convert.utf8ToUint8(value + deltaValue))); expect(transaction.targetNamespaceId.toHex()).to.be.equal(targetIdHex); expect(transaction.valueSizeDelta).to.be.equal(deltaValue.length); expect(transaction.targetPublicKey).to.be.equal(account.publicKey);