From 549a516aeea9fe28723f15140c84ecdf7a2e0c82 Mon Sep 17 00:00:00 2001 From: Vasil Dimov Date: Mon, 12 Aug 2019 14:54:37 +0300 Subject: [PATCH] feat(core-blockchain): check tx nonce order also wrt previous blocks --- .../src/processor/block-processor.ts | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/packages/core-blockchain/src/processor/block-processor.ts b/packages/core-blockchain/src/processor/block-processor.ts index e52d579586..2bb5aeb380 100644 --- a/packages/core-blockchain/src/processor/block-processor.ts +++ b/packages/core-blockchain/src/processor/block-processor.ts @@ -125,40 +125,34 @@ export class BlockProcessor { * increasing nonce without gaps. */ private blockContainsOutOfOrderNonce(block: Interfaces.IBlock): boolean { - const latestNonceBySender = {}; + const nonceBySender = {}; for (const transaction of block.transactions) { const data = transaction.data; if (data.version < 2) { - if (latestNonceBySender[data.senderPublicKey] === undefined) { - continue; - } + continue; + } - this.logger.warn( - `Block { height: ${block.data.height.toLocaleString()}, id: ${block.data.id} } ` + - `not accepted: contains v2 transaction with nonce, followed by ` + - `v1 transaction without nonce for sender ${data.senderPublicKey}.`, - ); + const sender: string = data.senderPublicKey; - return true; + if (nonceBySender[sender] === undefined) { + nonceBySender[sender] = this.blockchain.database.walletManager.getNonce(sender); } - const currentNonce = Utils.BigNumber.make(data.nonce); - - if (latestNonceBySender[data.senderPublicKey] !== undefined && - !latestNonceBySender[data.senderPublicKey].plus(1).isEqualTo(currentNonce)) { + const currentTransactionNonce = Utils.BigNumber.make(data.nonce); + if (!nonceBySender[sender].plus(1).isEqualTo(currentTransactionNonce)) { this.logger.warn( `Block { height: ${block.data.height.toLocaleString()}, id: ${block.data.id} } ` + - `not accepted: transactions are out of order with respect to nonce ` + - `for sender ${data.senderPublicKey}.`, + `not accepted: invalid nonce order for sender ${sender}: ` + + `preceding nonce: ${nonceBySender[sender].toFixed()}, ` + + `transaction ${data.id} has nonce ${currentTransactionNonce.toFixed()}.`, ); - return true; } - latestNonceBySender[data.senderPublicKey] = currentNonce; + nonceBySender[sender] = currentTransactionNonce; } return false;