From 7edeab87016819507fc55541461732d9440efab6 Mon Sep 17 00:00:00 2001 From: harkamal Date: Sun, 19 Feb 2023 19:02:28 +0530 Subject: [PATCH] fix reset canonical header and add fix --- packages/blockchain/src/blockchain.ts | 8 +++++++- packages/blockchain/test/index.spec.ts | 7 +++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/blockchain/src/blockchain.ts b/packages/blockchain/src/blockchain.ts index 7bc5211cfdf..6cfa4ae765d 100644 --- a/packages/blockchain/src/blockchain.ts +++ b/packages/blockchain/src/blockchain.ts @@ -422,9 +422,11 @@ export class Blockchain implements BlockchainInterface { canonicalHead > BigInt(0) ? await this.getTotalDifficulty(header.hash(), canonicalHead) : header.difficulty + const dbOps: DBOp[] = [] - await this._rebuildCanonical(header, dbOps) + await this._deleteCanonicalChainReferences(canonicalHead + BigInt(1), hash, dbOps) const ops = dbOps.concat(this._saveHeadOps()) + await this.dbManager.batch(ops) await this.checkAndTransitionHardForkByNumber(canonicalHead, td, header.timestamp) }) @@ -1079,6 +1081,10 @@ export class Blockchain implements BlockchainInterface { if (this._headBlockHash?.equals(hash) === true) { this._headBlockHash = headHash } + // reset stale headBlock to current canonical + if (this._headHeaderHash?.equals(hash) === true) { + this._headHeaderHash = headHash + } blockNumber++ diff --git a/packages/blockchain/test/index.spec.ts b/packages/blockchain/test/index.spec.ts index a9df1fd7082..2bff9cc476d 100644 --- a/packages/blockchain/test/index.spec.ts +++ b/packages/blockchain/test/index.spec.ts @@ -231,6 +231,13 @@ tape('blockchain test', (t) => { st.equal(getBlocks!.length, 5) st.equal(blocks[0].header.number, getBlocks[0].header.number) st.ok(isConsecutive(getBlocks!), 'blocks should be consecutive') + + let canonicalHeader = await blockchain.getCanonicalHeadHeader() + st.equal(canonicalHeader.number, BigInt(24), 'block 24 should be canonical header') + await blockchain.resetCanonicalHead(BigInt(4)) + canonicalHeader = await blockchain.getCanonicalHeadHeader() + st.equal(canonicalHeader.number, BigInt(4), 'block 4 should be new canonical header') + st.end() })