Stake Pool Hot Credentials
Abstract
Stake Pool Operators (SPOs) currently sign on-chain governance votes with pool cold keys. This CIP introduces a new on-chain certificate that lets a pool cold key authorize a hot credential for a stake pool. It also makes SPO vote authorization explicit in the voter representation:
StakePoolVoter poolId Nothingrequires the pool cold key witness.StakePoolVoter poolId (Just hotCred)requires witnesses that satisfyhotCred, and the ledger verifies thathotCredmatches the pool's currently authorized hot credential.
Hot credentials are defined as Credential values (key hash or
script hash), so native and Plutus script voting paths are supported. For each
(govActionId, poolId), the ledger only needs to track the latest SPO vote and
whether it was cast as Cold or Hot. The proposal requires a future hard
fork for activation.
Motivation: Why is this CIP necessary?
CIP-1694 gave SPOs an on-chain voting role, but cold-key-only operation is high-friction and increases operational risk because cold keys are meant to remain offline.
Authorization for consensus-critical voting must be ledger-visible and ledger-validated. Existing Calidus keys from CIP-0151 rely on transaction metadata, but metadata is not the right substrate for on-chain voting. A certificate-based design provides explicit state transitions, deterministic validation, and consistent tooling semantics.
This CIP enables day-to-day governance operation through authorized hot credentials while preserving cold-key voting. It does so with explicit voter contents rather than by inferring authorization mode indirectly during witness validation.
Specification
Terminology
- Pool cold key: The Ed25519 key whose hash defines the Pool ID.
- Pool ID: The blake2b-224 hash of the pool cold verification key.
- Hot credential: A governance
Credentialauthorized for a pool's governance voting role. It may be either a key hash credential or script hash credential. - SPO voter:
StakePoolVoter !(KeyHash 'StakePool) (Maybe (Credential Hot)). - Cold vote: An SPO vote with
StakePoolVoter poolId Nothing. - Hot vote: An SPO vote with
StakePoolVoter poolId (Just hotCred). - Hot authorization map: Ledger state map
poolGovHotCreds : Map PoolId Credential. - Vote source: Authorization source for a recorded SPO vote:
Cold | Hot.
Certificate Semantics
This CIP introduces one new stake-pool governance certificate:
AssignStakePoolHotCredential(poolId, hotCredOpt)
hotCredOpt semantics:
- If
hotCredOpt = hotCred(aCredential), the pool's hot credential is set tohotCred(overwrite allowed). - If
hotCredOpt = null, any existing hot credential forpoolIdis revoked. If none exists, this is a valid no-op.
Certificate CDDL
; Numeric certificate tag allocation is TBD in Ledger CDDL integration.
assign_stake_pool_hot_credential_tag = uint
assign_stake_pool_hot_credential_cert = [
assign_stake_pool_hot_credential_tag,
pool_id : pool_keyhash,
hot_credential : null / credential
]Certificate Validation Rules
For AssignStakePoolHotCredential(poolId, hotCredOpt):
poolIdMUST identify a currently registered pool.- The transaction MUST include a valid witness by that pool's cold key.
- If multiple
AssignStakePoolHotCredentialcertificates for the samepoolIdappear in one transaction, they are processed in transaction order; the last one determines the final hot credential state for thatpoolId.
Ledger State Extension
Introduce:
poolGovHotCreds : Map PoolId CredentialState transitions:
AssignStakePoolHotCredential(poolId, hotCredOpt)withhotCredOpt = hotCredsetspoolGovHotCreds[poolId] = hotCred(overwrite allowed).AssignStakePoolHotCredential(poolId, hotCredOpt)withhotCredOpt = nullremovespoolIdfrom the map if present (otherwise no-op).
Assignment and revocation MUST take effect immediately when the transaction is
applied to the ledger state; they MUST NOT be deferred to an epoch boundary.
This differs from updates to regular stake pool parameters through a RegPool
certificate, which are staged for the next epoch, and is why hot-credential
authorization uses a distinct certificate rather than extending RegPool.
No uniqueness constraint is imposed on hotCred. The same hot credential MAY be
authorized for multiple pools.
Pool retirement lifecycle:
- If a pool has a retirement certificate scheduled but not yet enacted, its hot credential remains valid.
- When retirement is enacted, the ledger clears the pool's entire stake pool
state, including its
poolGovHotCredsentry.
SPO Voter Representation and Authorization
This CIP changes the SPO voter representation to:
StakePoolVoter !(KeyHash 'StakePool) (Maybe (Credential Hot))Authorization semantics:
StakePoolVoter poolId Nothingis a cold-authorized SPO vote. The transaction MUST include a valid witness by the pool cold key forpoolId.StakePoolVoter poolId (Just hotCred)is a hot-authorized SPO vote. The transaction MUST include witnesses that satisfyhotCred, and the ledger MUST verify thatpoolGovHotCreds[poolId] = hotCred.
Hot credential satisfaction rules:
- If
hotCredis a key credential, the corresponding vkey witness is required. - If
hotCredis a script credential, a valid governance voting script witness is required under existing governance voting-script rules forStakePoolVoter poolId (Just hotCred). - Both native scripts and Plutus scripts are supported.
- Existing
Votingscript purpose will be used for Plutus script execution, since it was unused for stake pools before
All other vote semantics (vote options, anchors, role structure, timing windows, and tallying model) remain as defined by CIP-1694 unless explicitly modified by this CIP.
Vote Type and Overwrite Rules
For each active (govActionId, poolId) vote slot, the ledger records only the
latest SPO vote together with its VoteSource (Cold or Hot). Historical
overwritten SPO votes do not need to be retained.
Overwrite rules:
- A
Coldvote MAY replace the current vote (ColdorHot) for the same(govActionId, poolId). - A
Hotvote MAY replace the currentHotvote for the same(govActionId, poolId). - A
Hotvote MUST NOT replace the currentColdvote for the same(govActionId, poolId). An attempt to do so SHOULD result in a predicate failure, instead of being silently ignored.
Effectively, once any cold-authorized vote exists for a given
(govActionId, poolId), that pair is locked against hot-authorized overwrites.
Authorization-Change Vote Invalidation
If AssignStakePoolHotCredential(poolId, hotCredOpt) results in an actual
authorization-state change for poolId, the ledger MUST exclude the current SPO
votes for that poolId across still-active governance actions whose recorded
VoteSource is Hot.
If AssignStakePoolHotCredential(poolId, hotCredOpt) does not change the
resulting authorization state for poolId, no vote invalidation occurs.
Current Cold votes remain valid.
These invalidation rules apply only while votes can affect ratification. Once a governance action is ratified, neither a hot-credential authorization change nor a vote change during the one-epoch delay before enactment can affect that enactment. The same restriction applies to vote changes by DReps and Constitutional Committee members.
Rationale: How does this CIP achieve its goals?
- Certificates, not metadata: Governance authorization must be explicit ledger state with deterministic rule evaluation.
- Deterministic vote validation: The SPO vote itself states whether it uses cold authorization or a specific hot credential, and the ledger checks that claim directly.
- Operational security: Day-to-day activity uses hot credentials while cold keys remain available for high-assurance override and recovery.
- Compatibility: The SPO governance role remains
StakePoolVoter, while its payload is extended to carry hot-credential information explicitly. - Future-proofing: Credential-based payload supports key and script custody models without a second hard-fork change.
- MPO support: Explicitly permitting hot credential reuse across pools supports multi-pool operational workflows.
- Simplicity: A single certificate with nullable payload reduces complexity in specification, validation, and tooling, and the ledger only needs the latest vote and its type.
Backward Compatibility
- Existing cold-key SPO voting remains valid through
StakePoolVoter poolId Nothing. - This CIP extends the SPO voter payload to include
Maybe (Credential Hot)explicitly. - This CIP introduces no dependency on transaction metadata.
- CIP-0151 remains compatible as an off-chain identity/authentication mechanism. Operators MAY reuse the same underlying key material for both systems, but it is not required by consensus.
Security Considerations
- Hot credential compromise near deadline: If hot keys are suspected to be compromised, changing or revoking the authorized hot credential immediately invalidates current hot-authorized SPO votes for that pool on still-active governance actions, while current cold-authorized votes remain valid. Operators can then recast under current authorization (including with the cold key). Additionally, large stake pool groups can mitigate this risk further by choosing to use a multisig hot credential.
- Blast radius for shared hot credentials across multiple pools: This is allowed by design. Operators should consider script credentials (for example multisig and timelock designs) to reduce single-key compromise risk.
- Intentional delegation via shared or third-party hot credentials:
A pool cold key can authorize any
Credential, including one controlled by a different operator or reused across multiple pools. Many votes with differentpoolIds, but the samehotPoolCredcan be submitted like this:StakePoolVoter poolId (Just hotPoolCred). In fact as many as there are pools that authorized thathotPoolCred. Note that there is no requirement for all those votes to be the same, eg. for some pools it could be Yes, for others No. This representative behavior is an intentional capability, not a validation flaw, but it can concentrate SPO voting influence. If that outcome is undesirable, pool operators can revoke/replace the hot credential or replace the vote by hot credential for the current governance action with a coldkey-authorized vote.
Path to Active
Acceptance Criteria
- Ledger implementation merged in at least one node client.
- Ledger implementation includes:
AssignStakePoolHotCredential,poolGovHotCredsstate management, the explicit SPO voter representation, latest-vote-plus-type tracking, and cold/hot overwrite plus authorization-change invalidation behavior. - Compatible tooling available to create/submit new certificates and submit SPO votes using either cold authorization or key/script hot credentials.
- Integrated in a hard fork release.
- Implementation present within block producing nodes used by 80%+ of stake.
Implementation Plan
- Add certificate constructors and semantic validation for pool hot credential assignment/revocation via a nullable payload.
- Add and maintain
poolGovHotCredsin ledger state. - Extend the SPO voter representation to carry
Maybe (Credential Hot)and validate explicit cold/hot vote authorization. - Implement latest-vote-plus-type tracking, cold/hot overwrite behavior, and hot-vote invalidation on authorization-state changes.
- Update tooling and documentation for certificate flows and hot credential voting.
- Deploy in a future hard fork.
References
- CIP-1694: On-chain decentralized governance
- CIP-0151: On-chain registration for stake pools (Calidus keys)
- Cardano CLI governance vote submission
Copyright
This CIP is licensed under CC-BY-4.0.