diff --git a/.changelog/unreleased/improvements/2964-skip-revalidation-of-blockstore-LoadBlockFromMeta-.md b/.changelog/unreleased/improvements/2964-skip-revalidation-of-blockstore-LoadBlockFromMeta-.md new file mode 100644 index 0000000000..26fdb6c7ed --- /dev/null +++ b/.changelog/unreleased/improvements/2964-skip-revalidation-of-blockstore-LoadBlockFromMeta-.md @@ -0,0 +1,2 @@ +- `[blockstore]` Remove a redundant `Header.ValidateBasic` call in `LoadBlockMeta`, 75% reducing this time. + ([\#2964](https://github.com/cometbft/cometbft/pull/2964)) \ No newline at end of file diff --git a/store/store.go b/store/store.go index 19583496d0..0d7f5a432d 100644 --- a/store/store.go +++ b/store/store.go @@ -192,7 +192,7 @@ func (bs *BlockStore) LoadBlockMeta(height int64) *types.BlockMeta { panic(fmt.Errorf("unmarshal to cmtproto.BlockMeta: %w", err)) } - blockMeta, err := types.BlockMetaFromProto(pbbm) + blockMeta, err := types.BlockMetaFromTrustedProto(pbbm) if err != nil { panic(fmt.Errorf("error from proto blockMeta: %w", err)) } diff --git a/types/block_meta.go b/types/block_meta.go index d66cc8f36c..9dcefcb34d 100644 --- a/types/block_meta.go +++ b/types/block_meta.go @@ -41,6 +41,14 @@ func (bm *BlockMeta) ToProto() *cmtproto.BlockMeta { } func BlockMetaFromProto(pb *cmtproto.BlockMeta) (*BlockMeta, error) { + bm, err := BlockMetaFromTrustedProto(pb) + if err != nil { + return nil, err + } + return bm, bm.ValidateBasic() +} + +func BlockMetaFromTrustedProto(pb *cmtproto.BlockMeta) (*BlockMeta, error) { if pb == nil { return nil, errors.New("blockmeta is empty") } @@ -62,7 +70,7 @@ func BlockMetaFromProto(pb *cmtproto.BlockMeta) (*BlockMeta, error) { bm.Header = h bm.NumTxs = int(pb.NumTxs) - return bm, bm.ValidateBasic() + return bm, nil } // ValidateBasic performs basic validation. diff --git a/types/block_meta_test.go b/types/block_meta_test.go index b557f284a5..269291d2e9 100644 --- a/types/block_meta_test.go +++ b/types/block_meta_test.go @@ -34,7 +34,7 @@ func TestBlockMeta_ToProto(t *testing.T) { t.Run(tt.testName, func(t *testing.T) { pb := tt.bm.ToProto() - bm, err := BlockMetaFromProto(pb) + bm, err := BlockMetaFromTrustedProto(pb) if !tt.expErr { require.NoError(t, err, tt.testName)