Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introducing SuspensionInfo and suspension chain parameters #1264

Merged
merged 9 commits into from
Dec 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 16 additions & 4 deletions concordium-consensus/src/Concordium/GlobalState/DummyData.hs
Original file line number Diff line number Diff line change
Expand Up @@ -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 ->
Expand All @@ -382,7 +390,8 @@ dummyChainParameters = case chainParametersVersion @cpv of
PoolParametersV0
{ _ppBakerStakeThreshold = 300000000000
},
_cpFinalizationCommitteeParameters = NoParam
_cpFinalizationCommitteeParameters = NoParam,
_cpValidatorScoreParameters = NoParam
}
SChainParametersV1 ->
ChainParameters
Expand Down Expand Up @@ -420,7 +429,8 @@ dummyChainParameters = case chainParametersVersion @cpv of
_transactionCommissionRange = fullRange
}
},
_cpFinalizationCommitteeParameters = NoParam
_cpFinalizationCommitteeParameters = NoParam,
_cpValidatorScoreParameters = NoParam
}
SChainParametersV2 ->
ChainParameters
Expand Down Expand Up @@ -458,7 +468,8 @@ dummyChainParameters = case chainParametersVersion @cpv of
_transactionCommissionRange = fullRange
}
},
_cpFinalizationCommitteeParameters = SomeParam dummyFinalizationCommitteeParameters
_cpFinalizationCommitteeParameters = SomeParam dummyFinalizationCommitteeParameters,
_cpValidatorScoreParameters = NoParam
}
SChainParametersV3 ->
ChainParameters
Expand Down Expand Up @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions concordium-consensus/src/Concordium/GlobalState/Parameters.hs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -3735,7 +3746,7 @@ doMarkFinalizationAwakeBakers pbs bids = do
( (),
bpr
{ finalizationAwake = True,
missedRounds = 0 <$ missedRounds bpr
suspensionInfo = emptySuspensionInfo <$ suspensionInfo bpr
}
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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@.
Expand Down Expand Up @@ -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,
Expand All @@ -443,7 +464,8 @@ migratePendingUpdates migration PendingUpdates{..} = withCPVConstraints (chainPa
pTimeoutParametersQueue = newTimeoutParameters,
pMinBlockTimeQueue = newMinBlockTimeQueue,
pBlockEnergyLimitQueue = newBlockEnergyLimitQueue,
pFinalizationCommitteeParametersQueue = newFinalizationCommitteeParametersQueue
pFinalizationCommitteeParametersQueue = newFinalizationCommitteeParametersQueue,
pValidatorScoreParametersQueue = newValidatorScoreParametersQueue
}

instance
Expand Down Expand Up @@ -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,
Expand All @@ -543,7 +566,8 @@ instance
pTimeoutParametersQueue = newTimeoutParametersQueue,
pMinBlockTimeQueue = newMinBlockTimeQueue,
pBlockEnergyLimitQueue = newBlockEnergyLimitQueue,
pFinalizationCommitteeParametersQueue = newFinalizationCommitteeParametersQueue
pFinalizationCommitteeParametersQueue = newFinalizationCommitteeParametersQueue,
pValidatorScoreParametersQueue = newValidatorScoreParametersQueue
}
let putPU =
pRKQ
Expand All @@ -566,6 +590,7 @@ instance
>> putMinBlockTimeQueue
>> putBlockEnergyLimitQueue
>> putFinalizationCommitteeParametersQueue
>> putValidatorScoreParametersQueue
return (putPU, newPU)
load = withCPVConstraints (chainParametersVersion @cpv) $ do
mRKQ <- label "Root keys update queue" load
Expand All @@ -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
Expand All @@ -609,6 +635,7 @@ instance
pMinBlockTimeQueue <- mMinBlockTimeQueue
pBlockEnergyLimitQueue <- mBlockEnergyLimitQueue
pFinalizationCommitteeParametersQueue <- mFinalizationCommitteeParametersQueue
pValidatorScoreParametersQueue <- mValidatorScoreParametersQueue
return PendingUpdates{..}

instance
Expand Down Expand Up @@ -638,6 +665,7 @@ instance
<*> cache pMinBlockTimeQueue
<*> cache pBlockEnergyLimitQueue
<*> cache pFinalizationCommitteeParametersQueue
<*> cache pValidatorScoreParametersQueue
where
cpv = chainParametersVersion @cpv

Expand All @@ -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
Expand Down Expand Up @@ -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'.
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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 ::
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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 ::
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 _ _ _ =
Expand Down
Loading
Loading