diff --git a/app/protocol/flows/v5/blockrelay/ibd_with_headers_proof.go b/app/protocol/flows/v5/blockrelay/ibd_with_headers_proof.go index 885f7f062..707eb6284 100644 --- a/app/protocol/flows/v5/blockrelay/ibd_with_headers_proof.go +++ b/app/protocol/flows/v5/blockrelay/ibd_with_headers_proof.go @@ -14,7 +14,7 @@ import ( func (flow *handleIBDFlow) ibdWithHeadersProof( syncerHeaderSelectedTipHash, relayBlockHash *externalapi.DomainHash, highBlockDAAScore uint64) error { - err := flow.Domain().InitStagingConsensus() + err := flow.Domain().InitStagingConsensusWithoutGenesis() if err != nil { return err } diff --git a/app/rpc/rpchandlers/get_blocks_test.go b/app/rpc/rpchandlers/get_blocks_test.go index 05caf6aa2..73a2bdca9 100644 --- a/app/rpc/rpchandlers/get_blocks_test.go +++ b/app/rpc/rpchandlers/get_blocks_test.go @@ -31,7 +31,7 @@ func (d fakeDomain) StagingConsensus() externalapi.Consensus { panic("implement me") } -func (d fakeDomain) InitStagingConsensus() error { +func (d fakeDomain) InitStagingConsensusWithoutGenesis() error { panic("implement me") } diff --git a/domain/consensus/processes/pruningproofmanager/pruningproofmanager.go b/domain/consensus/processes/pruningproofmanager/pruningproofmanager.go index b735cedf1..700a9a827 100644 --- a/domain/consensus/processes/pruningproofmanager/pruningproofmanager.go +++ b/domain/consensus/processes/pruningproofmanager/pruningproofmanager.go @@ -264,9 +264,15 @@ func (ppm *pruningProofManager) buildPruningPointProof(stagingArea *model.Stagin return nil, err } - err = queue.PushSlice(children) - if err != nil { - return nil, err + for _, child := range children { + if child.Equal(model.VirtualBlockHash) { + continue + } + + err = queue.Push(child) + if err != nil { + return nil, err + } } } diff --git a/domain/domain.go b/domain/domain.go index 066e17197..161bf1c36 100644 --- a/domain/domain.go +++ b/domain/domain.go @@ -21,7 +21,7 @@ type Domain interface { MiningManager() miningmanager.MiningManager Consensus() externalapi.Consensus StagingConsensus() externalapi.Consensus - InitStagingConsensus() error + InitStagingConsensusWithoutGenesis() error CommitStagingConsensus() error DeleteStagingConsensus() error } @@ -49,7 +49,13 @@ func (d *domain) MiningManager() miningmanager.MiningManager { return d.miningManager } -func (d *domain) InitStagingConsensus() error { +func (d *domain) InitStagingConsensusWithoutGenesis() error { + cfg := *d.consensusConfig + cfg.SkipAddingGenesis = true + return d.initStagingConsensus(&cfg) +} + +func (d *domain) initStagingConsensus(cfg *consensus.Config) error { d.stagingConsensusLock.Lock() defer d.stagingConsensusLock.Unlock() @@ -79,10 +85,8 @@ func (d *domain) InitStagingConsensus() error { } consensusFactory := consensus.NewFactory() - cfg := *d.consensusConfig - cfg.SkipAddingGenesis = true - consensusInstance, shouldMigrate, err := consensusFactory.NewConsensus(&cfg, d.db, inactivePrefix) + consensusInstance, shouldMigrate, err := consensusFactory.NewConsensus(cfg, d.db, inactivePrefix) if err != nil { return err } diff --git a/domain/domain_test.go b/domain/domain_test.go index 285186d85..0ec107be5 100644 --- a/domain/domain_test.go +++ b/domain/domain_test.go @@ -36,12 +36,12 @@ func TestCreateStagingConsensus(t *testing.T) { t.Fatalf("New: %+v", err) } - err = domainInstance.InitStagingConsensus() + err = domainInstance.InitStagingConsensusWithoutGenesis() if err != nil { - t.Fatalf("InitStagingConsensus: %+v", err) + t.Fatalf("InitStagingConsensusWithoutGenesis: %+v", err) } - err = domainInstance.InitStagingConsensus() + err = domainInstance.InitStagingConsensusWithoutGenesis() if !strings.Contains(err.Error(), "cannot create staging consensus when a staging consensus already exists") { t.Fatalf("unexpected error: %+v", err) } @@ -114,9 +114,9 @@ func TestCreateStagingConsensus(t *testing.T) { // Now we create a new staging consensus and check that it's deleted once we init a new domain. We also // validate that the main consensus persisted the data from the committed temp consensus. - err = domainInstance.InitStagingConsensus() + err = domainInstance.InitStagingConsensusWithoutGenesis() if err != nil { - t.Fatalf("InitStagingConsensus: %+v", err) + t.Fatalf("InitStagingConsensusWithoutGenesis: %+v", err) } addGenesisToStagingConsensus() @@ -139,9 +139,9 @@ func TestCreateStagingConsensus(t *testing.T) { t.Fatalf("a block from committed staging consensus was not persisted to the active consensus") } - err = domainInstance2.InitStagingConsensus() + err = domainInstance2.InitStagingConsensusWithoutGenesis() if err != nil { - t.Fatalf("InitStagingConsensus: %+v", err) + t.Fatalf("InitStagingConsensusWithoutGenesis: %+v", err) } blockInfo, err = domainInstance2.StagingConsensus().GetBlockInfo(blockHash) diff --git a/domain/migrate.go b/domain/migrate.go index 45a68d7b2..d3178aca4 100644 --- a/domain/migrate.go +++ b/domain/migrate.go @@ -7,14 +7,26 @@ import ( func (d *domain) migrate() error { log.Infof("Starting migration") - err := d.InitStagingConsensus() + pruningPoint, err := d.Consensus().PruningPoint() if err != nil { return err } - err = syncConsensuses(d.Consensus(), d.StagingConsensus()) - if err != nil { - return err + if d.consensusConfig.Params.GenesisHash.Equal(pruningPoint) { + err = d.initStagingConsensus(d.consensusConfig) + if err != nil { + return err + } + } else { + err = d.InitStagingConsensusWithoutGenesis() + if err != nil { + return err + } + + err = syncConsensuses(d.Consensus(), d.StagingConsensus()) + if err != nil { + return err + } } err = d.CommitStagingConsensus() @@ -201,7 +213,11 @@ func syncConsensuses(syncer, syncee externalapi.Consensus) error { return err } - virtualDAAScoreStart := uint64(0) + virtualDAAScoreStart, err := syncee.GetVirtualDAAScore() + if err != nil { + return err + } + percents = 0 for i := 0; ; i++ { if i%10 == 0 {