diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp
--- a/src/rpc/blockchain.cpp
+++ b/src/rpc/blockchain.cpp
@@ -1597,15 +1597,15 @@
     BlockHash hash(uint256S(strHash));
     CValidationState state;
 
-    CBlockIndex *pblockindex;
     {
         LOCK(cs_main);
-        pblockindex = LookupBlockIndex(hash);
+        CBlockIndex *pblockindex = LookupBlockIndex(hash);
         if (!pblockindex) {
             throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found");
         }
+
+        FinalizeBlockAndInvalidate(config, state, pblockindex);
     }
-    FinalizeBlockAndInvalidate(config, state, pblockindex);
 
     if (state.IsValid()) {
         ActivateBestChain(config, state);
diff --git a/src/validation.h b/src/validation.h
--- a/src/validation.h
+++ b/src/validation.h
@@ -639,7 +639,8 @@
  * A finalized block can not be reorged in any way.
  */
 bool FinalizeBlockAndInvalidate(const Config &config, CValidationState &state,
-                                CBlockIndex *pindex);
+                                CBlockIndex *pindex)
+    EXCLUSIVE_LOCKS_REQUIRED(cs_main);
 
 /** Mark a block as invalid. */
 bool InvalidateBlock(const Config &config, CValidationState &state,
diff --git a/src/validation.cpp b/src/validation.cpp
--- a/src/validation.cpp
+++ b/src/validation.cpp
@@ -3126,29 +3126,26 @@
 
 bool FinalizeBlockAndInvalidate(const Config &config, CValidationState &state,
                                 CBlockIndex *pindex) {
-    {
-        LOCK(cs_main);
-        if (!FinalizeBlockInternal(config, state, pindex)) {
-            // state is set by FinalizeBlockInternal.
-            return false;
-        }
+    AssertLockHeld(cs_main);
+    if (!FinalizeBlockInternal(config, state, pindex)) {
+        // state is set by FinalizeBlockInternal.
+        return false;
+    }
 
-        // We have a valid candidate, make sure it is not parked.
-        if (pindex->nStatus.isOnParkedChain()) {
-            UnparkBlock(pindex);
-        }
+    // We have a valid candidate, make sure it is not parked.
+    if (pindex->nStatus.isOnParkedChain()) {
+        UnparkBlock(pindex);
     }
 
     // If the finalized block is not on the active chain, we need to rewind.
-    if (AreOnTheSameFork(pindex, chainActive.Tip())) {
-        return true;
+    if (!AreOnTheSameFork(pindex, chainActive.Tip())) {
+        const CBlockIndex *pindexFork = chainActive.FindFork(pindex);
+        CBlockIndex *pindexToInvalidate =
+            chainActive.Tip()->GetAncestor(pindexFork->nHeight + 1);
+        return InvalidateBlock(config, state, pindexToInvalidate);
     }
 
-    const CBlockIndex *pindexFork = chainActive.FindFork(pindex);
-    CBlockIndex *pindexToInvalidate =
-        chainActive.Tip()->GetAncestor(pindexFork->nHeight + 1);
-
-    return InvalidateBlock(config, state, pindexToInvalidate);
+    return true;
 }
 
 bool InvalidateBlock(const Config &config, CValidationState &state,