diff --git a/consensus/spos/bls/v2/subroundBlock.go b/consensus/spos/bls/v2/subroundBlock.go index 36f62391257..7196d286403 100644 --- a/consensus/spos/bls/v2/subroundBlock.go +++ b/consensus/spos/bls/v2/subroundBlock.go @@ -355,6 +355,10 @@ func (sr *subroundBlock) createHeader() (data.HeaderHandler, error) { } func (sr *subroundBlock) saveProofForPreviousHeaderIfNeeded(header data.HeaderHandler, prevHeader data.HeaderHandler) { + if !common.ShouldBlockHavePrevProof(header, sr.EnableEpochsHandler(), common.EquivalentMessagesFlag) { + return + } + hasProof := sr.EquivalentProofsPool().HasProof(sr.ShardCoordinator().SelfId(), header.GetPrevHash()) if hasProof { log.Debug("saveProofForPreviousHeaderIfNeeded: no need to set proof since it is already saved") diff --git a/dataRetriever/dataPool/headersCache/headersPool.go b/dataRetriever/dataPool/headersCache/headersPool.go index 8b2e044b432..dc8759441c9 100644 --- a/dataRetriever/dataPool/headersCache/headersPool.go +++ b/dataRetriever/dataPool/headersCache/headersPool.go @@ -65,7 +65,7 @@ func (pool *headersPool) AddHeader(headerHash []byte, header data.HeaderHandler) added := pool.cache.addHeader(headerHash, header) if added { - log.Debug("TOREMOVE - added header to pool", "cache ptr", fmt.Sprintf("%p", pool.cache), "header shard", header.GetShardID(), "header nonce", header.GetNonce()) + log.Debug("added header to pool", "header shard", header.GetShardID(), "header nonce", header.GetNonce(), "header hash", headerHash) pool.callAddedDataHandlers(header, headerHash) } } diff --git a/factory/processing/processComponents.go b/factory/processing/processComponents.go index 9fd1d330d19..bfd985b4074 100644 --- a/factory/processing/processComponents.go +++ b/factory/processing/processComponents.go @@ -296,6 +296,7 @@ func (pcf *processComponentsFactory) Create() (*processComponents, error) { FallbackHeaderValidator: fallbackHeaderValidator, EnableEpochsHandler: pcf.coreData.EnableEpochsHandler(), HeadersPool: pcf.data.Datapool().Headers(), + StorageService: pcf.data.StorageService(), } headerSigVerifier, err := headerCheck.NewHeaderSigVerifier(argsHeaderSig) if err != nil { diff --git a/integrationTests/testProcessorNodeWithMultisigner.go b/integrationTests/testProcessorNodeWithMultisigner.go index 7c20b09f349..7603865cc38 100644 --- a/integrationTests/testProcessorNodeWithMultisigner.go +++ b/integrationTests/testProcessorNodeWithMultisigner.go @@ -33,6 +33,7 @@ import ( "github.com/multiversx/mx-chain-go/testscommon/chainParameters" "github.com/multiversx/mx-chain-go/testscommon/cryptoMocks" "github.com/multiversx/mx-chain-go/testscommon/enableEpochsHandlerMock" + "github.com/multiversx/mx-chain-go/testscommon/genericMocks" "github.com/multiversx/mx-chain-go/testscommon/genesisMocks" "github.com/multiversx/mx-chain-go/testscommon/marshallerMock" "github.com/multiversx/mx-chain-go/testscommon/nodeTypeProviderMock" @@ -474,6 +475,7 @@ func CreateNodesWithNodesCoordinatorAndHeaderSigVerifier( FallbackHeaderValidator: &testscommon.FallBackHeaderValidatorStub{}, EnableEpochsHandler: enableEpochsHandlerMock.NewEnableEpochsHandlerStub(), HeadersPool: &mock.HeadersCacherStub{}, + StorageService: &genericMocks.ChainStorerMock{}, } headerSig, _ := headerCheck.NewHeaderSigVerifier(&args) @@ -619,6 +621,7 @@ func CreateNodesWithNodesCoordinatorKeygenAndSingleSigner( FallbackHeaderValidator: &testscommon.FallBackHeaderValidatorStub{}, EnableEpochsHandler: enableEpochsHandlerMock.NewEnableEpochsHandlerStub(), HeadersPool: &mock.HeadersCacherStub{}, + StorageService: &genericMocks.ChainStorerMock{}, } headerSig, _ := headerCheck.NewHeaderSigVerifier(&args) diff --git a/node/chainSimulator/configs/configs.go b/node/chainSimulator/configs/configs.go index 718329381e3..335064ba01e 100644 --- a/node/chainSimulator/configs/configs.go +++ b/node/chainSimulator/configs/configs.go @@ -134,12 +134,14 @@ func CreateChainSimulatorConfigs(args ArgsChainSimulatorConfigs) (*ArgsConfigsSi return nil, err } - configs.GeneralConfig.GeneralSettings.ChainParametersByEpoch[0].ShardMinNumNodes = args.MinNodesPerShard - configs.GeneralConfig.GeneralSettings.ChainParametersByEpoch[0].MetachainMinNumNodes = args.MetaChainMinNodes - configs.GeneralConfig.GeneralSettings.ChainParametersByEpoch[0].MetachainConsensusGroupSize = args.MetaChainConsensusGroupSize - configs.GeneralConfig.GeneralSettings.ChainParametersByEpoch[0].ShardConsensusGroupSize = args.ConsensusGroupSize - configs.GeneralConfig.GeneralSettings.ChainParametersByEpoch[0].RoundDuration = args.RoundDurationInMillis - configs.GeneralConfig.GeneralSettings.ChainParametersByEpoch[0].Hysteresis = args.Hysteresis + for idx := 0; idx < len(configs.GeneralConfig.GeneralSettings.ChainParametersByEpoch); idx++ { + configs.GeneralConfig.GeneralSettings.ChainParametersByEpoch[idx].ShardMinNumNodes = args.MinNodesPerShard + configs.GeneralConfig.GeneralSettings.ChainParametersByEpoch[idx].MetachainMinNumNodes = args.MetaChainMinNodes + configs.GeneralConfig.GeneralSettings.ChainParametersByEpoch[idx].MetachainConsensusGroupSize = args.MetaChainConsensusGroupSize + configs.GeneralConfig.GeneralSettings.ChainParametersByEpoch[idx].ShardConsensusGroupSize = args.ConsensusGroupSize + configs.GeneralConfig.GeneralSettings.ChainParametersByEpoch[idx].RoundDuration = args.RoundDurationInMillis + configs.GeneralConfig.GeneralSettings.ChainParametersByEpoch[idx].Hysteresis = args.Hysteresis + } // TODO[Sorin]: remove this once all equivalent messages PRs are merged configs.EpochConfig.EnableEpochs.EquivalentMessagesEnableEpoch = integrationTests.UnreachableEpoch diff --git a/process/common.go b/process/common.go index 0912bdf153a..0bc06bab14e 100644 --- a/process/common.go +++ b/process/common.go @@ -18,12 +18,13 @@ import ( "github.com/multiversx/mx-chain-core-go/data/typeConverters" "github.com/multiversx/mx-chain-core-go/hashing" "github.com/multiversx/mx-chain-core-go/marshal" + logger "github.com/multiversx/mx-chain-logger-go" + vmcommon "github.com/multiversx/mx-chain-vm-common-go" + "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/dataRetriever" "github.com/multiversx/mx-chain-go/state" "github.com/multiversx/mx-chain-go/storage" - logger "github.com/multiversx/mx-chain-logger-go" - vmcommon "github.com/multiversx/mx-chain-vm-common-go" ) var log = logger.GetOrCreate("process") diff --git a/process/headerCheck/headerSignatureVerify.go b/process/headerCheck/headerSignatureVerify.go index cce3ef6665b..3041fd22ad5 100644 --- a/process/headerCheck/headerSignatureVerify.go +++ b/process/headerCheck/headerSignatureVerify.go @@ -35,6 +35,7 @@ type ArgsHeaderSigVerifier struct { FallbackHeaderValidator process.FallbackHeaderValidator EnableEpochsHandler common.EnableEpochsHandler HeadersPool dataRetriever.HeadersPool + StorageService dataRetriever.StorageService } // HeaderSigVerifier is component used to check if a header is valid @@ -48,6 +49,7 @@ type HeaderSigVerifier struct { fallbackHeaderValidator process.FallbackHeaderValidator enableEpochsHandler common.EnableEpochsHandler headersPool dataRetriever.HeadersPool + storageService dataRetriever.StorageService } // NewHeaderSigVerifier will create a new instance of HeaderSigVerifier @@ -67,6 +69,7 @@ func NewHeaderSigVerifier(arguments *ArgsHeaderSigVerifier) (*HeaderSigVerifier, fallbackHeaderValidator: arguments.FallbackHeaderValidator, enableEpochsHandler: arguments.EnableEpochsHandler, headersPool: arguments.HeadersPool, + storageService: arguments.StorageService, }, nil } @@ -108,6 +111,9 @@ func checkArgsHeaderSigVerifier(arguments *ArgsHeaderSigVerifier) error { if check.IfNil(arguments.HeadersPool) { return process.ErrNilHeadersDataPool } + if check.IfNil(arguments.StorageService) { + return process.ErrNilStorageService + } return nil } @@ -230,6 +236,9 @@ func (hsv *HeaderSigVerifier) VerifySignature(header data.HeaderHandler) error { if hsv.enableEpochsHandler.IsFlagEnabledInEpoch(common.EquivalentMessagesFlag, header.GetEpoch()) { return hsv.VerifyHeaderWithProof(header) } + if prevProof := header.GetPreviousProof(); !check.IfNilReflect(prevProof) { + return ErrProofNotExpected + } headerCopy, err := hsv.copyHeaderWithoutSig(header) if err != nil { @@ -306,9 +315,52 @@ func (hsv *HeaderSigVerifier) VerifyHeaderWithProof(header data.HeaderHandler) e } prevProof := header.GetPreviousProof() + if prevProof.GetIsStartOfEpoch() { + return hsv.verifyHeaderProofAtTransition(prevProof) + } + return hsv.VerifyHeaderProof(prevProof) } +func (hsv *HeaderSigVerifier) getHeaderForProof(proof data.HeaderProofHandler) (data.HeaderHandler, error) { + headerUnit := dataRetriever.GetHeadersDataUnit(proof.GetHeaderShardId()) + headersStorer, err := hsv.storageService.GetStorer(headerUnit) + if err != nil { + return nil, err + } + + return process.GetHeader(proof.GetHeaderHash(), hsv.headersPool, headersStorer, hsv.marshalizer, proof.GetHeaderShardId()) +} + +func (hsv *HeaderSigVerifier) verifyHeaderProofAtTransition(prevProof data.HeaderProofHandler) error { + if check.IfNilReflect(prevProof) { + return process.ErrNilHeaderProof + } + header, err := hsv.getHeaderForProof(prevProof) + if err != nil { + return err + } + + consensusPubKeys, err := hsv.getConsensusSigners( + header.GetPrevRandSeed(), + prevProof.GetHeaderShardId(), + prevProof.GetHeaderEpoch(), + prevProof.GetIsStartOfEpoch(), + prevProof.GetHeaderRound(), + prevProof.GetHeaderHash(), + prevProof.GetPubKeysBitmap()) + if err != nil { + return err + } + + multiSigVerifier, err := hsv.multiSigContainer.GetMultiSigner(prevProof.GetHeaderEpoch()) + if err != nil { + return err + } + + return multiSigVerifier.VerifyAggregatedSig(consensusPubKeys, prevProof.GetHeaderHash(), prevProof.GetAggregatedSignature()) +} + // VerifyHeaderProof checks if the proof is correct for the header func (hsv *HeaderSigVerifier) VerifyHeaderProof(proofHandler data.HeaderProofHandler) error { if check.IfNilReflect(proofHandler) { diff --git a/process/headerCheck/headerSignatureVerify_test.go b/process/headerCheck/headerSignatureVerify_test.go index ffa59035043..95aa451a837 100644 --- a/process/headerCheck/headerSignatureVerify_test.go +++ b/process/headerCheck/headerSignatureVerify_test.go @@ -19,6 +19,7 @@ import ( "github.com/multiversx/mx-chain-go/testscommon" "github.com/multiversx/mx-chain-go/testscommon/cryptoMocks" "github.com/multiversx/mx-chain-go/testscommon/enableEpochsHandlerMock" + "github.com/multiversx/mx-chain-go/testscommon/genericMocks" "github.com/multiversx/mx-chain-go/testscommon/hashingMocks" "github.com/multiversx/mx-chain-go/testscommon/shardingMocks" ) @@ -57,6 +58,7 @@ func createHeaderSigVerifierArgs() *ArgsHeaderSigVerifier { }, nil }, }, + StorageService: &genericMocks.ChainStorerMock{}, } }