Skip to content
Open
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
41 changes: 41 additions & 0 deletions .changes/20260625_145525_cardano-cli_work_prepare_11_1.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
description: |-
new `cardano-cli ping` api

`cardano-cli ping` allows now to ping multiple servers, does domain name
resolution and supports SRV records (as specified in
https://cips.cardano.org/cip/CIP-0155)

Some examples:

Run a ping against two ip addresses, ipv4 & ipv6
```bash
cardano-cli ping 127.0.0.1:3001 [::1]:3001
```

Run a ping against a domain name:
```bash
cardano-cli ping my.domain.com:3001
```

Run a ping against an SRV domain.
According to CIP#0155 the SRV record needs to be registered at
`_cardano._tcp.srv.domain.com`
```bash
cardano-cli ping srv.domain.com
```

Run a ping against unix socket
```bash
cardano-cli ping /var/run/cardano-node.socket
```

`cardano-cli` ping has three modes of operation:

* ping mode: `--mode ping` (the default)
* tip mode `--mode tip`
* query handshake parameters: `--mode query`
kind:
- breaking
- feature
pr: 1391
project: cardano-cli
91 changes: 85 additions & 6 deletions cabal.project
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,8 @@ repository cardano-haskell-packages
-- See CONTRIBUTING for information about these, including some Nix commands
-- you need to run if you change them
index-state:
, hackage.haskell.org 2026-06-02T21:49:32Z
, cardano-haskell-packages 2026-06-02T21:14:32Z

active-repositories:
, :rest
, cardano-haskell-packages:override
, hackage.haskell.org 2026-06-29T22:49:53Z
, cardano-haskell-packages 2026-07-02T10:10:00Z

packages:
cardano-cli
Expand Down Expand Up @@ -60,6 +56,9 @@ package text
package formatting
flags: +no-double-conversion

package cardano-diffusion
flags: +optparse-applicative-fork

tests: True
test-show-details: direct

Expand Down Expand Up @@ -100,3 +99,83 @@ if impl(ghc >= 9.14)
, with-utf8:base
-- cabal-allow-newer end

source-repository-package
type: git
location: https://github.com/IntersectMBO/cardano-base.git
tag: 490b0d7af06c3d214dd4b64bb609375982bde846
--sha256: sha256-oC/QWvL4BGWottuyUqYAdHIgqgYvaVlB/0noLE2i9Po=
subdir:
base-deriving-via
cardano-base
cardano-binary
cardano-crypto-class
cardano-crypto-praos
cardano-git-rev
cardano-slotting
cardano-strict-containers
heapwords
measures

source-repository-package
type: git
location: https://github.com/IntersectMBO/cardano-api.git
tag: a775a6a9d581e2216ebc31f27572f4ae1c499e48
--sha256: sha256-U0UDIuhsDfJ4PDV1BqDTY7/2gWpf8c/Z2IVqUGMNhKQ=
subdir:
cardano-api

source-repository-package
type: git
location: https://github.com/IntersectMBO/cardano-ledger.git
tag: 245e63dcd335e3ca29823609e4aaa8f5f096a425
--sha256: sha256-chsapfNnY/V7y1snBzjP0LSVnYl/Axt6GjahTPNOKj0=
subdir:
eras/allegra/impl
eras/alonzo/impl
eras/babbage/impl
eras/byron/chain/executable-spec
eras/byron/crypto
eras/byron/ledger/executable-spec
eras/byron/ledger/impl
eras/conway/impl
eras/dijkstra/impl
eras/mary/impl
eras/shelley-ma/test-suite
eras/shelley/impl
eras/shelley/test-suite
libs/cardano-data
libs/cardano-ledger-api
libs/cardano-ledger-binary
libs/cardano-ledger-core
libs/cardano-protocol-tpraos
libs/non-integral
libs/small-steps
libs/vector-map

source-repository-package
type: git
location: https://github.com/f-f/kes-agent.git
tag: 32c1ed675d22a30735d9f22f7afa436a3ef3e64a
--sha256: sha256-o7hFX1JnraS6Xq0WoXQwd9Z8GsPPv0Ls2DWvZ08o0ZU=
subdir:
kes-agent
kes-agent-crypto

source-repository-package
type: git
location: https://github.com/IntersectMBO/ouroboros-consensus.git
tag: e37ba209ffdbdcb3cc8e7a9cb0fb6d6fa7cce8a3
--sha256: sha256-srdli4YUIo3HtdWwpk2Tq5okk4GQ5Fpn/ipFO8eykVU=
subdir:
.

source-repository-package
type: git
location: https://github.com/IntersectMBO/ouroboros-network.git
tag: 0a614a36c8969e53fd6a1c3890b36da5aff3b0a2
--sha256: sha256-p32/Y6jXwiSwa0yVspdx246KHaCBmqe2zB+UpxudeJc=
subdir:
./cardano-diffusion
./monoidal-synchronisation
./network-mux
./ouroboros-network
12 changes: 7 additions & 5 deletions cardano-cli/cardano-cli.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -245,15 +245,16 @@ library
cardano-api ^>=11.3,
cardano-binary,
cardano-crypto,
cardano-crypto-class ^>=2.3,
cardano-crypto-class ^>=2.5,
cardano-crypto-wrapper ^>=1.7,
cardano-data >=1.1,
cardano-diffusion:ping ^>=1.0,
cardano-git-rev ^>=0.2.2,
cardano-ledger-api,
cardano-ledger-conway,
cardano-ledger-core,
cardano-ledger-dijkstra,
cardano-ping ^>=0.10,
cardano-ledger-shelley,
cardano-prelude,
cardano-protocol-tpraos,
cardano-slotting ^>=0.2.0.0,
Expand All @@ -267,13 +268,12 @@ library
exceptions,
filepath,
formatting,
fs-api,
generic-lens,
haskeline,
http-client,
http-client-tls,
http-types,
io-classes,
io-classes:strict-stm,
iproute,
microlens,
mmorph,
Expand All @@ -292,7 +292,7 @@ library
transformers,
unliftio-core,
utf8-string,
validation,
validation ^>=1.2,
vary ^>=0.1.1.2,
vector,
yaml,
Expand Down Expand Up @@ -440,6 +440,8 @@ test-suite cardano-cli-golden
cardano-cli,
cardano-cli:cardano-cli-test-lib,
cardano-crypto-wrapper,
cardano-ledger-conway,
cardano-ledger-shelley,
cardano-strict-containers ^>=0.1,
cborg,
directory,
Expand Down
2 changes: 1 addition & 1 deletion cardano-cli/src/Cardano/CLI/Byron/UpdateProposal.hs
Original file line number Diff line number Diff line change
Expand Up @@ -69,5 +69,5 @@ submitByronUpdateProposal
submitByronUpdateProposal nodeSocketPath network proposalFp = do
proposal <- readByronUpdateProposal proposalFp
let genTx = toByronLedgerUpdateProposal proposal
traceWith stdoutTracer $ "Update proposal TxId: " ++ condense (txId genTx)
liftIO $ traceWith stdoutTracer $ "Update proposal TxId: " ++ condense (txId genTx)
fromExceptTCli $ nodeSubmitTx nodeSocketPath network genTx
2 changes: 1 addition & 1 deletion cardano-cli/src/Cardano/CLI/Byron/Vote.hs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ submitByronVote
submitByronVote nodeSocketPath network voteFp = do
vote <- readByronVote voteFp
let genTx = toByronLedgertoByronVote vote
traceWith stdoutTracer ("Vote TxId: " ++ condense (txId genTx))
liftIO $ traceWith stdoutTracer ("Vote TxId: " ++ condense (txId genTx))
fromExceptTCli $ nodeSubmitTx nodeSocketPath network genTx

readByronVote :: FilePath -> CIO e ByronVote
Expand Down
2 changes: 1 addition & 1 deletion cardano-cli/src/Cardano/CLI/Compatible/Json/Friendly.hs
Original file line number Diff line number Diff line change
Expand Up @@ -381,7 +381,7 @@ renderPurpose era purpose = case era of
[ labelPurpose spendingLabel . renderLedgerInput . unAsIxItem <$> L.toSpendingPurpose p
, labelPurpose mintingLabel . unAsIxItem <$> L.toMintingPurpose p
, labelPurpose certifyingLabel . unAsIxItem <$> L.toCertifyingPurpose p
, labelPurpose rewardingLabel . unAsIxItem <$> L.toRewardingPurpose p
, labelPurpose rewardingLabel . unAsIxItem <$> L.toWithdrawingPurpose p
]

conwayView
Expand Down
50 changes: 49 additions & 1 deletion cardano-cli/src/Cardano/CLI/Compatible/StakePool/Run.hs
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,18 @@

module Cardano.CLI.Compatible.StakePool.Run
( runCompatibleStakePoolCmds
, stakePoolRelayToAddr
)
where

import Cardano.Api
import Cardano.Api.Compatible.Certificate
import Cardano.Api.Experimental qualified as Exp
import Cardano.Api.Experimental.Certificate (StakePoolParameters (..), toShelleyPoolParams)
import Cardano.Api.Experimental.Certificate
( StakePoolParameters (..)
, StakePoolRelay (..)
, toShelleyPoolParams
)

import Cardano.CLI.Compatible.Exception
import Cardano.CLI.Compatible.StakePool.Command
Expand All @@ -23,8 +28,12 @@ import Cardano.CLI.Read
import Cardano.CLI.Type.Common
import Cardano.CLI.Type.Error.StakePoolCmdError
import Cardano.CLI.Type.Key (readVerificationKeyOrFile)
import Cardano.Network.Ping qualified as Ping

import Control.Monad
import Control.Tracer (nullTracer, (>$<))
import Data.ByteString.Char8 qualified as BSC
import Data.IP (IP (..))

runCompatibleStakePoolCmds
:: ()
Expand Down Expand Up @@ -53,6 +62,31 @@ runStakePoolRegistrationCertificateCmd
, outFile
} =
shelleyBasedEraConstraints sbe $ do
let pingOpts =
Ping.PingOpts
{ Ping.pingOptsCount = 1
, Ping.pingOptsMagic = toNetworkMagic network
, Ping.pingOptsJson = Ping.AsText
, Ping.pingOptsQuiet = True
, Ping.pingOptsSRVPrefix = "_cardano._tcp"
, Ping.pingOptsColor = Ping.ColorNever
, Ping.pingOptsMode = Ping.TipMode
}
pingErrs <- liftIO $ do
stderr <- Ping.mkStdErrTracer
headerTracer <- Ping.mkHeaderTracer pingOpts stderr
Ping.pingClients'
(Ping.format Ping.AsText >$< stderr)
nullTracer
headerTracer
(Ping.toText >$< stderr)
pingOpts
Ping.AddressIsNotAFilePath
(concatMap stakePoolRelayToAddr relays)

unless (null pingErrs) $
throwCliError (StakePoolCmdRelayPingErrors pingErrs)

-- Pool verification key
stakePoolVerKey <- getVerificationKeyFromStakePoolVerificationKeySource poolVerificationKeyOrFile
let stakePoolId' = anyStakePoolVerificationKeyHash stakePoolVerKey
Expand Down Expand Up @@ -100,3 +134,17 @@ runStakePoolRegistrationCertificateCmd
where
registrationCertDesc :: TextEnvelopeDescr
registrationCertDesc = "Stake Pool Registration Certificate"

stakePoolRelayToAddr
:: StakePoolRelay
-> [Ping.Address (Ping.Unresolved Ping.SRVOrFilePathUnresolved)]
stakePoolRelayToAddr (StakePoolRelayIp (Just ipv4) Nothing (Just port)) = [Ping.IP (IPv4 ipv4) (fromIntegral port)]
stakePoolRelayToAddr (StakePoolRelayIp Nothing (Just ipv6) (Just port)) = [Ping.IP (IPv6 ipv6) (fromIntegral port)]
stakePoolRelayToAddr (StakePoolRelayIp (Just ipv4) (Just ipv6) (Just port)) = [Ping.IP (IPv6 ipv6) (fromIntegral port), Ping.IP (IPv4 ipv4) (fromIntegral port)]
-- the pSingHostAddress parser always includes a port number
stakePoolRelayToAddr (StakePoolRelayIp _ _ Nothing) = error "unexpected happend"
-- the pSingHostAddress parser always includes at least one ip address
stakePoolRelayToAddr (StakePoolRelayIp Nothing Nothing _) = error "unexpected happend"
stakePoolRelayToAddr (StakePoolRelayDnsARecord dns (Just port)) = [Ping.mkAddress (BSC.unpack dns ++ ":" ++ show port)]
stakePoolRelayToAddr (StakePoolRelayDnsARecord dns Nothing) = [Ping.mkAddress (BSC.unpack dns)]
stakePoolRelayToAddr (StakePoolRelayDnsSrvRecord srv) = [Ping.mkAddress (BSC.unpack srv)]
2 changes: 1 addition & 1 deletion cardano-cli/src/Cardano/CLI/EraBased/Common/Option.hs
Original file line number Diff line number Diff line change
Expand Up @@ -2627,7 +2627,7 @@ pMultiHostName =

pSingleHostName :: Parser StakePoolRelay
pSingleHostName =
StakePoolRelayDnsARecord <$> pDNSName <*> optional pPort
StakePoolRelayDnsARecord <$> pDNSName <*> (Just <$> pPort)
where
pDNSName :: Parser ByteString
pDNSName =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ import Cardano.CLI.Type.Error.NodeCmdError
import Cardano.CLI.Type.Error.StakePoolCmdError
import Cardano.CLI.Type.Key
import Cardano.Crypto.Hash qualified as Crypto
import Cardano.Ledger.Conway.Genesis (ConwayExtraConfig (..))
import Cardano.Ledger.Shelley.Genesis (InjectionData (..), ShelleyExtraConfig (..))
import Cardano.Prelude (canonicalEncodePretty)
import Cardano.Protocol.Crypto qualified as C

Expand Down Expand Up @@ -488,8 +490,16 @@ runGenesisCreateTestNetDataCmd
cgInitialDReps <- initialDReps (L.ucppDRepDeposit $ L.cgUpgradePParams conwayGenesis) dRepKeys
pure $
conwayGenesis
{ L.cgDelegs = delegs (zip stakingKeys (case dRepKeys of [] -> []; _ -> cycle dRepKeys))
, L.cgInitialDReps
{ L.cgDelegs = mempty
, L.cgInitialDReps = mempty
, L.cgExtraConfig =
L.SJust
ConwayExtraConfig
{ cecDelegs =
EmbeddedInjection $
delegs (zip stakingKeys (case dRepKeys of [] -> []; _ -> cycle dRepKeys))
, cecInitialDReps = EmbeddedInjection cgInitialDReps
}
}
where
delegs
Expand Down Expand Up @@ -523,7 +533,7 @@ runGenesisCreateTestNetDataCmd
, L.drepAnchor = SNothing
, L.drepDeposit
, L.drepDelegs = Set.empty -- We don't need to populate this field (field "initialDReps"."keyHash-*"."delegators" in the JSON)
-- because its content is derived from the "delegs" field ("cgDelegs" above). In other words, when the Conway genesis is applied,
-- because its content is derived from the "delegs" field ("cecDelegs" above). In other words, when the Conway genesis is applied,
-- DRep delegations are computed from the "delegs" field. In the future the "delegators" field may
-- be omitted altogether from the JSON representation, but it remains in the Haskell type.
-- More details are provided here: https://github.com/IntersectMBO/cardano-ledger/issues/4782
Expand Down Expand Up @@ -875,20 +885,24 @@ updateOutputTemplate
{ sgSystemStart
, sgMaxLovelaceSupply = totalSupply
, sgGenDelegs = shelleyDelKeys
, sgInitialFunds =
fromList
[ (toShelleyAddr addr, v)
| (addr, v) <-
distribute nonDelegCoin nUtxoAddrsNonDeleg utxoAddrsNonDeleg
++ distribute delegCoin nUtxoAddrsDeleg utxoAddrsDeleg
++ mkStuffedUtxo stuffedUtxoAddrs
]
, sgStaking =
ShelleyGenesisStaking
{ sgsPools = ListMap pools
, sgsStake = ListMap stake
}
, sgInitialFunds = mempty
, sgStaking = mempty
, sgProtocolParams
, sgExtraConfig =
L.SJust
ShelleyExtraConfig
{ secInitialFunds =
EmbeddedInjection $
fromList
[ (toShelleyAddr addr, v)
| (addr, v) <-
distribute nonDelegCoin nUtxoAddrsNonDeleg utxoAddrsNonDeleg
++ distribute delegCoin nUtxoAddrsDeleg utxoAddrsDeleg
++ mkStuffedUtxo stuffedUtxoAddrs
]
, secStakePools = EmbeddedInjection (ListMap pools)
, secStakeCredentials = EmbeddedInjection (ListMap stake)
}
}
where
nonDelegCoin = getCoinForDistribution nonDelegCoinRaw
Expand Down
Loading
Loading