forked from cerc-io/ipld-eth-server
Update price feeds if header changed by validator
- currently not validating price feeds if the underlying header already exists and is valid, since price feeds should have been added when initial header was added
This commit is contained in:
@@ -10,19 +10,21 @@ type HeaderValidator struct {
|
||||
blockChain core.BlockChain
|
||||
headerRepository datastore.HeaderRepository
|
||||
windowSize int
|
||||
transformers []transformers.Transformer
|
||||
}
|
||||
|
||||
func NewHeaderValidator(blockChain core.BlockChain, repository datastore.HeaderRepository, windowSize int) HeaderValidator {
|
||||
func NewHeaderValidator(blockChain core.BlockChain, repository datastore.HeaderRepository, windowSize int, transformers []transformers.Transformer) HeaderValidator {
|
||||
return HeaderValidator{
|
||||
blockChain: blockChain,
|
||||
headerRepository: repository,
|
||||
windowSize: windowSize,
|
||||
transformers: transformers,
|
||||
}
|
||||
}
|
||||
|
||||
func (validator HeaderValidator) ValidateHeaders() ValidationWindow {
|
||||
window := MakeValidationWindow(validator.blockChain, validator.windowSize)
|
||||
blockNumbers := MakeRange(window.LowerBound, window.UpperBound)
|
||||
RetrieveAndUpdateHeaders(validator.blockChain, validator.headerRepository, blockNumbers, []transformers.Transformer{})
|
||||
RetrieveAndUpdateHeaders(validator.blockChain, validator.headerRepository, blockNumbers, validator.transformers)
|
||||
return window
|
||||
}
|
||||
|
||||
@@ -2,8 +2,10 @@ package history_test
|
||||
|
||||
import (
|
||||
. "github.com/onsi/ginkgo"
|
||||
"github.com/vulcanize/vulcanizedb/pkg/core"
|
||||
"github.com/vulcanize/vulcanizedb/pkg/fakes"
|
||||
"github.com/vulcanize/vulcanizedb/pkg/history"
|
||||
"github.com/vulcanize/vulcanizedb/pkg/transformers"
|
||||
"math/big"
|
||||
)
|
||||
|
||||
@@ -13,10 +15,24 @@ var _ = Describe("Header validator", func() {
|
||||
headerRepository.SetMissingBlockNumbers([]int64{})
|
||||
blockChain := fakes.NewMockBlockChain()
|
||||
blockChain.SetLastBlock(big.NewInt(3))
|
||||
validator := history.NewHeaderValidator(blockChain, headerRepository, 2)
|
||||
validator := history.NewHeaderValidator(blockChain, headerRepository, 2, []transformers.Transformer{})
|
||||
|
||||
validator.ValidateHeaders()
|
||||
|
||||
headerRepository.AssertCreateOrUpdateHeaderCallCountAndPassedBlockNumbers(3, []int64{1, 2, 3})
|
||||
})
|
||||
|
||||
It("passes transformers for execution on new blocks", func() {
|
||||
headerRepository := fakes.NewMockHeaderRepository()
|
||||
headerRepository.SetMissingBlockNumbers([]int64{})
|
||||
blockChain := fakes.NewMockBlockChain()
|
||||
blockChain.SetLastBlock(big.NewInt(3))
|
||||
transformer := fakes.NewMockTransformer()
|
||||
validator := history.NewHeaderValidator(blockChain, headerRepository, 1, []transformers.Transformer{transformer})
|
||||
|
||||
validator.ValidateHeaders()
|
||||
|
||||
headerRepository.AssertCreateOrUpdateHeaderCallCountAndPassedBlockNumbers(2, []int64{2, 3})
|
||||
transformer.AssertExecuteCalledWith(core.Header{BlockNumber: 3}, 0)
|
||||
})
|
||||
})
|
||||
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
|
||||
"github.com/vulcanize/vulcanizedb/pkg/core"
|
||||
"github.com/vulcanize/vulcanizedb/pkg/datastore"
|
||||
"github.com/vulcanize/vulcanizedb/pkg/datastore/postgres/repositories"
|
||||
"github.com/vulcanize/vulcanizedb/pkg/transformers"
|
||||
)
|
||||
|
||||
@@ -28,6 +29,9 @@ func RetrieveAndUpdateHeaders(chain core.BlockChain, headerRepository datastore.
|
||||
}
|
||||
id, err := headerRepository.CreateOrUpdateHeader(header)
|
||||
if err != nil {
|
||||
if err == repositories.ErrValidHeaderExists {
|
||||
continue
|
||||
}
|
||||
return 0, err
|
||||
}
|
||||
for _, transformer := range transformers {
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
. "github.com/onsi/gomega"
|
||||
|
||||
"github.com/vulcanize/vulcanizedb/pkg/core"
|
||||
"github.com/vulcanize/vulcanizedb/pkg/datastore/postgres/repositories"
|
||||
"github.com/vulcanize/vulcanizedb/pkg/fakes"
|
||||
"github.com/vulcanize/vulcanizedb/pkg/history"
|
||||
"github.com/vulcanize/vulcanizedb/pkg/transformers"
|
||||
@@ -51,12 +52,26 @@ var _ = Describe("Populating headers", func() {
|
||||
headerRepository.SetCreateOrUpdateHeaderReturnID(headerID)
|
||||
transformer := fakes.NewMockTransformer()
|
||||
|
||||
_, err := history.PopulateMissingHeaders(blockChain, headerRepository, 1, []transformers.Transformer{transformer})
|
||||
_, err := history.PopulateMissingHeaders(blockChain, headerRepository, blockNumber, []transformers.Transformer{transformer})
|
||||
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
transformer.AssertExecuteCalledWith(core.Header{BlockNumber: blockNumber}, headerID)
|
||||
})
|
||||
|
||||
It("does not execute transformer if repository indicates header already exists", func() {
|
||||
blockNumber := int64(54321)
|
||||
blockChain := fakes.NewMockBlockChain()
|
||||
blockChain.SetLastBlock(big.NewInt(blockNumber))
|
||||
headerRepository.SetMissingBlockNumbers([]int64{blockNumber})
|
||||
headerRepository.SetCreateOrUpdateHeaderReturnErr(repositories.ErrValidHeaderExists)
|
||||
transformer := fakes.NewMockTransformer()
|
||||
|
||||
_, err := history.PopulateMissingHeaders(blockChain, headerRepository, blockNumber, []transformers.Transformer{transformer})
|
||||
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
transformer.AssertExecuteNotCalled()
|
||||
})
|
||||
|
||||
It("returns error if executing transformer fails", func() {
|
||||
blockNumber := int64(54321)
|
||||
blockChain := fakes.NewMockBlockChain()
|
||||
@@ -67,7 +82,7 @@ var _ = Describe("Populating headers", func() {
|
||||
transformer := fakes.NewMockTransformer()
|
||||
transformer.SetExecuteErr(fakes.FakeError)
|
||||
|
||||
_, err := history.PopulateMissingHeaders(blockChain, headerRepository, 1, []transformers.Transformer{transformer})
|
||||
_, err := history.PopulateMissingHeaders(blockChain, headerRepository, blockNumber, []transformers.Transformer{transformer})
|
||||
|
||||
Expect(err).To(HaveOccurred())
|
||||
Expect(err).To(MatchError(fakes.FakeError))
|
||||
|
||||
Reference in New Issue
Block a user