Skip to content

Commit 938f2cd

Browse files
chainimport: add verify mode to verify headers at target height
1 parent afd2906 commit 938f2cd

File tree

2 files changed

+39
-15
lines changed

2 files changed

+39
-15
lines changed

chainimport/headers_import.go

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -341,8 +341,9 @@ func (h *headersImport) validateChainContinuity() error {
341341

342342
// If import includes genesis block (starts at 0), verify it matches.
343343
if importStartHeight == 0 {
344-
err := h.verifyHeadersAtTargetHeight(importStartHeight)
345-
if err != nil {
344+
if err := h.verifyHeadersAtTargetHeight(
345+
importStartHeight, verifyBlockAndFilter,
346+
); err != nil {
346347
return fmt.Errorf("genesis header mismatch: %v", err)
347348
}
348349
log.Infof("Genesis headers verified, import data will extend " +
@@ -374,7 +375,9 @@ func (h *headersImport) validateChainContinuity() error {
374375
// exactly between import and target sources by performing a byte-level
375376
// comparison. It retrieves the header from both sources at the given height and
376377
// verifies they are identical, returning an error if any discrepancy is found.
377-
func (h *headersImport) verifyHeadersAtTargetHeight(height uint32) error {
378+
func (h *headersImport) verifyHeadersAtTargetHeight(height uint32,
379+
verifyMode verifyMode) error {
380+
378381
// Get header metadata from import souces. We can safely use this header
379382
// metadata for both block headers and filter headers since we've
380383
// already validated that those header metadata are compatible with each
@@ -389,18 +392,37 @@ func (h *headersImport) verifyHeadersAtTargetHeight(height uint32) error {
389392
height, headerMetadata.startHeight,
390393
)
391394

392-
if err := h.verifyBlockHeadersAtTargetHeight(
393-
height, importSourceIndex,
394-
); err != nil {
395-
return fmt.Errorf("failed to verify block headers at target "+
396-
"height %d: %w", height, err)
397-
}
395+
switch verifyMode {
396+
case verifyBlockAndFilter:
397+
if err := h.verifyBlockHeadersAtTargetHeight(
398+
height, importSourceIndex,
399+
); err != nil {
400+
return fmt.Errorf("failed to verify block headers at "+
401+
"target height %d: %w", height, err)
402+
}
398403

399-
if err := h.verifyFilterHeadersAtTargetHeight(
400-
height, importSourceIndex,
401-
); err != nil {
402-
return fmt.Errorf("failed to verify filter headers at target "+
403-
"height %d: %w", height, err)
404+
if err := h.verifyFilterHeadersAtTargetHeight(
405+
height, importSourceIndex,
406+
); err != nil {
407+
return fmt.Errorf("failed to verify filter headers at "+
408+
"target height %d: %w", height, err)
409+
}
410+
411+
case verifyBlockOnly:
412+
if err := h.verifyBlockHeadersAtTargetHeight(
413+
height, importSourceIndex,
414+
); err != nil {
415+
return fmt.Errorf("failed to verify block headers at "+
416+
"target height %d: %w", height, err)
417+
}
418+
419+
case verifyFilterOnly:
420+
if err := h.verifyFilterHeadersAtTargetHeight(
421+
height, importSourceIndex,
422+
); err != nil {
423+
return fmt.Errorf("failed to verify filter headers at "+
424+
"target height %d: %w", height, err)
425+
}
404426
}
405427

406428
return nil

chainimport/headers_import_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3773,7 +3773,9 @@ func TestImportAndTargetSourcesHeadersVerificationConstraint(t *testing.T) {
37733773
t.Run(tc.name, func(t *testing.T) {
37743774
prep := tc.prep(tc.height)
37753775
require.NoError(t, prep.err)
3776-
err := prep.hI.verifyHeadersAtTargetHeight(tc.height)
3776+
err := prep.hI.verifyHeadersAtTargetHeight(
3777+
tc.height, verifyBlockAndFilter,
3778+
)
37773779
if tc.expectErr {
37783780
require.ErrorContains(t, err, tc.expectErrMsg)
37793781
return

0 commit comments

Comments
 (0)