Skip to content
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
2 changes: 2 additions & 0 deletions cardano-cli/cardano-cli.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -497,8 +497,10 @@ test-suite cardano-cli-golden
Test.Golden.Shelley.MultiSig.Address
Test.Golden.Shelley.Node.IssueOpCert
Test.Golden.Shelley.Node.KeyGen
Test.Golden.Shelley.Node.KeyGenBls
Test.Golden.Shelley.Node.KeyGenKes
Test.Golden.Shelley.Node.KeyGenVrf
Test.Golden.Shelley.Node.KeyHashBls
Test.Golden.Shelley.StakeAddress.Build
Test.Golden.Shelley.StakeAddress.DeregistrationCertificate
Test.Golden.Shelley.StakeAddress.KeyGen
Expand Down
10 changes: 8 additions & 2 deletions cardano-cli/src/Cardano/CLI/EraBased/Option.hs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

module Cardano.CLI.EraBased.Option
Expand All @@ -6,6 +7,7 @@ module Cardano.CLI.EraBased.Option
)
where

import Cardano.Api (DijkstraEra)
import Cardano.Api.Experimental

import Cardano.CLI.Environment
Expand All @@ -27,15 +29,15 @@ import Data.Maybe
import Options.Applicative (Parser)
import Options.Applicative qualified as Opt

pCmds :: IsEra era => EnvCli -> Parser (Cmds era)
pCmds :: forall era. IsEra era => EnvCli -> Parser (Cmds era)
pCmds envCli = do
asum $
catMaybes
[ Just (AddressCmds <$> pAddressCmds envCli)
, Just (KeyCmds <$> pKeyCmds)
, fmap GenesisCmds <$> pGenesisCmds envCli
, fmap GovernanceCmds <$> pGovernanceCmds
, Just (NodeCmds <$> pNodeCmds)
, Just (NodeCmds <$> pNodeCmds @era)
, fmap QueryCmds <$> pQueryCmds envCli
, fmap StakeAddressCmds <$> pStakeAddressCmds envCli
, fmap StakePoolCmds <$> pStakePoolCmds envCli
Expand All @@ -50,6 +52,10 @@ pAnyEraCommand envCli =
commandWithMetavar "conway" $
Opt.info (AnyEraCommandOf ConwayEra <$> pCmds @ConwayEra envCli) $
Opt.progDesc "Conway era commands"
, Opt.hsubparser $
commandWithMetavar "dijkstra" $
Opt.info (AnyEraCommandOf DijkstraEra <$> asum [NodeCmds <$> pNodeCmds @DijkstraEra]) $
Opt.progDesc "Dijkstra era commands"
, Opt.hsubparser $
commandWithMetavar "latest" $
Opt.info (AnyEraCommandOf ConwayEra <$> pCmds @ConwayEra envCli) $
Expand Down
4 changes: 2 additions & 2 deletions cardano-cli/src/Cardano/CLI/EraIndependent/Key/Run.hs
Original file line number Diff line number Diff line change
Expand Up @@ -204,12 +204,12 @@ runNonExtendedKeyCmd
vk@AGenesisUTxOVerificationKey{} -> goFail vk
vk@AKesVerificationKey{} -> goFail vk
vk@AVrfVerificationKey{} -> goFail vk
vk@ABlsVerificationKey{} -> goFail vk
vk@AStakePoolVerificationKey{} -> goFail vk
vk@AStakeVerificationKey{} -> goFail vk
vk@ADRepVerificationKey{} -> goFail vk
vk@ACommitteeColdVerificationKey{} -> goFail vk
vk@ACommitteeHotVerificationKey{} -> goFail vk
vk@ABlsVerificationKey{} -> goFail vk
where
goFail nonExtendedKey = throwCliError $ KeyCmdExpectedExtendedVerificationKey nonExtendedKey

Expand Down Expand Up @@ -249,12 +249,12 @@ readExtendedVerificationKeyFile evkfile = do
k@AGenesisUTxOVerificationKey{} -> goFail k
k@AKesVerificationKey{} -> goFail k
k@AVrfVerificationKey{} -> goFail k
k@ABlsVerificationKey{} -> goFail k
k@AStakePoolVerificationKey{} -> goFail k
k@AStakeVerificationKey{} -> goFail k
k@ADRepVerificationKey{} -> goFail k
k@ACommitteeColdVerificationKey{} -> goFail k
k@ACommitteeHotVerificationKey{} -> goFail k
k@ABlsVerificationKey{} -> goFail k
where
goFail k = left $ KeyCmdExpectedExtendedVerificationKey k

Expand Down
21 changes: 21 additions & 0 deletions cardano-cli/src/Cardano/CLI/EraIndependent/Node/Command.hs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ module Cardano.CLI.EraIndependent.Node.Command
, NodeKeyGenColdCmdArgs (..)
, NodeKeyGenKESCmdArgs (..)
, NodeKeyGenVRFCmdArgs (..)
, NodeKeyGenBLSCmdArgs (..)
, NodeKeyHashVRFCmdArgs (..)
, NodeKeyHashBLSCmdArgs (..)
, NodeNewCounterCmdArgs (..)
, NodeIssueOpCertCmdArgs (..)
)
Expand All @@ -25,7 +27,9 @@ data NodeCmds
= NodeKeyGenColdCmd !NodeKeyGenColdCmdArgs
| NodeKeyGenKESCmd !NodeKeyGenKESCmdArgs
| NodeKeyGenVRFCmd !NodeKeyGenVRFCmdArgs
| NodeKeyGenBLSCmd !NodeKeyGenBLSCmdArgs
| NodeKeyHashVRFCmd !NodeKeyHashVRFCmdArgs
| NodeKeyHashBLSCmd !NodeKeyHashBLSCmdArgs
| NodeNewCounterCmd !NodeNewCounterCmdArgs
| NodeIssueOpCertCmd !NodeIssueOpCertCmdArgs
deriving Show
Expand Down Expand Up @@ -55,13 +59,28 @@ data NodeKeyGenVRFCmdArgs
}
deriving Show

data NodeKeyGenBLSCmdArgs
= NodeKeyGenBLSCmdArgs
{ keyOutputFormat :: !(Vary [FormatBech32, FormatTextEnvelope])
, vkeyFile :: !(VerificationKeyFile Out)
, skeyFile :: !(SigningKeyFile Out)
}
deriving Show

data NodeKeyHashVRFCmdArgs
= NodeKeyHashVRFCmdArgs
{ vkeySource :: !(VerificationKeyOrFile VrfKey)
, mOutFile :: !(Maybe (File () Out))
}
deriving Show

data NodeKeyHashBLSCmdArgs
= NodeKeyHashBLSCmdArgs
{ vkeySource :: !(VerificationKeyOrFile BlsKey)
, mOutFile :: !(Maybe (File () Out))
}
deriving Show

data NodeNewCounterCmdArgs
= NodeNewCounterCmdArgs
{ coldVkeyFile :: !ColdVerificationKeyOrFile
Expand Down Expand Up @@ -89,6 +108,8 @@ renderNodeCmds = \case
NodeKeyGenColdCmd{} -> "node key-gen"
NodeKeyGenKESCmd{} -> "node key-gen-KES"
NodeKeyGenVRFCmd{} -> "node key-gen-VRF"
NodeKeyGenBLSCmd{} -> "node key-gen-BLS"
NodeKeyHashVRFCmd{} -> "node key-hash-VRF"
NodeKeyHashBLSCmd{} -> "node key-hash-BLS"
NodeNewCounterCmd{} -> "node new-counter"
NodeIssueOpCertCmd{} -> "node issue-op-cert"
159 changes: 104 additions & 55 deletions cardano-cli/src/Cardano/CLI/EraIndependent/Node/Option.hs
Original file line number Diff line number Diff line change
@@ -1,69 +1,91 @@
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

module Cardano.CLI.EraIndependent.Node.Option
( pNodeCmds
)
where

import Cardano.Api.Experimental qualified as Exp

import Cardano.CLI.EraBased.Common.Option
import Cardano.CLI.EraIndependent.Node.Command
import Cardano.CLI.EraIndependent.Node.Command qualified as Cmd
import Cardano.CLI.Parser

import Data.Foldable
import Data.Maybe (catMaybes)
import Options.Applicative hiding (help, str)
import Options.Applicative qualified as Opt

pNodeCmds :: Parser NodeCmds
pNodeCmds :: forall era. Exp.IsEra era => Parser NodeCmds
pNodeCmds =
let nodeCmdParsers =
asum
[ Opt.hsubparser $
commandWithMetavar "key-gen" $
Opt.info pKeyGenOperator $
Opt.progDesc $
mconcat
[ "Create a key pair for a node operator's offline "
, "key and a new certificate issue counter"
]
, Opt.hsubparser $
commandWithMetavar "key-gen-KES" $
Opt.info pKeyGenKES $
Opt.progDesc $
mconcat
[ "Create a key pair for a node KES operational key"
]
, Opt.hsubparser $
commandWithMetavar "key-gen-VRF" $
Opt.info pKeyGenVRF $
Opt.progDesc $
mconcat
[ "Create a key pair for a node VRF operational key"
]
, Opt.hsubparser $
commandWithMetavar "key-hash-VRF" . Opt.info pKeyHashVRF $
Opt.progDesc $
mconcat
[ "Print hash of a node's operational VRF key."
]
, Opt.hsubparser $
commandWithMetavar "new-counter" $
Opt.info pNewCounter $
Opt.progDesc $
mconcat
[ "Create a new certificate issue counter"
]
, Opt.hsubparser $
commandWithMetavar "issue-op-cert" $
Opt.info pIssueOpCert $
Opt.progDesc $
mconcat
[ "Issue a node operational certificate"
]
]
asum $
catMaybes
[ Just $
Opt.hsubparser $
commandWithMetavar "key-gen" $
Opt.info pKeyGenOperator $
Opt.progDesc $
mconcat
[ "Create a key pair for a node operator's offline "
, "key and a new certificate issue counter"
]
, Just $
Opt.hsubparser $
commandWithMetavar "key-gen-KES" $
Opt.info pKeyGenKES $
Opt.progDesc $
mconcat
[ "Create a key pair for a node KES operational key"
]
, Just $
Opt.hsubparser $
commandWithMetavar "key-gen-VRF" $
Opt.info pKeyGenVRF $
Opt.progDesc $
mconcat
[ "Create a key pair for a node VRF operational key"
]
, pKeyGenBLS @era
, Just $
Opt.hsubparser $
commandWithMetavar "key-hash-VRF" . Opt.info pKeyHashVRF $
Opt.progDesc $
mconcat
[ "Print hash of a node's operational VRF key."
]
, pKeyHashBLS @era
, Just $
Opt.hsubparser $
commandWithMetavar "new-counter" $
Opt.info pNewCounter $
Opt.progDesc $
mconcat
[ "Create a new certificate issue counter"
]
, Just
$ Opt.hsubparser
$ commandWithMetavar "issue-op-cert"
$ Opt.info
( fmap Cmd.NodeIssueOpCertCmd $
Cmd.NodeIssueOpCertCmdArgs
<$> pKesVerificationKeyOrFile
<*> pColdSigningKeyFile
<*> pOperatorCertIssueCounterFile
<*> pKesPeriod
<*> pOutputFile
)
$ Opt.progDesc
$ mconcat
[ "Issue a node operational certificate"
]
]
in Opt.hsubparser $
commandWithMetavar "node" $
Opt.info nodeCmdParsers $
Expand Down Expand Up @@ -97,13 +119,50 @@ pKeyGenVRF =
<*> pVerificationKeyFileOut
<*> pSigningKeyFileOut

pKeyGenBLS :: forall era. Exp.IsEra era => Maybe (Parser NodeCmds)
pKeyGenBLS = case Exp.useEra @era of
Exp.ConwayEra -> Nothing
Exp.DijkstraEra ->
Just
$ Opt.hsubparser
$ commandWithMetavar "key-gen-BLS"
$ Opt.info
( fmap Cmd.NodeKeyGenBLSCmd $
Cmd.NodeKeyGenBLSCmdArgs
<$> pKeyOutputFormat
<*> pVerificationKeyFileOut
<*> pSigningKeyFileOut
)
$ Opt.progDesc
$ mconcat
[ "Create a key pair for a node BLS operational key"
]

pKeyHashVRF :: Parser NodeCmds
pKeyHashVRF =
fmap Cmd.NodeKeyHashVRFCmd $
Cmd.NodeKeyHashVRFCmdArgs
<$> pVerificationKeyOrFileIn
<*> pMaybeOutputFile

pKeyHashBLS :: forall era. Exp.IsEra era => Maybe (Parser NodeCmds)
pKeyHashBLS = case Exp.useEra @era of
Exp.ConwayEra -> Nothing
Exp.DijkstraEra ->
Just
$ Opt.hsubparser
$ commandWithMetavar "key-hash-BLS"
. Opt.info
( fmap Cmd.NodeKeyHashBLSCmd $
Cmd.NodeKeyHashBLSCmdArgs
<$> pVerificationKeyOrFileIn
<*> pMaybeOutputFile
)
$ Opt.progDesc
$ mconcat
[ "Print hash of a node's operational BLS key."
]

pNewCounter :: Parser NodeCmds
pNewCounter =
fmap Cmd.NodeNewCounterCmd $
Expand All @@ -120,13 +179,3 @@ pCounterValue =
, Opt.metavar "INT"
, Opt.help "The next certificate issue counter value to use."
]

pIssueOpCert :: Parser NodeCmds
pIssueOpCert =
fmap Cmd.NodeIssueOpCertCmd $
Cmd.NodeIssueOpCertCmdArgs
<$> pKesVerificationKeyOrFile
<*> pColdSigningKeyFile
<*> pOperatorCertIssueCounterFile
<*> pKesPeriod
<*> pOutputFile
Loading
Loading