From 31c526443037612a39c69fdfdd7ae63e4c8e17a4 Mon Sep 17 00:00:00 2001 From: Ori Newman Date: Tue, 10 Nov 2020 04:43:18 -0800 Subject: [PATCH] [NOD-1527] Allow to process headers while in missing utxo set sync state (#1018) * [NOD-1527] Allow to process headers while in missing utxo set sync state * [NOD-1527] Add isHeaderOnlyBlock function --- .../blockprocessor/validateandinsertblock.go | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/domain/consensus/processes/blockprocessor/validateandinsertblock.go b/domain/consensus/processes/blockprocessor/validateandinsertblock.go index f94353538..89c7ff8f0 100644 --- a/domain/consensus/processes/blockprocessor/validateandinsertblock.go +++ b/domain/consensus/processes/blockprocessor/validateandinsertblock.go @@ -15,20 +15,25 @@ func (bp *blockProcessor) validateAndInsertBlock(block *externalapi.DomainBlock) hash := consensusserialization.HeaderHash(block.Header) if mode.State == externalapi.SyncStateMissingUTXOSet { - headerTipsPruningPoint, err := bp.consensusStateManager.HeaderTipsPruningPoint() - if err != nil { - return err - } + if isHeaderOnlyBlock(block) { + // Allow processing headers while in state SyncStateMissingUTXOSet + mode.State = externalapi.SyncStateHeadersFirst + } else { + headerTipsPruningPoint, err := bp.consensusStateManager.HeaderTipsPruningPoint() + if err != nil { + return err + } - if *hash != *headerTipsPruningPoint { - return errors.Errorf("cannot insert blocks other than the header pruning point "+ - "while in %s mode", mode.State) - } + if *hash != *headerTipsPruningPoint { + return errors.Errorf("cannot insert blocks other than the header pruning point "+ + "while in %s mode", mode.State) + } - mode.State = externalapi.SyncStateMissingBlockBodies + mode.State = externalapi.SyncStateMissingBlockBodies + } } - if mode.State == externalapi.SyncStateHeadersFirst && len(block.Transactions) != 0 { + if mode.State == externalapi.SyncStateHeadersFirst && !isHeaderOnlyBlock(block) { mode.State = externalapi.SyncStateNormal log.Warnf("block %s contains transactions while validating in header only mode", hash) } @@ -138,6 +143,10 @@ func (bp *blockProcessor) updateReachabilityReindexRoot(oldHeadersSelectedTip *e return bp.reachabilityManager.UpdateReindexRoot(headersSelectedTip) } +func isHeaderOnlyBlock(block *externalapi.DomainBlock) bool { + return len(block.Transactions) == 0 +} + func (bp *blockProcessor) checkBlockStatus(hash *externalapi.DomainHash, mode *externalapi.SyncInfo) error { exists, err := bp.blockStatusStore.Exists(bp.databaseContext, hash) if err != nil {