core: don't reverify stale headers in addHeader

During networked synchronization we expect there to be a lot of duplicate
headers received and it makes no sense for us reverifying them.
This commit is contained in:
Roman Khimov 2020-03-03 15:34:03 +03:00
parent 3282c6ed41
commit c3e73c5b7d
2 changed files with 15 additions and 2 deletions

View file

@ -333,17 +333,30 @@ func (bc *Blockchain) AddBlock(block *block.Block) error {
} }
// AddHeaders processes the given headers and add them to the // AddHeaders processes the given headers and add them to the
// HeaderHashList. // HeaderHashList. It expects headers to be sorted by index.
func (bc *Blockchain) AddHeaders(headers ...*block.Header) error { func (bc *Blockchain) AddHeaders(headers ...*block.Header) error {
return bc.addHeaders(bc.config.VerifyBlocks, headers...) return bc.addHeaders(bc.config.VerifyBlocks, headers...)
} }
// addHeaders is an internal implementation of AddHeaders (`verify` parameter
// tells it to verify or not verify given headers).
func (bc *Blockchain) addHeaders(verify bool, headers ...*block.Header) (err error) { func (bc *Blockchain) addHeaders(verify bool, headers ...*block.Header) (err error) {
var ( var (
start = time.Now() start = time.Now()
batch = bc.dao.store.Batch() batch = bc.dao.store.Batch()
) )
if len(headers) > 0 {
var i int
curHeight := bc.HeaderHeight()
for i = range headers {
if headers[i].Index > curHeight {
break
}
}
headers = headers[i:]
}
if len(headers) == 0 { if len(headers) == 0 {
return nil return nil
} else if verify { } else if verify {

View file

@ -30,7 +30,7 @@ func TestAddHeaders(t *testing.T) {
assert.Equal(t, h3.Hash(), bc.CurrentHeaderHash()) assert.Equal(t, h3.Hash(), bc.CurrentHeaderHash())
// Add them again, they should not be added. // Add them again, they should not be added.
require.Error(t, bc.AddHeaders(h3, h2, h1)) require.NoError(t, bc.AddHeaders(h3, h2, h1))
assert.Equal(t, h3.Index, bc.HeaderHeight()) assert.Equal(t, h3.Index, bc.HeaderHeight())
assert.Equal(t, uint32(0), bc.BlockHeight()) assert.Equal(t, uint32(0), bc.BlockHeight())