diff --git a/ouroboros-consensus-cardano/golden/cardano/disk/ChainDepState_Babbage b/ouroboros-consensus-cardano/golden/cardano/disk/ChainDepState_Babbage index 3bc6eaac88..2e06ac93cf 100644 Binary files a/ouroboros-consensus-cardano/golden/cardano/disk/ChainDepState_Babbage and b/ouroboros-consensus-cardano/golden/cardano/disk/ChainDepState_Babbage differ diff --git a/ouroboros-consensus-cardano/golden/cardano/disk/ChainDepState_Conway b/ouroboros-consensus-cardano/golden/cardano/disk/ChainDepState_Conway index 5043da9e14..760307285a 100644 Binary files a/ouroboros-consensus-cardano/golden/cardano/disk/ChainDepState_Conway and b/ouroboros-consensus-cardano/golden/cardano/disk/ChainDepState_Conway differ diff --git a/ouroboros-consensus-cardano/golden/cardano/disk/ChainDepState_Dijkstra b/ouroboros-consensus-cardano/golden/cardano/disk/ChainDepState_Dijkstra index 8745a735ad..64bfb1dc43 100644 Binary files a/ouroboros-consensus-cardano/golden/cardano/disk/ChainDepState_Dijkstra and b/ouroboros-consensus-cardano/golden/cardano/disk/ChainDepState_Dijkstra differ diff --git a/ouroboros-consensus-cardano/golden/cardano/disk/ExtLedgerState_Babbage b/ouroboros-consensus-cardano/golden/cardano/disk/ExtLedgerState_Babbage index 622ee470ff..e1cb075b82 100644 Binary files a/ouroboros-consensus-cardano/golden/cardano/disk/ExtLedgerState_Babbage and b/ouroboros-consensus-cardano/golden/cardano/disk/ExtLedgerState_Babbage differ diff --git a/ouroboros-consensus-cardano/golden/cardano/disk/ExtLedgerState_Conway b/ouroboros-consensus-cardano/golden/cardano/disk/ExtLedgerState_Conway index 1d2b0c3c12..74fe8bc575 100644 Binary files a/ouroboros-consensus-cardano/golden/cardano/disk/ExtLedgerState_Conway and b/ouroboros-consensus-cardano/golden/cardano/disk/ExtLedgerState_Conway differ diff --git a/ouroboros-consensus-cardano/golden/cardano/disk/ExtLedgerState_Dijkstra b/ouroboros-consensus-cardano/golden/cardano/disk/ExtLedgerState_Dijkstra index 563a4897c6..a57ec35d1a 100644 Binary files a/ouroboros-consensus-cardano/golden/cardano/disk/ExtLedgerState_Dijkstra and b/ouroboros-consensus-cardano/golden/cardano/disk/ExtLedgerState_Dijkstra differ diff --git a/ouroboros-consensus-protocol/src/ouroboros-consensus-protocol/Ouroboros/Consensus/Protocol/Praos.hs b/ouroboros-consensus-protocol/src/ouroboros-consensus-protocol/Ouroboros/Consensus/Protocol/Praos.hs index 772f3c2550..547e9e54aa 100644 --- a/ouroboros-consensus-protocol/src/ouroboros-consensus-protocol/Ouroboros/Consensus/Protocol/Praos.hs +++ b/ouroboros-consensus-protocol/src/ouroboros-consensus-protocol/Ouroboros/Consensus/Protocol/Praos.hs @@ -279,6 +279,8 @@ data PraosState = PraosState -- ^ Candidate nonce , praosStateEpochNonce :: !Nonce -- ^ Epoch nonce + , praosStatePreviousEpochNonce :: !Nonce + -- ^ Previous epoch nonce , praosStateLabNonce :: !Nonce -- ^ Nonce constructed from the hash of the previous block , praosStateLastEpochBlockNonce :: !Nonce @@ -303,17 +305,19 @@ instance Serialise PraosState where , praosStateEvolvingNonce , praosStateCandidateNonce , praosStateEpochNonce + , praosStatePreviousEpochNonce , praosStateLabNonce , praosStateLastEpochBlockNonce } = encodeVersion 0 $ mconcat - [ CBOR.encodeListLen 7 + [ CBOR.encodeListLen 8 , toCBOR praosStateLastSlot , toCBOR praosStateOCertCounters , toCBOR praosStateEvolvingNonce , toCBOR praosStateCandidateNonce , toCBOR praosStateEpochNonce + , toCBOR praosStatePreviousEpochNonce , toCBOR praosStateLabNonce , toCBOR praosStateLastEpochBlockNonce ] @@ -323,7 +327,7 @@ instance Serialise PraosState where [(0, Decode decodePraosState)] where decodePraosState = do - enforceSize "PraosState" 7 + enforceSize "PraosState" 8 PraosState <$> fromCBOR <*> fromCBOR @@ -332,6 +336,7 @@ instance Serialise PraosState where <*> fromCBOR <*> fromCBOR <*> fromCBOR + <*> fromCBOR data instance Ticked PraosState = TickedPraosState { tickedPraosStateChainDepState :: PraosState @@ -423,11 +428,13 @@ instance PraosCrypto c => ConsensusProtocol (Praos c) where -- Updating the chain dependent state for Praos. -- -- If we are not in a new epoch, then nothing happens. If we are in a new - -- epoch, we do two things: + -- epoch, we do three things: -- - Update the epoch nonce to the combination of the candidate nonce and the -- nonce derived from the last block of the previous epoch. - -- - Update the "last block of previous epoch" nonce to the nonce derived from - -- the last applied block. + -- - Store the current epoch nonce as the "previous epoch" nonce. This is + -- needed by Peras to be able to validate slightly old certificates. + -- - Update the "last block of previous epoch" nonce to the nonce derived + -- from the last applied block. tickChainDepState PraosConfig{praosEpochInfo} lv @@ -450,7 +457,10 @@ instance PraosCrypto c => ConsensusProtocol (Praos c) where { praosStateEpochNonce = praosStateCandidateNonce st ⭒ praosStateLastEpochBlockNonce st - , praosStateLastEpochBlockNonce = praosStateLabNonce st + , praosStatePreviousEpochNonce = + praosStateEpochNonce st + , praosStateLastEpochBlockNonce = + praosStateLabNonce st } else st @@ -758,7 +768,8 @@ instance TranslateProto (TPraos c) (Praos c) where , praosStateOCertCounters = Map.mapKeysMonotonic coerce certCounters , praosStateEvolvingNonce = evolvingNonce , praosStateCandidateNonce = candidateNonce - , praosStateEpochNonce = SL.ticknStateEpochNonce csTickn + , praosStateEpochNonce = epochNonce + , praosStatePreviousEpochNonce = epochNonce -- same as current epoch nonce , praosStateLabNonce = csLabNonce , praosStateLastEpochBlockNonce = SL.ticknStatePrevHashNonce csTickn } @@ -767,6 +778,7 @@ instance TranslateProto (TPraos c) (Praos c) where tpraosStateChainDepState tpState SL.PrtclState certCounters evolvingNonce candidateNonce = csProtocol + epochNonce = SL.ticknStateEpochNonce csTickn {------------------------------------------------------------------------------- Util diff --git a/ouroboros-consensus-protocol/src/unstable-protocol-testlib/Test/Consensus/Protocol/Serialisation/Generators.hs b/ouroboros-consensus-protocol/src/unstable-protocol-testlib/Test/Consensus/Protocol/Serialisation/Generators.hs index a88e986783..3b3cf99494 100644 --- a/ouroboros-consensus-protocol/src/unstable-protocol-testlib/Test/Consensus/Protocol/Serialisation/Generators.hs +++ b/ouroboros-consensus-protocol/src/unstable-protocol-testlib/Test/Consensus/Protocol/Serialisation/Generators.hs @@ -81,3 +81,4 @@ instance Arbitrary PraosState where <*> arbitrary <*> arbitrary <*> arbitrary + <*> arbitrary