Skip to content
Draft
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
5 changes: 5 additions & 0 deletions .changes/20261023_sub_transaction_witness_assemble.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
project: cardano-cli
pr: 1485
kind:
- feature
description: Add Dijkstra sub-transaction witness and assemble commands to create key witnesses separately and combine them with an unsigned sub-transaction.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ module Cardano.CLI.EraBased.Transaction.SubTransaction.Command
( SubTransactionCmds (..)
, SubTransactionBuildRawCmdArgs (..)
, SubTransactionSignCmdArgs (..)
, SubTransactionWitnessCmdArgs (..)
, SubTransactionAssembleCmdArgs (..)
, SubTransactionTxIdCmdArgs (..)
, Guard (..)
, GuardScript (..)
Expand All @@ -30,6 +32,8 @@ import Vary (Vary)
data SubTransactionCmds
= SubTransactionBuildRawCmd !SubTransactionBuildRawCmdArgs
| SubTransactionSignCmd !SubTransactionSignCmdArgs
| SubTransactionWitnessCmd !SubTransactionWitnessCmdArgs
| SubTransactionAssembleCmd !SubTransactionAssembleCmdArgs
| SubTransactionTxIdCmd !SubTransactionTxIdCmdArgs

-- | Like 'TransactionBuildRawCmdArgs' for a sub-transaction body. A
Expand Down Expand Up @@ -95,6 +99,20 @@ data SubTransactionSignCmdArgs = SubTransactionSignCmdArgs
}
deriving Show

data SubTransactionWitnessCmdArgs = SubTransactionWitnessCmdArgs
{ subTxFile :: !(UnsignedSubTxFile In)
, witnessSigningData :: !WitnessSigningData
, outFile :: !(File () Out)
}
deriving Show

data SubTransactionAssembleCmdArgs = SubTransactionAssembleCmdArgs
{ subTxFile :: !(UnsignedSubTxFile In)
, witnessFiles :: ![WitnessFile]
, outFile :: !(SignedSubTxFile Out)
}
deriving Show

data SubTransactionTxIdCmdArgs = SubTransactionTxIdCmdArgs
{ inputSubTxFile :: !InputSubTxFile
, outputFormat :: !(Vary [FormatJson, FormatText, FormatYaml])
Expand All @@ -105,4 +123,6 @@ renderSubTransactionCmds :: SubTransactionCmds -> Text
renderSubTransactionCmds = \case
SubTransactionBuildRawCmd{} -> "sub-transaction build-raw"
SubTransactionSignCmd{} -> "sub-transaction sign"
SubTransactionWitnessCmd{} -> "sub-transaction witness"
SubTransactionAssembleCmd{} -> "sub-transaction assemble"
SubTransactionTxIdCmd{} -> "sub-transaction txid"
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,16 @@ pSubTransactionCmds =
commandWithMetavar "sign" $
Opt.info pSubTransactionSign $
Opt.progDesc "Sign a sub-transaction"
, Just $
Opt.hsubparser $
commandWithMetavar "witness" $
Opt.info pSubTransactionWitness $
Opt.progDesc "Create a sub-transaction key witness"
, Just $
Opt.hsubparser $
commandWithMetavar "assemble" $
Opt.info pSubTransactionAssemble $
Opt.progDesc "Assemble an unsigned sub-transaction and key witnesses into a signed sub-transaction"
, Just $
Opt.hsubparser $
commandWithMetavar "txid" $
Expand Down Expand Up @@ -144,6 +154,22 @@ pSubTransactionSign =
<*> many pSubTransactionSigningData
<*> pSignedSubTxFileOut

pSubTransactionWitness :: Parser SubTransactionCmds
pSubTransactionWitness =
fmap SubTransactionWitnessCmd $
SubTransactionWitnessCmdArgs
<$> pUnsignedSubTxFileIn
<*> pSubTransactionSigningData
<*> pOutputFile

pSubTransactionAssemble :: Parser SubTransactionCmds
pSubTransactionAssemble =
fmap SubTransactionAssembleCmd $
SubTransactionAssembleCmdArgs
<$> pUnsignedSubTxFileIn
<*> many pWitnessFile
<*> pSignedSubTxFileOut

pSubTransactionTxId :: Parser SubTransactionCmds
pSubTransactionTxId =
fmap SubTransactionTxIdCmd $
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ module Cardano.CLI.EraBased.Transaction.SubTransaction.Run
( runSubTransactionCmds
, runSubTransactionBuildRawCmd
, runSubTransactionSignCmd
, runSubTransactionWitnessCmd
, runSubTransactionAssembleCmd
, runSubTransactionTxIdCmd
, readSignedSubTransactions
, validateCanonicalSubTransactions
Expand Down Expand Up @@ -69,6 +71,8 @@ runSubTransactionCmds :: Cmd.SubTransactionCmds -> CIO e ()
runSubTransactionCmds = \case
Cmd.SubTransactionBuildRawCmd args -> runSubTransactionBuildRawCmd args
Cmd.SubTransactionSignCmd args -> runSubTransactionSignCmd args
Cmd.SubTransactionWitnessCmd args -> runSubTransactionWitnessCmd args
Cmd.SubTransactionAssembleCmd args -> runSubTransactionAssembleCmd args
Cmd.SubTransactionTxIdCmd args -> runSubTransactionTxIdCmd args

-- | Read the signed sub-transactions named on the command line, checking that
Expand Down Expand Up @@ -479,6 +483,56 @@ runSubTransactionSignCmd

fromEitherIOCli $ writeFileTextEnvelope outFile Nothing signed

runSubTransactionWitnessCmd
:: Cmd.SubTransactionWitnessCmdArgs
-> CIO e ()
runSubTransactionWitnessCmd
Cmd.SubTransactionWitnessCmdArgs
{ subTxFile = File subTxFilePath
, witnessSigningData
, outFile
} = do
subTxFile <- liftIO $ fileOrPipe subTxFilePath
unsigned <-
fromEitherIOCli $ first TxCmdTextEnvError <$> readFileUnsignedSubTx subTxFile
signingWitness <-
fromEitherIOCli $
first TxCmdReadWitnessSigningDataError <$> readWitnessSigningData witnessSigningData
key <- case categoriseSomeSigningWitness signingWitness of
AByronWitness _ -> throwCliError TxCmdSubTxByronWitnessUnsupported
AShelleyKeyWitness key -> pure key
let witness = ShelleyKeyWitness ShelleyBasedEraDijkstra $ Exp.makeSubTxKeyWitness unsigned key
fromEitherIOCli $
first TxCmdWriteFileError <$> writeTxWitnessFileTextEnvelope ShelleyBasedEraDijkstra outFile witness

runSubTransactionAssembleCmd
:: Cmd.SubTransactionAssembleCmdArgs
-> CIO e ()
runSubTransactionAssembleCmd
Cmd.SubTransactionAssembleCmdArgs
{ subTxFile = File subTxFilePath
, witnessFiles
, outFile
} = do
subTxFile <- liftIO $ fileOrPipe subTxFilePath
unsigned <-
fromEitherIOCli $ first TxCmdTextEnvError <$> readFileUnsignedSubTx subTxFile
keyWits <- forM witnessFiles $ \witnessFile@(WitnessFile path) -> do
InAnyShelleyBasedEra era witness <-
fromEitherIOCli $ first TxCmdTextEnvError <$> readFileTxKeyWitness path
case era of
ShelleyBasedEraDijkstra -> case witness of
ShelleyKeyWitness _ keyWit -> pure keyWit
ShelleyBootstrapWitness{} -> throwCliError TxCmdSubTxByronWitnessUnsupported
_ ->
throwCliError $
TxCmdWitnessEraMismatch
(AnyCardanoEra DijkstraEra)
(AnyCardanoEra $ toCardanoEra era)
witnessFile
-- Preserve the body bytes covered by the signatures, as in 'sign'.
fromEitherIOCli $ writeFileTextEnvelope outFile Nothing $ Exp.signSubTx [] keyWits unsigned

runSubTransactionTxIdCmd
:: Cmd.SubTransactionTxIdCmdArgs
-> CIO e ()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,35 @@ hprop_golden_dijkstra_transaction_sub_transaction_pipeline =
]
H.diffFileVsGoldenFile signedSubTxFile (goldenDir <> "/signed_out")

-- Creating a detached witness and assembling must reproduce direct signing.
witnessFile <- noteTempFile tempDir "sub-tx.witness"
void $
execCardanoCLI
[ "dijkstra"
, "sub-transaction"
, "witness"
, "--sub-tx-file"
, unsignedSubTxFile
, "--signing-key-file"
, signingKeyFile
, "--out-file"
, witnessFile
]
H.diffFileVsGoldenFile witnessFile (goldenDir <> "/witness_out")
void $
execCardanoCLI
[ "dijkstra"
, "sub-transaction"
, "assemble"
, "--sub-tx-file"
, unsignedSubTxFile
, "--witness-file"
, witnessFile
, "--out-file"
, signedSubTxFile
]
H.diffFileVsGoldenFile signedSubTxFile (goldenDir <> "/signed_out")

-- The id is the body hash, so signing must not change it
unsignedId <-
execCardanoCLI
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"type": "TxWitness DijkstraEra",
"description": "Key Witness ShelleyEra",
"cborHex": "82582048d968a47923d491cbba6548e61cc3e347e658d1818d7bea90cf7d04ca13dbd15840449d80212dc4f45426f668daefe5dc22f60ff15c74b7262ccaebd8fad59504e05e19b03616a3305dcb4d0e384385b8bf7da7d059bfa112ad899223c7d1c6d400"
}
24 changes: 23 additions & 1 deletion cardano-cli/test/cardano-cli-golden/files/golden/help.cli
Original file line number Diff line number Diff line change
Expand Up @@ -5261,7 +5261,14 @@ Usage: cardano-cli dijkstra stake-pool metadata-hash
Calculate the hash of a stake pool metadata file, optionally checking the
obtained hash against an expected value.

Usage: cardano-cli dijkstra sub-transaction (build-raw | sign | txid)
Usage: cardano-cli dijkstra sub-transaction
( build-raw
| sign
| witness
| assemble
| txid
)


Sub-transaction commands. A sub-transaction is built and signed on its own,
then embedded in a top-level transaction.
Expand Down Expand Up @@ -5444,6 +5451,21 @@ Usage: cardano-cli dijkstra sub-transaction sign --sub-tx-file FILEPATH

Sign a sub-transaction

Usage: cardano-cli dijkstra sub-transaction witness --sub-tx-file FILEPATH
--signing-key-file FILEPATH
--out-file FILEPATH


Create a sub-transaction key witness

Usage: cardano-cli dijkstra sub-transaction assemble --sub-tx-file FILEPATH
[--witness-file FILEPATH]
--out-file FILEPATH


Assemble an unsigned sub-transaction and key witnesses into a signed
sub-transaction

Usage: cardano-cli dijkstra sub-transaction txid
( --sub-tx-file FILEPATH
| --signed-sub-tx-file FILEPATH
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
Usage: cardano-cli dijkstra sub-transaction (build-raw | sign | txid)
Usage: cardano-cli dijkstra sub-transaction
( build-raw
| sign
| witness
| assemble
| txid
)


Sub-transaction commands. A sub-transaction is built and signed on its own,
then embedded in a top-level transaction.
Expand All @@ -12,4 +19,7 @@ Available commands:

Please note the order[93;22;23;24m of some cmd options is crucial. If used incorrectly may produce undesired sub-transaction body. See nested [] notation above for details.[0;22;23;24m
sign Sign a sub-transaction
witness Create a sub-transaction key witness
assemble Assemble an unsigned sub-transaction and key
witnesses into a signed sub-transaction
txid Print a sub-transaction identifier.
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
Usage: cardano-cli dijkstra sub-transaction assemble --sub-tx-file FILEPATH
[--witness-file FILEPATH]
--out-file FILEPATH


Assemble an unsigned sub-transaction and key witnesses into a signed
sub-transaction

Available options:
--sub-tx-file FILEPATH Input filepath of the JSON unsigned sub-transaction.
--witness-file FILEPATH Filepath of the witness
--out-file FILEPATH Output filepath of the JSON signed sub-transaction.
-h,--help Show this help text
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
Usage: cardano-cli dijkstra sub-transaction witness --sub-tx-file FILEPATH
--signing-key-file FILEPATH
--out-file FILEPATH


Create a sub-transaction key witness

Available options:
--sub-tx-file FILEPATH Input filepath of the JSON unsigned sub-transaction.
--signing-key-file FILEPATH
Input filepath of the signing key.
--out-file FILEPATH The output file.
-h,--help Show this help text
Loading
Loading