Skip to content

Commit d2365a8

Browse files
committed
Add KES agent connectivity
1 parent 6ef6f95 commit d2365a8

File tree

21 files changed

+411
-112
lines changed

21 files changed

+411
-112
lines changed

cabal.project

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ multi-repl: True
3434

3535
import: ./asserts.cabal
3636

37+
allow-newer: plutus-core:cardano-crypto-class
38+
, bytestring
39+
, serdoc-core:tasty-quickcheck
40+
, kes-agent:base
41+
3742
package ouroboros-network
3843
-- Certain ThreadNet tests rely on transactions to be submitted promptly after
3944
-- a node (re)start. Therefore, we disable this flag (see
@@ -45,6 +50,14 @@ if(os(windows))
4550
constraints:
4651
bitvec -simd
4752

53+
source-repository-package
54+
type: git
55+
location: [email protected]:input-output-hk/kes-agent
56+
tag: 7d3517d61004b3e0867b62f1b4cf02ae5eee5589
57+
--sha256: sha256-N4XRVqC+UgWej+J16RPh3EO6MSIE3wmJvmP5/nRgIuw=
58+
subdir:
59+
kes-agent
60+
4861
source-repository-package
4962
type: git
5063
location: https://github.com/input-output-hk/cardano-ledger

ouroboros-consensus-cardano/ouroboros-consensus-cardano.cabal

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ library
150150
crypton,
151151
deepseq,
152152
formatting >=6.3 && <7.3,
153+
kes-agent,
153154
measures,
154155
microlens,
155156
mtl,
@@ -159,6 +160,7 @@ library
159160
ouroboros-network-api ^>=0.12,
160161
serialise ^>=0.2,
161162
small-steps,
163+
serdoc-core,
162164
sop-core ^>=0.5,
163165
sop-extras ^>=0.2,
164166
strict-sop-core ^>=0.1,
@@ -311,6 +313,7 @@ library unstable-shelley-testlib
311313
cardano-strict-containers,
312314
containers,
313315
generic-random,
316+
kes-agent,
314317
microlens,
315318
mtl,
316319
ouroboros-consensus:{ouroboros-consensus, unstable-consensus-testlib},
@@ -319,6 +322,7 @@ library unstable-shelley-testlib
319322
ouroboros-consensus-protocol:{ouroboros-consensus-protocol, unstable-protocol-testlib},
320323
ouroboros-network-api,
321324
quiet ^>=0.2,
325+
serdoc-core,
322326
small-steps,
323327

324328
test-suite shelley-test
@@ -557,6 +561,7 @@ library unstable-cardano-tools
557561
ouroboros-network-framework ^>=0.16,
558562
ouroboros-network-protocols,
559563
resource-registry,
564+
serdoc-core,
560565
serialise ^>=0.2,
561566
singletons,
562567
sop-core,

ouroboros-consensus-cardano/src/ouroboros-consensus-cardano/Ouroboros/Consensus/Cardano/Node.hs

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,7 @@ import qualified Cardano.Ledger.Api.Transition as L
5757
import qualified Cardano.Ledger.BaseTypes as SL
5858
import qualified Cardano.Ledger.Shelley.API as SL
5959
import Cardano.Prelude (cborError)
60-
import qualified Cardano.Protocol.TPraos.OCert as Absolute (KESPeriod (..),
61-
ocertKESPeriod)
60+
import qualified Cardano.Protocol.TPraos.OCert as Absolute (KESPeriod (..))
6261
import qualified Codec.CBOR.Decoding as CBOR
6362
import Codec.CBOR.Encoding (Encoding)
6463
import qualified Codec.CBOR.Encoding as CBOR
@@ -95,6 +94,7 @@ import Ouroboros.Consensus.Node.ProtocolInfo
9594
import Ouroboros.Consensus.Node.Run
9695
import Ouroboros.Consensus.Protocol.Praos (Praos, PraosParams (..))
9796
import Ouroboros.Consensus.Protocol.Praos.Common (PraosCanBeLeader (..), instantiatePraosCredentials)
97+
import Ouroboros.Consensus.Protocol.Praos.AgentClient
9898
import Ouroboros.Consensus.Protocol.TPraos (TPraos, TPraosParams (..))
9999
import qualified Ouroboros.Consensus.Protocol.TPraos as Shelley
100100
import Ouroboros.Consensus.Shelley.HFEras ()
@@ -103,15 +103,14 @@ import qualified Ouroboros.Consensus.Shelley.Ledger as Shelley
103103
import Ouroboros.Consensus.Shelley.Ledger.Block (IsShelleyBlock,
104104
ShelleyBlockLedgerEra)
105105
import Ouroboros.Consensus.Shelley.Ledger.NetworkProtocolVersion
106-
import qualified Ouroboros.Consensus.Protocol.Ledger.HotKey as HotKey
107106
import Ouroboros.Consensus.Shelley.Node
108107
import Ouroboros.Consensus.Shelley.Node.Common (ShelleyEraWithCrypto, shelleyBlockIssuerVKey)
109108
import qualified Ouroboros.Consensus.Shelley.Node.Praos as Praos
110109
import qualified Ouroboros.Consensus.Shelley.Node.TPraos as TPraos
111110
import Ouroboros.Consensus.Storage.Serialisation
112111
import Ouroboros.Consensus.TypeFamilyWrappers
113112
import Ouroboros.Consensus.Util.Assert
114-
import Ouroboros.Consensus.Util.IOLike
113+
115114
{-------------------------------------------------------------------------------
116115
SerialiseHFC
117116
-------------------------------------------------------------------------------}
@@ -462,7 +461,10 @@ data CardanoProtocolParams c = CardanoProtocolParams {
462461
-- PRECONDITION: only a single set of Shelley credentials is allowed when used
463462
-- for mainnet (check against @'SL.gNetworkId' == 'SL.Mainnet'@).
464463
protocolInfoCardano ::
465-
forall c m. (IOLike m, CardanoHardForkConstraints c)
464+
forall c m.
465+
( CardanoHardForkConstraints c
466+
, KESAgentContext c m
467+
)
466468
=> CardanoProtocolParams c
467469
-> ( ProtocolInfo (CardanoBlock c)
468470
, m [BlockForging m (CardanoBlock c)]
@@ -857,19 +859,12 @@ protocolInfoCardano paramsCardano
857859
slotToPeriod (SlotNo slot) = assert (tpraosSlotsPerKESPeriod == praosSlotsPerKESPeriod) $
858860
Absolute.KESPeriod $ fromIntegral $ slot `div` praosSlotsPerKESPeriod
859861

860-
(ocert, sk) <- instantiatePraosCredentials (praosCanBeLeaderCredentialsSource canBeLeader)
861-
862-
let startPeriod :: Absolute.KESPeriod
863-
startPeriod = Absolute.ocertKESPeriod ocert
864-
865-
let maxKESEvo :: Word64
862+
maxKESEvo :: Word64
866863
maxKESEvo = assert (tpraosMaxKESEvo == praosMaxKESEvo) praosMaxKESEvo
867864

868-
hotKey <- HotKey.mkHotKey
869-
ocert
870-
sk
871-
startPeriod
865+
hotKey <- instantiatePraosCredentials
872866
maxKESEvo
867+
(praosCanBeLeaderCredentialsSource canBeLeader)
873868

874869
let tpraos :: forall era.
875870
ShelleyEraWithCrypto c (TPraos c) era

ouroboros-consensus-cardano/src/shelley/Ouroboros/Consensus/Shelley/Node/TPraos.hs

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,19 @@ module Ouroboros.Consensus.Shelley.Node.TPraos (
3333
) where
3434

3535
import qualified Cardano.Crypto.VRF as VRF
36+
import qualified Cardano.Crypto.KES as KES
3637
import qualified Cardano.Ledger.Api.Era as L
3738
import qualified Cardano.Ledger.Api.Transition as L
3839
import qualified Cardano.Ledger.Shelley.API as SL
40+
import Cardano.Ledger.Crypto (KES)
3941
import qualified Cardano.Protocol.TPraos.API as SL
4042
import qualified Cardano.Protocol.TPraos.OCert as Absolute (KESPeriod (..))
4143
import qualified Cardano.Protocol.TPraos.OCert as SL
4244
import Cardano.Slotting.EpochInfo
4345
import Cardano.Slotting.Time (mkSlotLength)
4446
import Control.Monad.Except (Except)
4547
import Data.Bifunctor (first)
48+
import qualified Data.SerDoc.Class as SerDoc
4649
import qualified Data.Text as T
4750
import qualified Data.Text as Text
4851
import Lens.Micro ((^.))
@@ -55,10 +58,11 @@ import Ouroboros.Consensus.Ledger.Extended
5558
import Ouroboros.Consensus.Ledger.SupportsMempool (TxLimits)
5659
import Ouroboros.Consensus.Node.ProtocolInfo
5760
import Ouroboros.Consensus.Protocol.Abstract
58-
import Ouroboros.Consensus.Protocol.Ledger.HotKey (HotKey, mkHotKey)
61+
import Ouroboros.Consensus.Protocol.Ledger.HotKey (HotKey)
5962
import qualified Ouroboros.Consensus.Protocol.Ledger.HotKey as HotKey
6063
import Ouroboros.Consensus.Protocol.Praos.Common
6164
import Ouroboros.Consensus.Protocol.TPraos
65+
import Ouroboros.Consensus.Protocol.Praos.AgentClient
6266
import Ouroboros.Consensus.Shelley.Eras
6367
import Ouroboros.Consensus.Shelley.Ledger
6468
import Ouroboros.Consensus.Shelley.Ledger.Inspect ()
@@ -71,6 +75,7 @@ import Ouroboros.Consensus.Shelley.Node.Serialisation ()
7175
import Ouroboros.Consensus.Shelley.Protocol.TPraos ()
7276
import Ouroboros.Consensus.Util.Assert
7377
import Ouroboros.Consensus.Util.IOLike
78+
import qualified Cardano.KESAgent.Serialization.DirectCodec as Agent
7479

7580
{-------------------------------------------------------------------------------
7681
BlockForging
@@ -167,8 +172,12 @@ protocolInfoShelley ::
167172
forall m c.
168173
( IOLike m
169174
, PraosCrypto c
175+
, AgentCrypto c
170176
, ShelleyCompatible (TPraos c) (ShelleyEra c)
171177
, TxLimits (ShelleyBlock (TPraos c) (ShelleyEra c))
178+
, MonadKESAgent m
179+
, SerDoc.HasInfo (Agent.DirectCodec m) (KES.VerKeyKES (KES c))
180+
, SerDoc.HasInfo (Agent.DirectCodec m) (KES.SignKeyKES (KES c))
172181
)
173182
=> SL.ShelleyGenesis c
174183
-> ProtocolParamsShelleyBased c
@@ -186,11 +195,11 @@ protocolInfoShelley shelleyGenesis
186195

187196
protocolInfoTPraosShelleyBased ::
188197
forall m era c.
189-
( IOLike m
190-
, PraosCrypto c
198+
( PraosCrypto c
191199
, ShelleyCompatible (TPraos c) era
192200
, TxLimits (ShelleyBlock (TPraos c) era)
193201
, c ~ EraCrypto era
202+
, KESAgentContext c m
194203
)
195204
=> ProtocolParamsShelleyBased c
196205
-> L.TransitionConfig era
@@ -216,16 +225,11 @@ protocolInfoTPraosShelleyBased ProtocolParamsShelleyBased {
216225
mkBlockForging :: ShelleyLeaderCredentials c -> m (BlockForging m (ShelleyBlock (TPraos c) era))
217226
mkBlockForging credentials = do
218227
let canBeLeader = shelleyLeaderCredentialsCanBeLeader credentials
219-
(ocert, sk) <- instantiatePraosCredentials (praosCanBeLeaderCredentialsSource canBeLeader)
220-
221-
let startPeriod :: Absolute.KESPeriod
222-
startPeriod = SL.ocertKESPeriod ocert
223228

224-
hotKey :: HotKey c m <- mkHotKey
225-
ocert
226-
sk
227-
startPeriod
228-
(tpraosMaxKESEvo tpraosParams)
229+
hotKey :: HotKey c m <-
230+
instantiatePraosCredentials
231+
(tpraosMaxKESEvo tpraosParams)
232+
(praosCanBeLeaderCredentialsSource canBeLeader)
229233

230234
return $ shelleyBlockForging tpraosParams hotKey credentials
231235

ouroboros-consensus-cardano/src/unstable-cardano-testlib/Test/Consensus/Cardano/ProtocolInfo.hs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ module Test.Consensus.Cardano.ProtocolInfo (
2121
, protocolVersionZero
2222
) where
2323

24+
import Ouroboros.Consensus.Protocol.Praos.AgentClient (KESAgentContext)
2425
import qualified Cardano.Chain.Genesis as CC.Genesis
2526
import qualified Cardano.Chain.Update as CC.Update
2627
import Cardano.Ledger.Api.Era (StandardCrypto)
@@ -50,7 +51,6 @@ import Ouroboros.Consensus.Protocol.PBFT (PBftParams,
5051
import Ouroboros.Consensus.Shelley.Node
5152
(ProtocolParamsShelleyBased (..), ShelleyGenesis,
5253
ShelleyLeaderCredentials)
53-
import Ouroboros.Consensus.Util.IOLike (IOLike)
5454
import qualified Test.Cardano.Ledger.Alonzo.Examples.Consensus as SL
5555
import qualified Test.Cardano.Ledger.Conway.Examples.Consensus as SL
5656
import qualified Test.ThreadNet.Infra.Byron as Byron
@@ -214,7 +214,10 @@ mkSimpleTestProtocolInfo
214214
--
215215
mkTestProtocolInfo ::
216216
forall m c
217-
. (CardanoHardForkConstraints c, IOLike m, c ~ StandardCrypto)
217+
. ( CardanoHardForkConstraints c
218+
, KESAgentContext c m
219+
, c ~ StandardCrypto
220+
)
218221
=> (CoreNodeId, Shelley.CoreNode c)
219222
-- ^ Id of the node for which the protocol info will be elaborated.
220223
-> ShelleyGenesis c

ouroboros-consensus-cardano/src/unstable-cardano-testlib/Test/ThreadNet/Infra/ShelleyBasedHardFork.hs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,14 @@ import Ouroboros.Consensus.Ledger.SupportsProtocol
5656
(LedgerSupportsProtocol)
5757
import Ouroboros.Consensus.Node
5858
import Ouroboros.Consensus.Node.NetworkProtocolVersion
59+
import Ouroboros.Consensus.Protocol.Praos.AgentClient (KESAgentContext)
5960
import Ouroboros.Consensus.Protocol.TPraos
6061
import Ouroboros.Consensus.Shelley.Eras
6162
import Ouroboros.Consensus.Shelley.Ledger
6263
import Ouroboros.Consensus.Shelley.Node
64+
import Ouroboros.Consensus.Shelley.Protocol.Abstract (ProtoCrypto)
6365
import Ouroboros.Consensus.TypeFamilyWrappers
6466
import Ouroboros.Consensus.Util (eitherToMaybe)
65-
import Ouroboros.Consensus.Util.IOLike (IOLike)
6667
import Test.ThreadNet.TxGen
6768
import Test.ThreadNet.TxGen.Shelley ()
6869

@@ -265,7 +266,9 @@ instance ShelleyBasedHardForkConstraints proto1 era1 proto2 era2
265266

266267
protocolInfoShelleyBasedHardFork ::
267268
forall m proto1 era1 proto2 era2.
268-
(IOLike m, ShelleyBasedHardForkConstraints proto1 era1 proto2 era2)
269+
( KESAgentContext (ProtoCrypto proto2) m
270+
, ShelleyBasedHardForkConstraints proto1 era1 proto2 era2
271+
)
269272
=> ProtocolParamsShelleyBased (EraCrypto era1)
270273
-> SL.ProtVer
271274
-> SL.ProtVer

ouroboros-consensus-cardano/src/unstable-cardano-tools/Cardano/Api/Protocol/Types.hs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
{-# LANGUAGE MultiParamTypeClasses #-}
77
{-# LANGUAGE StandaloneDeriving #-}
88
{-# LANGUAGE TypeFamilies #-}
9+
{-# LANGUAGE UndecidableInstances #-}
910

1011
-- DUPLICATE -- adapted from: cardano-api/src/Cardano/Api/Protocol/Types.hs
1112

@@ -30,13 +31,14 @@ import qualified Ouroboros.Consensus.Ledger.SupportsProtocol as Consensus
3031
import Ouroboros.Consensus.Node.ProtocolInfo (ProtocolClientInfo (..),
3132
ProtocolInfo (..))
3233
import Ouroboros.Consensus.Node.Run (RunNode)
34+
import Ouroboros.Consensus.Protocol.Praos.AgentClient
3335
import qualified Ouroboros.Consensus.Protocol.TPraos as Consensus
3436
import qualified Ouroboros.Consensus.Shelley.Eras as Consensus (ShelleyEra)
3537
import qualified Ouroboros.Consensus.Shelley.Ledger.Block as Consensus
3638
(ShelleyBlock)
3739
import Ouroboros.Consensus.Shelley.Ledger.SupportsProtocol ()
3840
import Ouroboros.Consensus.Shelley.ShelleyHFC (ShelleyBlockHFC)
39-
import Ouroboros.Consensus.Util.IOLike (IOLike)
41+
import Ouroboros.Consensus.Util.IOLike
4042

4143

4244
class (RunNode blk, IOLike m) => Protocol m blk where
@@ -62,7 +64,11 @@ instance IOLike m => Protocol m ByronBlockHFC where
6264
, pure . map inject $ blockForgingByron params
6365
)
6466

65-
instance (CardanoHardForkConstraints StandardCrypto, IOLike m) => Protocol m (CardanoBlock StandardCrypto) where
67+
instance ( CardanoHardForkConstraints StandardCrypto
68+
, IOLike m
69+
, MonadKESAgent m
70+
)
71+
=> Protocol m (CardanoBlock StandardCrypto) where
6672
data ProtocolInfoArgs m (CardanoBlock StandardCrypto) =
6773
ProtocolInfoArgsCardano
6874
(CardanoProtocolParams StandardCrypto)
@@ -83,6 +89,7 @@ instance CardanoHardForkConstraints StandardCrypto => ProtocolClient (CardanoBlo
8389
protocolClientInfoCardano epochSlots
8490

8591
instance ( IOLike m
92+
, MonadKESAgent m
8693
, Consensus.LedgerSupportsProtocol
8794
(Consensus.ShelleyBlock
8895
(Consensus.TPraos StandardCrypto) (ShelleyEra StandardCrypto))

ouroboros-consensus-cardano/src/unstable-shelley-testlib/Test/Consensus/Shelley/MockCrypto.hs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
{-# LANGUAGE FlexibleInstances #-}
55
{-# LANGUAGE TypeFamilies #-}
66
{-# LANGUAGE UndecidableInstances #-}
7+
{-# LANGUAGE OverloadedStrings #-}
78

89
{-# OPTIONS_GHC -Wno-orphans #-}
910

@@ -27,12 +28,16 @@ import Control.State.Transition.Extended (PredicateFailure)
2728
import Ouroboros.Consensus.Ledger.SupportsProtocol
2829
(LedgerSupportsProtocol)
2930
import qualified Ouroboros.Consensus.Protocol.Praos as Praos
31+
import Ouroboros.Consensus.Protocol.Praos.AgentClient (AgentCrypto (..))
3032
import Ouroboros.Consensus.Protocol.TPraos (TPraos)
3133
import Ouroboros.Consensus.Shelley.Eras (EraCrypto, ShelleyEra)
3234
import Ouroboros.Consensus.Shelley.Ledger (ShelleyBlock,
3335
ShelleyCompatible)
3436
import qualified Test.Cardano.Ledger.Shelley.ConcreteCryptoTypes as SL (Mock)
3537
import Test.QuickCheck (Arbitrary)
38+
import qualified Cardano.KESAgent.KES.Crypto as Agent
39+
import qualified Cardano.KESAgent.Protocols.VersionedProtocol as Agent
40+
import qualified Cardano.KESAgent.Processes.ServiceClient as Agent
3641

3742
-- | A mock replacement for 'StandardCrypto'
3843
--
@@ -76,3 +81,16 @@ type CanMock proto era =
7681
, Arbitrary (StashedAVVMAddresses era)
7782
, Arbitrary (Core.GovState era)
7883
)
84+
85+
instance Agent.NamedCrypto (MockCrypto h) where
86+
cryptoName _ = Agent.CryptoName "Mock"
87+
88+
instance Agent.ServiceClientDrivers (MockCrypto h) where
89+
availableServiceClientDrivers = []
90+
91+
instance Agent.Crypto (MockCrypto h) where
92+
type KES (MockCrypto h) = MockKES 10
93+
type DSIGN (MockCrypto h) = MockDSIGN
94+
95+
instance HashAlgorithm h => AgentCrypto (MockCrypto h) where
96+
type ACrypto (MockCrypto h) = MockCrypto h

ouroboros-consensus-cardano/src/unstable-shelley-testlib/Test/ThreadNet/Infra/Shelley.hs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@ import Ouroboros.Consensus.Shelley.Ledger (GenTx (..),
9191
mkShelleyTx)
9292
import Ouroboros.Consensus.Shelley.Node
9393
import Ouroboros.Consensus.Util.Assert
94-
import Ouroboros.Consensus.Util.IOLike
9594
import Quiet (Quiet (..))
9695
import qualified Test.Cardano.Ledger.Core.KeyPair as TL (KeyPair (..),
9796
mkWitnessesVKey)
@@ -101,6 +100,7 @@ import Test.QuickCheck
101100
import Test.Util.Orphans.Arbitrary ()
102101
import Test.Util.Slots (NumSlots (..))
103102
import Test.Util.Time (dawnOfTime)
103+
import Ouroboros.Consensus.Protocol.Praos.AgentClient (KESAgentContext)
104104

105105
{-------------------------------------------------------------------------------
106106
The decentralization parameter
@@ -408,7 +408,10 @@ mkGenesisConfig pVer k f d maxLovelaceSupply slotLength kesCfg coreNodes =
408408

409409
mkProtocolShelley ::
410410
forall m c.
411-
(IOLike m, PraosCrypto c, ShelleyCompatible (TPraos c) (ShelleyEra c))
411+
( KESAgentContext c m
412+
, PraosCrypto c
413+
, ShelleyCompatible (TPraos c) (ShelleyEra c)
414+
)
412415
=> ShelleyGenesis c
413416
-> SL.Nonce
414417
-> ProtVer

0 commit comments

Comments
 (0)