diff --git a/concordium-base b/concordium-base index 06272c3080..23f2746ee6 160000 --- a/concordium-base +++ b/concordium-base @@ -1 +1 @@ -Subproject commit 06272c30809c5b94cd29e9f4db326ef5ded04b70 +Subproject commit 23f2746ee611d755e8249b9c9f9a09a52f5d6c4b diff --git a/concordium-consensus/src/Concordium/GlobalState/DummyData.hs b/concordium-consensus/src/Concordium/GlobalState/DummyData.hs index 749630516c..41a3d9dfaa 100644 --- a/concordium-consensus/src/Concordium/GlobalState/DummyData.hs +++ b/concordium-consensus/src/Concordium/GlobalState/DummyData.hs @@ -364,6 +364,14 @@ dummyFinalizationCommitteeParameters = _fcpFinalizerRelativeStakeThreshold = PartsPerHundredThousands 10000 } +-- | Dummy validator score parameters for the second consensus protocol. +dummyValidatorScoreParameters :: ValidatorScoreParameters +dummyValidatorScoreParameters = + ValidatorScoreParameters + { -- Maximal number of missed rounds before a validator gets suspended. + _vspMaxMissedRounds = 1 + } + dummyChainParameters :: forall cpv. (IsChainParametersVersion cpv) => ChainParameters' cpv dummyChainParameters = case chainParametersVersion @cpv of SChainParametersV0 -> @@ -382,7 +390,8 @@ dummyChainParameters = case chainParametersVersion @cpv of PoolParametersV0 { _ppBakerStakeThreshold = 300000000000 }, - _cpFinalizationCommitteeParameters = NoParam + _cpFinalizationCommitteeParameters = NoParam, + _cpValidatorScoreParameters = NoParam } SChainParametersV1 -> ChainParameters @@ -420,7 +429,8 @@ dummyChainParameters = case chainParametersVersion @cpv of _transactionCommissionRange = fullRange } }, - _cpFinalizationCommitteeParameters = NoParam + _cpFinalizationCommitteeParameters = NoParam, + _cpValidatorScoreParameters = NoParam } SChainParametersV2 -> ChainParameters @@ -458,7 +468,8 @@ dummyChainParameters = case chainParametersVersion @cpv of _transactionCommissionRange = fullRange } }, - _cpFinalizationCommitteeParameters = SomeParam dummyFinalizationCommitteeParameters + _cpFinalizationCommitteeParameters = SomeParam dummyFinalizationCommitteeParameters, + _cpValidatorScoreParameters = NoParam } SChainParametersV3 -> ChainParameters @@ -496,7 +507,8 @@ dummyChainParameters = case chainParametersVersion @cpv of _transactionCommissionRange = fullRange } }, - _cpFinalizationCommitteeParameters = SomeParam dummyFinalizationCommitteeParameters + _cpFinalizationCommitteeParameters = SomeParam dummyFinalizationCommitteeParameters, + _cpValidatorScoreParameters = SomeParam dummyValidatorScoreParameters } where fullRange = InclusiveRange (makeAmountFraction 0) (makeAmountFraction 100000) diff --git a/concordium-consensus/src/Concordium/GlobalState/Parameters.hs b/concordium-consensus/src/Concordium/GlobalState/Parameters.hs index 834c1c7f25..f00c6ce1ba 100644 --- a/concordium-consensus/src/Concordium/GlobalState/Parameters.hs +++ b/concordium-consensus/src/Concordium/GlobalState/Parameters.hs @@ -187,6 +187,8 @@ data UpdateValue (cpv :: ChainParametersVersion) where UVBlockEnergyLimit :: (IsSupported 'PTBlockEnergyLimit cpv ~ 'True) => !Energy -> UpdateValue cpv -- | Updates to the finalization committee parameters for chain parameters version 2. UVFinalizationCommitteeParameters :: (IsSupported 'PTFinalizationCommitteeParameters cpv ~ 'True) => !FinalizationCommitteeParameters -> UpdateValue cpv + -- | Updates to the validator score parameters for chain parameters version 3. + UVValidatorScoreParameters :: (IsSupported 'PTValidatorScoreParameters cpv ~ 'True) => !ValidatorScoreParameters -> UpdateValue cpv deriving instance Eq (UpdateValue cpv) deriving instance Show (UpdateValue cpv) diff --git a/concordium-consensus/src/Concordium/GlobalState/Persistent/BlobStore.hs b/concordium-consensus/src/Concordium/GlobalState/Persistent/BlobStore.hs index 7850fd6461..138f320a06 100644 --- a/concordium-consensus/src/Concordium/GlobalState/Persistent/BlobStore.hs +++ b/concordium-consensus/src/Concordium/GlobalState/Persistent/BlobStore.hs @@ -1563,6 +1563,7 @@ instance (MonadBlobStore m, IsCooldownParametersVersion cpv) => BlobStorable m ( instance (MonadBlobStore m) => BlobStorable m Parameters.TimeParameters instance (MonadBlobStore m) => BlobStorable m Parameters.TimeoutParameters instance (MonadBlobStore m) => BlobStorable m Parameters.FinalizationCommitteeParameters +instance (MonadBlobStore m) => BlobStorable m Parameters.ValidatorScoreParameters instance (MonadBlobStore m) => BlobStorable m Duration instance (MonadBlobStore m) => BlobStorable m Energy instance (MonadBlobStore m) => BlobStorable m (Map AccountAddress Timestamp) diff --git a/concordium-consensus/src/Concordium/GlobalState/Persistent/BlockState.hs b/concordium-consensus/src/Concordium/GlobalState/Persistent/BlockState.hs index be7e964934..6b7cd626db 100644 --- a/concordium-consensus/src/Concordium/GlobalState/Persistent/BlockState.hs +++ b/concordium-consensus/src/Concordium/GlobalState/Persistent/BlockState.hs @@ -71,6 +71,7 @@ import qualified Concordium.GlobalState.Persistent.LFMBTree as LFMBT import Concordium.GlobalState.Persistent.PoolRewards import Concordium.GlobalState.Persistent.ReleaseSchedule import qualified Concordium.GlobalState.Persistent.Trie as Trie +import Concordium.GlobalState.PoolRewards import qualified Concordium.GlobalState.Rewards as Rewards import qualified Concordium.GlobalState.TransactionTable as TransactionTable import Concordium.GlobalState.Types @@ -1867,7 +1868,11 @@ newUpdateValidator pbs curTimestamp ai vu@ValidatorUpdate{..} = do case sSupportsValidatorSuspension (accountVersion @(AccountVersionFor pv)) of STrue -> do acc1 <- setAccountValidatorSuspended suspend acc - MTL.tell [if suspend then BakerConfigureSuspended else BakerConfigureResumed] + MTL.tell + [ if suspend + then BakerConfigureSuspended + else BakerConfigureResumed + ] return (bsp, acc1) SFalse -> return (bsp, acc) updateKeys oldBaker = ifPresent vuKeys $ \keys (bsp, acc) -> do @@ -3492,7 +3497,13 @@ doUpdateMissedRounds pbs rds = do modifyBakerPoolRewardDetailsInPoolRewards bsp0 bId - (\bprd -> bprd{missedRounds = (+ newMissedRounds) <$> missedRounds bprd}) + ( \bprd -> + bprd + { suspensionInfo = + (\SuspensionInfo{..} -> SuspensionInfo{missedRounds = missedRounds + newMissedRounds, ..}) + <$> suspensionInfo bprd + } + ) ) bsp (Map.toList rds) @@ -3694,7 +3705,7 @@ doNotifyBlockBaked pbs bid = do let incBPR bpr = bpr { blockCount = blockCount bpr + 1, - missedRounds = 0 <$ missedRounds bpr + suspensionInfo = emptySuspensionInfo <$ suspensionInfo bpr } in storePBS pbs =<< modifyBakerPoolRewardDetailsInPoolRewards bsp bid incBPR @@ -3735,7 +3746,7 @@ doMarkFinalizationAwakeBakers pbs bids = do ( (), bpr { finalizationAwake = True, - missedRounds = 0 <$ missedRounds bpr + suspensionInfo = emptySuspensionInfo <$ suspensionInfo bpr } ) diff --git a/concordium-consensus/src/Concordium/GlobalState/Persistent/BlockState/Updates.hs b/concordium-consensus/src/Concordium/GlobalState/Persistent/BlockState/Updates.hs index e824aeb0f7..8c52e0661d 100644 --- a/concordium-consensus/src/Concordium/GlobalState/Persistent/BlockState/Updates.hs +++ b/concordium-consensus/src/Concordium/GlobalState/Persistent/BlockState/Updates.hs @@ -242,7 +242,9 @@ data PendingUpdates (cpv :: ChainParametersVersion) = PendingUpdates -- | Block energy limit (CPV2 onwards). pBlockEnergyLimitQueue :: !(HashedBufferedRefO 'PTBlockEnergyLimit cpv (UpdateQueue Energy)), -- | Finalization committee parameters (CPV2 onwards). - pFinalizationCommitteeParametersQueue :: !(HashedBufferedRefO 'PTFinalizationCommitteeParameters cpv (UpdateQueue FinalizationCommitteeParameters)) + pFinalizationCommitteeParametersQueue :: !(HashedBufferedRefO 'PTFinalizationCommitteeParameters cpv (UpdateQueue FinalizationCommitteeParameters)), + -- | Validators score parameters (CPV3 onwards). + pValidatorScoreParametersQueue :: !(HashedBufferedRefO 'PTValidatorScoreParameters cpv (UpdateQueue ValidatorScoreParameters)) } -- | See documentation of @migratePersistentBlockState@. @@ -422,6 +424,25 @@ migratePendingUpdates migration PendingUpdates{..} = withCPVConstraints (chainPa SomeParam hbr -> SomeParam <$> migrateHashedBufferedRef (migrateUpdateQueue id) hbr StateMigrationParametersP7ToP8{} -> case pFinalizationCommitteeParametersQueue of SomeParam hbr -> SomeParam <$> migrateHashedBufferedRef (migrateUpdateQueue id) hbr + newValidatorScoreParametersQueue <- case migration of + StateMigrationParametersTrivial -> case pValidatorScoreParametersQueue of + NoParam -> return NoParam + SomeParam hbr -> SomeParam <$> migrateHashedBufferedRef (migrateUpdateQueue id) hbr + StateMigrationParametersP1P2 -> case pValidatorScoreParametersQueue of + NoParam -> return NoParam + StateMigrationParametersP2P3 -> case pValidatorScoreParametersQueue of + NoParam -> return NoParam + StateMigrationParametersP3ToP4{} -> case pValidatorScoreParametersQueue of + NoParam -> return NoParam + StateMigrationParametersP4ToP5{} -> case pValidatorScoreParametersQueue of + NoParam -> return NoParam + StateMigrationParametersP5ToP6{} -> case pValidatorScoreParametersQueue of + NoParam -> return NoParam + StateMigrationParametersP6ToP7{} -> case pValidatorScoreParametersQueue of + NoParam -> return NoParam + StateMigrationParametersP7ToP8{} -> do + (!hbr, _) <- refFlush =<< refMake emptyUpdateQueue + return (SomeParam hbr) return $! PendingUpdates { pRootKeysUpdateQueue = newRootKeys, @@ -443,7 +464,8 @@ migratePendingUpdates migration PendingUpdates{..} = withCPVConstraints (chainPa pTimeoutParametersQueue = newTimeoutParameters, pMinBlockTimeQueue = newMinBlockTimeQueue, pBlockEnergyLimitQueue = newBlockEnergyLimitQueue, - pFinalizationCommitteeParametersQueue = newFinalizationCommitteeParametersQueue + pFinalizationCommitteeParametersQueue = newFinalizationCommitteeParametersQueue, + pValidatorScoreParametersQueue = newValidatorScoreParametersQueue } instance @@ -522,6 +544,7 @@ instance (putMinBlockTimeQueue, newMinBlockTimeQueue) <- storeUpdate pMinBlockTimeQueue (putBlockEnergyLimitQueue, newBlockEnergyLimitQueue) <- storeUpdate pBlockEnergyLimitQueue (putFinalizationCommitteeParametersQueue, newFinalizationCommitteeParametersQueue) <- storeUpdate pFinalizationCommitteeParametersQueue + (putValidatorScoreParametersQueue, newValidatorScoreParametersQueue) <- storeUpdate pValidatorScoreParametersQueue let newPU = PendingUpdates { pRootKeysUpdateQueue = rkQ, @@ -543,7 +566,8 @@ instance pTimeoutParametersQueue = newTimeoutParametersQueue, pMinBlockTimeQueue = newMinBlockTimeQueue, pBlockEnergyLimitQueue = newBlockEnergyLimitQueue, - pFinalizationCommitteeParametersQueue = newFinalizationCommitteeParametersQueue + pFinalizationCommitteeParametersQueue = newFinalizationCommitteeParametersQueue, + pValidatorScoreParametersQueue = newValidatorScoreParametersQueue } let putPU = pRKQ @@ -566,6 +590,7 @@ instance >> putMinBlockTimeQueue >> putBlockEnergyLimitQueue >> putFinalizationCommitteeParametersQueue + >> putValidatorScoreParametersQueue return (putPU, newPU) load = withCPVConstraints (chainParametersVersion @cpv) $ do mRKQ <- label "Root keys update queue" load @@ -588,6 +613,7 @@ instance mMinBlockTimeQueue <- label "Minimum block time update queue" load mBlockEnergyLimitQueue <- label "Block energy limit update queue" load mFinalizationCommitteeParametersQueue <- label "Finalization committee parameters update queue" load + mValidatorScoreParametersQueue <- label "Validator score parameters update queue" load return $! do pRootKeysUpdateQueue <- mRKQ pLevel1KeysUpdateQueue <- mL1KQ @@ -609,6 +635,7 @@ instance pMinBlockTimeQueue <- mMinBlockTimeQueue pBlockEnergyLimitQueue <- mBlockEnergyLimitQueue pFinalizationCommitteeParametersQueue <- mFinalizationCommitteeParametersQueue + pValidatorScoreParametersQueue <- mValidatorScoreParametersQueue return PendingUpdates{..} instance @@ -638,6 +665,7 @@ instance <*> cache pMinBlockTimeQueue <*> cache pBlockEnergyLimitQueue <*> cache pFinalizationCommitteeParametersQueue + <*> cache pValidatorScoreParametersQueue where cpv = chainParametersVersion @cpv @@ -646,7 +674,7 @@ emptyPendingUpdates :: forall m cpv. (MonadBlobStore m, IsChainParametersVersion cpv) => m (PendingUpdates cpv) -emptyPendingUpdates = PendingUpdates <$> e <*> e <*> e <*> e <*> whenSupportedA e <*> e <*> e <*> e <*> e <*> e <*> e <*> e <*> e <*> e <*> whenSupportedA e <*> whenSupportedA e <*> whenSupportedA e <*> whenSupportedA e <*> whenSupportedA e <*> whenSupportedA e +emptyPendingUpdates = PendingUpdates <$> e <*> e <*> e <*> e <*> whenSupportedA e <*> e <*> e <*> e <*> e <*> e <*> e <*> e <*> e <*> e <*> whenSupportedA e <*> whenSupportedA e <*> whenSupportedA e <*> whenSupportedA e <*> whenSupportedA e <*> whenSupportedA e <*> whenSupportedA e where e :: m (HashedBufferedRef (UpdateQueue a)) e = makeHashedBufferedRef emptyUpdateQueue @@ -678,6 +706,7 @@ makePersistentPendingUpdates UQ.PendingUpdates{..} = withCPVConstraints (chainPa pMinBlockTimeQueue <- mapM (refMake <=< makePersistentUpdateQueue) _pMinBlockTimeQueue pBlockEnergyLimitQueue <- mapM (refMake <=< makePersistentUpdateQueue) _pBlockEnergyLimitQueue pFinalizationCommitteeParametersQueue <- mapM (refMake <=< makePersistentUpdateQueue) _pFinalizationCommitteeParametersQueue + pValidatorScoreParametersQueue <- mapM (refMake <=< makePersistentUpdateQueue) _pValidatorScoreParametersQueue return PendingUpdates{..} -- | Convert a persistent 'PendingUpdates' to an in-memory 'UQ.PendingUpdates'. @@ -707,6 +736,7 @@ makeBasicPendingUpdates PendingUpdates{..} = withCPVConstraints (chainParameters _pMinBlockTimeQueue <- mapM (makeBasicUpdateQueue <=< refLoad) pMinBlockTimeQueue _pBlockEnergyLimitQueue <- mapM (makeBasicUpdateQueue <=< refLoad) pBlockEnergyLimitQueue _pFinalizationCommitteeParametersQueue <- mapM (makeBasicUpdateQueue <=< refLoad) pFinalizationCommitteeParametersQueue + _pValidatorScoreParametersQueue <- mapM (makeBasicUpdateQueue <=< refLoad) pValidatorScoreParametersQueue return UQ.PendingUpdates{..} -- | Current state of updatable parameters and update queues. @@ -1294,6 +1324,38 @@ processFinalizationCommitteeParametersUpdates t bu = do pendingUpdates = pendingUpdates{pFinalizationCommitteeParametersQueue = SomeParam newpQ} } +-- | Process validator score parameters updates. +-- If the validator score parameters are supported then +-- update them (if an update was enqueued and its time is now) +-- and update the 'pendingUpdates' accordingly. +processValidationScoreParametersUpdates :: + forall m cpv. + (MonadBlobStore m, IsChainParametersVersion cpv) => + Timestamp -> + BufferedRef (Updates' cpv) -> + m (Map.Map TransactionTime (UpdateValue cpv), BufferedRef (Updates' cpv)) +processValidationScoreParametersUpdates t bu = do + u@Updates{..} <- refLoad bu + case pValidatorScoreParametersQueue pendingUpdates of + NoParam -> return (Map.empty, bu) + SomeParam qref -> do + oldQ <- refLoad qref + processValueUpdates t oldQ (return (Map.empty, bu)) $ \newBELp newQ m -> + (UVValidatorScoreParameters <$> m,) <$> do + newpQ <- refMake newQ + StoreSerialized oldCP <- refLoad currentParameters + StoreSerialized newValidatorScoreParameters <- refLoad newBELp + newParameters <- + refMake $ + StoreSerialized $ + oldCP + & (cpValidatorScoreParameters . supportedOParam .~ newValidatorScoreParameters) + refMake + u + { currentParameters = newParameters, + pendingUpdates = pendingUpdates{pValidatorScoreParametersQueue = SomeParam newpQ} + } + -- | Process the add anonymity revoker update queue. -- Ignores updates with duplicate ARs. processAddAnonymityRevokerUpdates :: @@ -1444,7 +1506,8 @@ processUpdateQueues t (u0, ars, ips) = do processTimeoutParametersUpdates t, processMinBlockTimeUpdates t, processBlockEnergyLimitUpdates t, - processFinalizationCommitteeParametersUpdates t + processFinalizationCommitteeParametersUpdates t, + processValidationScoreParametersUpdates t ] -- AR and IP updates are handled separately to avoid adding the large objects to the 'Updates' types. @@ -1583,6 +1646,11 @@ lookupNextUpdateSequenceNumber uref uty = withCPVConstraints (chainParametersVer (pure minUpdateSequenceNumber) (fmap uqNextSequenceNumber . refLoad) (pFinalizationCommitteeParametersQueue pendingUpdates) + UpdateValidatorScoreParameters -> + maybeWhenSupported + (pure minUpdateSequenceNumber) + (fmap uqNextSequenceNumber . refLoad) + (pValidatorScoreParametersQueue pendingUpdates) -- | Enqueue an update in the appropriate queue. enqueueUpdate :: @@ -1635,6 +1703,10 @@ enqueueUpdate effectiveTime payload uref = withCPVConstraints (chainParametersVe SomeParam q -> enqueue effectiveTime v q <&> \newQ -> p{pFinalizationCommitteeParametersQueue = SomeParam newQ} + UVValidatorScoreParameters v -> case pValidatorScoreParametersQueue of + SomeParam q -> + enqueue effectiveTime v q + <&> \newQ -> p{pValidatorScoreParametersQueue = SomeParam newQ} refMake u{pendingUpdates = newPendingUpdates} -- | Overwrite the election difficulty with the specified value and remove diff --git a/concordium-consensus/src/Concordium/GlobalState/Persistent/PoolRewards.hs b/concordium-consensus/src/Concordium/GlobalState/Persistent/PoolRewards.hs index add62a8cf0..a7c774e8ee 100644 --- a/concordium-consensus/src/Concordium/GlobalState/Persistent/PoolRewards.hs +++ b/concordium-consensus/src/Concordium/GlobalState/Persistent/PoolRewards.hs @@ -147,7 +147,7 @@ migratePoolRewardsP1 curBakers nextBakers blockCounts npEpoch npMintRate = do { blockCount = Map.findWithDefault 0 bid blockCounts, transactionFeesAccrued = 0, finalizationAwake = False, - missedRounds = conditionally hasValidatorSuspension 0 + suspensionInfo = conditionally hasValidatorSuspension emptySuspensionInfo } (!newRef, _) <- refFlush =<< refMake bprd return newRef @@ -295,7 +295,7 @@ rotateCapitalDistribution oldPoolRewards = do buildRewardDetails (newId : newIds) (oldId : oldIds) (r : rs) = case compare newId oldId of LT -> emptyBakerPoolRewardDetails : buildRewardDetails newIds (oldId : oldIds) (r : rs) EQ -> - (emptyBakerPoolRewardDetails @av){missedRounds = missedRounds r} + (emptyBakerPoolRewardDetails @av){suspensionInfo = suspensionInfo r} : buildRewardDetails newIds oldIds rs GT -> buildRewardDetails (newId : newIds) oldIds rs buildRewardDetails _ _ _ = diff --git a/concordium-consensus/src/Concordium/GlobalState/PoolRewards.hs b/concordium-consensus/src/Concordium/GlobalState/PoolRewards.hs index e15d058fd0..19daf0117d 100644 --- a/concordium-consensus/src/Concordium/GlobalState/PoolRewards.hs +++ b/concordium-consensus/src/Concordium/GlobalState/PoolRewards.hs @@ -15,6 +15,28 @@ import Concordium.Types.Conditionally import Concordium.Types.HashableTo import Concordium.Utils.Serialization +-- | Information needed to determine whether to suspend a validator. +data SuspensionInfo = SuspensionInfo + { -- | The number of missed rounds since the validator most recently + -- became a (non-suspended) member of the validator committee. + missedRounds :: !Word64, + -- | Flag indicating that the validator should be suspended at the coming + -- snapshot epoch, because its missed rounds have crossed the threshold + -- given in the chain parameters in the previous reward period. + primedForSuspension :: !Bool + } + deriving (Eq, Show) + +emptySuspensionInfo :: SuspensionInfo +emptySuspensionInfo = SuspensionInfo{missedRounds = 0, primedForSuspension = False} + +instance Serialize SuspensionInfo where + put SuspensionInfo{..} = do + putWord64be missedRounds + putBool primedForSuspension + get = + SuspensionInfo <$> get <*> getBool + -- | 'BakerPoolRewardDetails' tracks the rewards that have been earned by a baker pool in the current -- reward period. These are used to pay out the rewards at the payday. data BakerPoolRewardDetails (av :: AccountVersion) = BakerPoolRewardDetails @@ -24,8 +46,8 @@ data BakerPoolRewardDetails (av :: AccountVersion) = BakerPoolRewardDetails transactionFeesAccrued :: !Amount, -- | Whether the pool contributed to a finalization proof in the reward period finalizationAwake :: !Bool, - -- | The number of missed rounds in the reward period - missedRounds :: !(Conditionally (SupportsValidatorSuspension av) Word64) + -- | Information for deciding whether a validator will be suspended at the next snapshot epoch. + suspensionInfo :: !(Conditionally (SupportsValidatorSuspension av) SuspensionInfo) } deriving (Eq, Show) @@ -34,7 +56,7 @@ instance forall av. (IsAccountVersion av) => Serialize (BakerPoolRewardDetails a putWord64be blockCount put transactionFeesAccrued putBool finalizationAwake - mapM_ putWord64be missedRounds + mapM_ put suspensionInfo get = BakerPoolRewardDetails @@ -55,7 +77,8 @@ emptyBakerPoolRewardDetails = { blockCount = 0, transactionFeesAccrued = 0, finalizationAwake = False, - missedRounds = conditionally (sSupportsValidatorSuspension (accountVersion @av)) 0 + suspensionInfo = + conditionally (sSupportsValidatorSuspension (accountVersion @av)) emptySuspensionInfo } -- | Migrate BakerPoolRewardDetails with different account versions. @@ -66,9 +89,9 @@ migrateBakerPoolRewardDetails :: BakerPoolRewardDetails av1 migrateBakerPoolRewardDetails BakerPoolRewardDetails{..} = BakerPoolRewardDetails - { missedRounds = + { suspensionInfo = conditionally (sSupportsValidatorSuspension (accountVersion @av1)) - (fromCondDef missedRounds 0), + (fromCondDef suspensionInfo emptySuspensionInfo), .. } diff --git a/concordium-consensus/src/Concordium/Scheduler.hs b/concordium-consensus/src/Concordium/Scheduler.hs index 352fd130fc..eedd34c331 100644 --- a/concordium-consensus/src/Concordium/Scheduler.hs +++ b/concordium-consensus/src/Concordium/Scheduler.hs @@ -2241,8 +2241,8 @@ handleConfigureBaker BakerSetBakingRewardCommission bid senderAddress bakingRewardCommission BI.BakerConfigureFinalizationRewardCommission finalizationRewardCommission -> BakerSetFinalizationRewardCommission bid senderAddress finalizationRewardCommission - BI.BakerConfigureSuspended -> BakerSuspended bid - BI.BakerConfigureResumed -> BakerResumed bid + BI.BakerConfigureSuspended -> BakerSuspended bid senderAddress + BI.BakerConfigureResumed -> BakerResumed bid senderAddress rejectResult failure = TxReject $! case failure of BI.VCFStakeUnderThreshold -> StakeUnderMinimumThresholdForBaking @@ -2745,6 +2745,9 @@ handleChainUpdate (WithMetadata{wmdData = ui@UpdateInstruction{..}, ..}, mVerRes FinalizationCommitteeParametersUpdatePayload u -> case sIsSupported SPTFinalizationCommitteeParameters scpv of STrue -> checkSigAndEnqueue $ UVFinalizationCommitteeParameters u SFalse -> return $ TxInvalid NotSupportedAtCurrentProtocolVersion + ValidatorScoreParametersUpdatePayload u -> case sIsSupported SPTValidatorScoreParameters scpv of + STrue -> checkSigAndEnqueue $ UVValidatorScoreParameters u + SFalse -> return $ TxInvalid NotSupportedAtCurrentProtocolVersion where scpv :: SChainParametersVersion (ChainParametersVersionFor (MPV m)) scpv = chainParametersVersion diff --git a/concordium-consensus/test-runners/app/Main.hs b/concordium-consensus/test-runners/app/Main.hs index c4bcece813..143eff4252 100644 --- a/concordium-consensus/test-runners/app/Main.hs +++ b/concordium-consensus/test-runners/app/Main.hs @@ -342,7 +342,8 @@ main = do PoolParametersV0 { _ppBakerStakeThreshold = 300000000000 }, - _cpFinalizationCommitteeParameters = NoParam + _cpFinalizationCommitteeParameters = NoParam, + _cpValidatorScoreParameters = NoParam } let (genesisData, bakerIdentities, _) = makeGenesisDataV0 @PV diff --git a/concordium-consensus/test-runners/catchup/Main.hs b/concordium-consensus/test-runners/catchup/Main.hs index 051251a2a1..15de0952f3 100644 --- a/concordium-consensus/test-runners/catchup/Main.hs +++ b/concordium-consensus/test-runners/catchup/Main.hs @@ -371,7 +371,8 @@ main = do PoolParametersV0 { _ppBakerStakeThreshold = 300000000000 }, - _cpFinalizationCommitteeParameters = NoParam + _cpFinalizationCommitteeParameters = NoParam, + _cpValidatorScoreParameters = NoParam } let (genesisData, bakerIdentities, _) = makeGenesisDataV0 @PV diff --git a/concordium-consensus/tests/scheduler/SchedulerTests/ConfigureBaker.hs b/concordium-consensus/tests/scheduler/SchedulerTests/ConfigureBaker.hs index cf432b4116..e9f713ec07 100644 --- a/concordium-consensus/tests/scheduler/SchedulerTests/ConfigureBaker.hs +++ b/concordium-consensus/tests/scheduler/SchedulerTests/ConfigureBaker.hs @@ -1311,8 +1311,8 @@ testUpdateBakerSuspendResumeOk spv pvString suspendOrResume accM = accountBaker _ x = pure x events = [ if suspendOrResume == Suspend - then BakerSuspended{ebsBakerId = 4} - else BakerResumed{ebrBakerId = 4} + then BakerSuspended{ebsBakerId = 4, ebsAccount = baker4Address} + else BakerResumed{ebrBakerId = 4, ebrAccount = baker4Address} ] tests :: Spec diff --git a/concordium-consensus/tests/scheduler/SchedulerTests/KonsensusV1/EpochTransition.hs b/concordium-consensus/tests/scheduler/SchedulerTests/KonsensusV1/EpochTransition.hs index 9c1ab1157c..cdbd60b443 100644 --- a/concordium-consensus/tests/scheduler/SchedulerTests/KonsensusV1/EpochTransition.hs +++ b/concordium-consensus/tests/scheduler/SchedulerTests/KonsensusV1/EpochTransition.hs @@ -721,7 +721,8 @@ testMissedRoundsUpdate accountConfigs = runTestBlockState @P8 $ do bprd <- bsoGetBakerPoolRewardDetails bs0 let missedRounds0 = Map.fromList $ zip (Map.keys bprd) [1 ..] bs1 <- bsoUpdateMissedRounds bs0 missedRounds0 - missedRounds1 <- fmap (uncond . missedRounds) <$> bsoGetBakerPoolRewardDetails bs1 + missedRounds1 <- + fmap (missedRounds . uncond . suspensionInfo) <$> bsoGetBakerPoolRewardDetails bs1 liftIO $ assertEqual "Current epoch missed rounds should be updated as expeceted." @@ -738,7 +739,8 @@ testMissedRoundsUpdate accountConfigs = runTestBlockState @P8 $ do bs2 <- bsoSetNextEpochBakers bs1 newBakerStake (chainParams ^. cpFinalizationCommitteeParameters) bs3 <- bsoSetNextCapitalDistribution bs2 CapitalDistribution{bakerPoolCapital = newPoolCapital, ..} bs4 <- bsoRotateCurrentCapitalDistribution =<< bsoRotateCurrentEpochBakers bs3 - missedRounds2 <- fmap (uncond . missedRounds) <$> bsoGetBakerPoolRewardDetails bs4 + missedRounds2 <- + fmap (missedRounds . uncond . suspensionInfo) <$> bsoGetBakerPoolRewardDetails bs4 liftIO $ assertEqual "Missed rounds should be carried over when rotating current capital distribution with new validators" @@ -750,7 +752,8 @@ testMissedRoundsUpdate accountConfigs = runTestBlockState @P8 $ do (all (== 0) $ Map.elems $ missedRounds2 `Map.difference` missedRounds1) bs5 <- bsoSetNextEpochBakers bs4 bakerStakes (chainParams ^. cpFinalizationCommitteeParameters) bs6 <- bsoSetNextCapitalDistribution bs5 CapitalDistribution{..} - missedRounds3 <- fmap (uncond . missedRounds) <$> bsoGetBakerPoolRewardDetails bs6 + missedRounds3 <- + fmap (missedRounds . uncond . suspensionInfo) <$> bsoGetBakerPoolRewardDetails bs6 liftIO $ assertEqual "Missed rounds should be carried over when rotating current capital distribution with new validators"