Skip to content

Commit 65c0024

Browse files
committed
Pass Ledger.PParams (ShelleyLedgerEra era) as arguments so that it can be computed once as passed around.
Bundle ProtocolParameters and Ledger.PParams (ShelleyLedgerEra era) into BundledProtocolParams era so that both case be passed around together. The constructor arguments are lazy so that values that are expensive to compute aren't computed unecessarily. Update changelog
1 parent d91516b commit 65c0024

File tree

8 files changed

+148
-113
lines changed

8 files changed

+148
-113
lines changed

cardano-api/ChangeLog.md

+7
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@
3131

3232
- **Breaking change** Change return type of `queryNodeLocalState` to new `AcquiringFailure` type.
3333

34+
- **Breaking change** - For performance reasons, `evaluateTransactionFee` to take a
35+
`Ledger.PParams (ShelleyLedgerEra era)` argument instead of `ProtocolParameters`
36+
([PR4903](https://github.com/input-output-hk/cardano-node/pull/4903))
37+
38+
- New type `BundledProtocolParameters` and new functions `bundleProtocolParams` and `unbundleProtocolParams`.
39+
([PR4903](https://github.com/input-output-hk/cardano-node/pull/4903))
40+
3441
### Bugs
3542

3643
- Allow reading text envelopes from pipes ([PR 4384](https://github.com/input-output-hk/cardano-node/pull/4384))

cardano-api/src/Cardano/Api.hs

+5
Original file line numberDiff line numberDiff line change
@@ -685,6 +685,11 @@ module Cardano.Api (
685685

686686
NetworkMagic(..),
687687

688+
-- * Protocol parameters
689+
BundledProtocolParameters(..),
690+
bundleProtocolParams,
691+
unbundleProtocolParams,
692+
688693
-- ** Conversions
689694
toLedgerPParams,
690695
fromLedgerPParams,

cardano-api/src/Cardano/Api/Convenience/Construction.hs

+3-6
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ import Cardano.Api.Address
2424
import Cardano.Api.Certificate
2525
import Cardano.Api.Eras
2626
import Cardano.Api.Fees
27-
import Cardano.Api.IPC
28-
import Cardano.Api.Modes
2927
import Cardano.Api.ProtocolParameters
3028
import Cardano.Api.Query
3129
import Cardano.Api.Tx
@@ -38,8 +36,7 @@ import Cardano.Api.Utils
3836
-- for constructBalancedTx.
3937
constructBalancedTx
4038
:: IsShelleyBasedEra era
41-
=> EraInMode era CardanoMode
42-
-> TxBodyContent BuildTx era
39+
=> TxBodyContent BuildTx era
4340
-> AddressInEra era -- ^ Change address
4441
-> Maybe Word -- ^ Override key witnesses
4542
-> UTxO era -- ^ Just the transaction inputs, not the entire 'UTxO'.
@@ -49,11 +46,11 @@ constructBalancedTx
4946
-> Set PoolId -- ^ The set of registered stake pools
5047
-> [ShelleyWitnessSigningKey]
5148
-> Either TxBodyErrorAutoBalance (Tx era)
52-
constructBalancedTx eInMode txbodcontent changeAddr mOverrideWits utxo pparams
49+
constructBalancedTx txbodcontent changeAddr mOverrideWits utxo pparams
5350
ledgerEpochInfo systemStart stakePools shelleyWitSigningKeys = do
5451
BalancedTxBody _ txbody _txBalanceOutput _fee
5552
<- makeTransactionBodyAutoBalance
56-
eInMode systemStart ledgerEpochInfo
53+
systemStart ledgerEpochInfo
5754
pparams stakePools utxo txbodcontent
5855
changeAddr mOverrideWits
5956

cardano-api/src/Cardano/Api/Fees.hs

+55-61
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
{-# LANGUAGE ConstraintKinds #-}
21
{-# LANGUAGE CPP #-}
2+
{-# LANGUAGE ConstraintKinds #-}
33
{-# LANGUAGE DataKinds #-}
44
{-# LANGUAGE EmptyCase #-}
55
{-# LANGUAGE FlexibleContexts #-}
@@ -10,7 +10,6 @@
1010
{-# LANGUAGE StandaloneDeriving #-}
1111

1212
{-# OPTIONS_GHC -Wno-unticked-promoted-constructors #-}
13-
{-# LANGUAGE AllowAmbiguousTypes #-}
1413

1514
-- | Fee calculation
1615
--
@@ -42,6 +41,7 @@ module Cardano.Api.Fees (
4241
mapTxScriptWitnesses,
4342
) where
4443

44+
import Control.Monad (forM_)
4545
import qualified Data.Array as Array
4646
import Data.Bifunctor (bimap, first)
4747
import qualified Data.ByteString as BS
@@ -102,7 +102,6 @@ import Cardano.Api.Address
102102
import Cardano.Api.Certificate
103103
import Cardano.Api.Eras
104104
import Cardano.Api.Error
105-
import Cardano.Api.Modes
106105
import Cardano.Api.NetworkId
107106
import Cardano.Api.ProtocolParameters
108107
import Cardano.Api.Query
@@ -238,31 +237,30 @@ estimateTransactionFee _ _ _ (ByronTx _) =
238237
--
239238
evaluateTransactionFee :: forall era.
240239
IsShelleyBasedEra era
241-
=> ProtocolParameters
240+
=> BundledProtocolParameters era
242241
-> TxBody era
243242
-> Word -- ^ The number of Shelley key witnesses
244243
-> Word -- ^ The number of Byron key witnesses
245244
-> Lovelace
246245
evaluateTransactionFee _ _ _ byronwitcount | byronwitcount > 0 =
247246
error "evaluateTransactionFee: TODO support Byron key witnesses"
248247

249-
evaluateTransactionFee pparams txbody keywitcount _byronwitcount =
248+
evaluateTransactionFee bpparams txbody keywitcount _byronwitcount =
250249
case makeSignedTransaction [] txbody of
251250
ByronTx{} -> case shelleyBasedEra :: ShelleyBasedEra era of {}
252251
--TODO: we could actually support Byron here, it'd be different but simpler
253252

254-
ShelleyTx era tx -> withLedgerConstraints era (evalShelleyBasedEra era tx)
253+
ShelleyTx era tx -> withLedgerConstraints era (evalShelleyBasedEra tx)
255254
where
256255
evalShelleyBasedEra :: forall ledgerera.
257256
ShelleyLedgerEra era ~ ledgerera
258257
=> Ledger.CLI ledgerera
259-
=> ShelleyBasedEra era
260-
-> Ledger.Tx ledgerera
258+
=> Ledger.Tx ledgerera
261259
-> Lovelace
262-
evalShelleyBasedEra era tx =
260+
evalShelleyBasedEra tx =
263261
fromShelleyLovelace $
264262
Ledger.evaluateTransactionFee
265-
(toLedgerPParams era pparams)
263+
(unbundleLedgerShelleyBasedProtocolParams shelleyBasedEra bpparams)
266264
tx
267265
keywitcount
268266

@@ -505,40 +503,41 @@ instance Error TransactionValidityError where
505503
-- are actually used.
506504
--
507505
evaluateTransactionExecutionUnits
508-
:: forall era mode.
509-
EraInMode era mode
510-
-> SystemStart
506+
:: forall era.
507+
SystemStart
511508
-> LedgerEpochInfo
512-
-> ProtocolParameters
509+
-> BundledProtocolParameters era
513510
-> UTxO era
514511
-> TxBody era
515512
-> Either TransactionValidityError
516513
(Map ScriptWitnessIndex (Either ScriptExecutionError ExecutionUnits))
517-
evaluateTransactionExecutionUnits _eraInMode systemstart (LedgerEpochInfo ledgerEpochInfo)
518-
pparams utxo txbody =
514+
evaluateTransactionExecutionUnits systemstart epochInfo bpp utxo txbody =
519515
case makeSignedTransaction [] txbody of
520-
ByronTx {} -> evalPreAlonzo
521-
ShelleyTx era tx' ->
522-
case era of
516+
ByronTx {} -> evalPreAlonzo
517+
ShelleyTx sbe tx' ->
518+
case sbe of
523519
ShelleyBasedEraShelley -> evalPreAlonzo
524520
ShelleyBasedEraAllegra -> evalPreAlonzo
525521
ShelleyBasedEraMary -> evalPreAlonzo
526-
ShelleyBasedEraAlonzo -> evalAlonzo era tx'
522+
ShelleyBasedEraAlonzo -> evalAlonzo sbe tx'
527523
ShelleyBasedEraBabbage ->
528-
case collateralSupportedInEra $ shelleyBasedToCardanoEra era of
529-
Just supp -> obtainHasFieldConstraint supp $ evalBabbage era tx'
524+
case collateralSupportedInEra $ shelleyBasedToCardanoEra sbe of
525+
Just supp -> obtainHasFieldConstraint supp $ evalBabbage sbe tx'
530526
Nothing -> return mempty
531527
ShelleyBasedEraConway ->
532-
case collateralSupportedInEra $ shelleyBasedToCardanoEra era of
533-
Just supp -> obtainHasFieldConstraint supp $ evalConway era tx'
528+
case collateralSupportedInEra $ shelleyBasedToCardanoEra sbe of
529+
Just supp -> obtainHasFieldConstraint supp $ evalConway sbe tx'
534530
Nothing -> return mempty
535531
where
536-
-- Pre-Alonzo eras do not support languages with execution unit accounting.
532+
LedgerEpochInfo ledgerEpochInfo = epochInfo
533+
534+
-- | Pre-Alonzo eras do not support languages with execution unit accounting.
537535
evalPreAlonzo :: Either TransactionValidityError
538536
(Map ScriptWitnessIndex
539-
(Either ScriptExecutionError ExecutionUnits))
537+
(Either ScriptExecutionError ExecutionUnits))
540538
evalPreAlonzo = Right Map.empty
541539

540+
542541
evalAlonzo :: forall ledgerera.
543542
ShelleyLedgerEra era ~ ledgerera
544543
=> ledgerera ~ Alonzo.AlonzoEra Ledger.StandardCrypto
@@ -551,9 +550,9 @@ evaluateTransactionExecutionUnits _eraInMode systemstart (LedgerEpochInfo ledger
551550
(Map ScriptWitnessIndex
552551
(Either ScriptExecutionError ExecutionUnits))
553552
evalAlonzo era tx = do
554-
cModelArray <- toAlonzoCostModelsArray (protocolParamCostModels pparams)
553+
cModelArray <- toAlonzoCostModelsArray (protocolParamCostModels (unbundleProtocolParams bpp))
555554
case Alonzo.evaluateTransactionExecutionUnits
556-
(toLedgerPParams era pparams)
555+
(unbundleLedgerShelleyBasedProtocolParams era bpp)
557556
tx
558557
(toLedgerUTxO era utxo)
559558
ledgerEpochInfo
@@ -573,9 +572,9 @@ evaluateTransactionExecutionUnits _eraInMode systemstart (LedgerEpochInfo ledger
573572
(Map ScriptWitnessIndex
574573
(Either ScriptExecutionError ExecutionUnits))
575574
evalBabbage era tx = do
576-
costModelsArray <- toAlonzoCostModelsArray (protocolParamCostModels pparams)
575+
costModelsArray <- toAlonzoCostModelsArray (protocolParamCostModels (unbundleProtocolParams bpp))
577576
case Alonzo.evaluateTransactionExecutionUnits
578-
(toLedgerPParams era pparams)
577+
(unbundleLedgerShelleyBasedProtocolParams era bpp)
579578
tx
580579
(toLedgerUTxO era utxo)
581580
ledgerEpochInfo
@@ -595,9 +594,9 @@ evaluateTransactionExecutionUnits _eraInMode systemstart (LedgerEpochInfo ledger
595594
(Map ScriptWitnessIndex
596595
(Either ScriptExecutionError ExecutionUnits))
597596
evalConway era tx = do
598-
costModelsArray <- toAlonzoCostModelsArray (protocolParamCostModels pparams)
597+
costModelsArray <- toAlonzoCostModelsArray (protocolParamCostModels (unbundleProtocolParams bpp))
599598
case Alonzo.evaluateTransactionExecutionUnits
600-
(toLedgerPParams era pparams)
599+
(toLedgerPParams era (unbundleProtocolParams bpp))
601600
tx
602601
(toLedgerUTxO era utxo)
603602
ledgerEpochInfo
@@ -662,7 +661,6 @@ evaluateTransactionExecutionUnits _eraInMode systemstart (LedgerEpochInfo ledger
662661
obtainHasFieldConstraint CollateralInBabbageEra f = f
663662
obtainHasFieldConstraint CollateralInConwayEra f = f
664663

665-
666664
-- ----------------------------------------------------------------------------
667665
-- Transaction balance
668666
--
@@ -675,7 +673,7 @@ evaluateTransactionExecutionUnits _eraInMode systemstart (LedgerEpochInfo ledger
675673
--
676674
evaluateTransactionBalance :: forall era.
677675
IsShelleyBasedEra era
678-
=> ProtocolParameters
676+
=> BundledProtocolParameters era
679677
-> Set PoolId
680678
-> UTxO era
681679
-> TxBody era
@@ -684,7 +682,7 @@ evaluateTransactionBalance _ _ _ (ByronTxBody _) =
684682
case shelleyBasedEra :: ShelleyBasedEra era of {}
685683
--TODO: we could actually support Byron here, it'd be different but simpler
686684

687-
evaluateTransactionBalance pparams poolids utxo
685+
evaluateTransactionBalance bpp poolids utxo
688686
(ShelleyTxBody era txbody _ _ _ _) =
689687
withLedgerConstraints
690688
era
@@ -716,7 +714,7 @@ evaluateTransactionBalance pparams poolids utxo
716714
evalMultiAsset evidence =
717715
TxOutValue evidence . fromMaryValue $
718716
Ledger.evaluateTransactionBalance
719-
(toLedgerPParams era pparams)
717+
(unbundleLedgerShelleyBasedProtocolParams era bpp)
720718
(toLedgerUTxO era utxo)
721719
isNewPool
722720
txbody
@@ -731,7 +729,7 @@ evaluateTransactionBalance pparams poolids utxo
731729
evalAdaOnly evidence =
732730
TxOutAdaOnly evidence . fromShelleyLovelace
733731
$ Ledger.evaluateTransactionBalance
734-
(toLedgerPParams era pparams)
732+
(unbundleLedgerShelleyBasedProtocolParams era bpp)
735733
(toLedgerUTxO era utxo)
736734
isNewPool
737735
txbody
@@ -952,10 +950,9 @@ data BalancedTxBody era
952950
-- which can be queried from a local node.
953951
--
954952
makeTransactionBodyAutoBalance
955-
:: forall era mode.
953+
:: forall era.
956954
IsShelleyBasedEra era
957-
=> EraInMode era mode
958-
-> SystemStart
955+
=> SystemStart
959956
-> LedgerEpochInfo
960957
-> ProtocolParameters
961958
-> Set PoolId -- ^ The set of registered stake pools
@@ -964,7 +961,7 @@ makeTransactionBodyAutoBalance
964961
-> AddressInEra era -- ^ Change address
965962
-> Maybe Word -- ^ Override key witnesses
966963
-> Either TxBodyErrorAutoBalance (BalancedTxBody era)
967-
makeTransactionBodyAutoBalance eraInMode systemstart history pparams
964+
makeTransactionBodyAutoBalance systemstart history pparams
968965
poolids utxo txbodycontent changeaddr mnkeys = do
969966

970967
-- Our strategy is to:
@@ -982,9 +979,8 @@ makeTransactionBodyAutoBalance eraInMode systemstart history pparams
982979

983980
exUnitsMap <- first TxBodyErrorValidityInterval $
984981
evaluateTransactionExecutionUnits
985-
eraInMode
986982
systemstart history
987-
pparams
983+
bpparams
988984
utxo
989985
txbody0
990986

@@ -1025,7 +1021,7 @@ makeTransactionBodyAutoBalance eraInMode systemstart history pparams
10251021

10261022
let nkeys = fromMaybe (estimateTransactionKeyWitnessCount txbodycontent1)
10271023
mnkeys
1028-
fee = evaluateTransactionFee pparams txbody1 nkeys 0 --TODO: byron keys
1024+
fee = evaluateTransactionFee bpparams txbody1 nkeys 0 --TODO: byron keys
10291025
(retColl, reqCol) = calcReturnAndTotalCollateral
10301026
fee pparams (txInsCollateral txbodycontent)
10311027
(txReturnCollateral txbodycontent)
@@ -1041,9 +1037,9 @@ makeTransactionBodyAutoBalance eraInMode systemstart history pparams
10411037
txReturnCollateral = retColl,
10421038
txTotalCollateral = reqCol
10431039
}
1044-
let balance = evaluateTransactionBalance pparams poolids utxo txbody2
1040+
let balance = evaluateTransactionBalance bpparams poolids utxo txbody2
10451041

1046-
mapM_ (`checkMinUTxOValue` pparams) $ txOuts txbodycontent1
1042+
forM_ (txOuts txbodycontent1) $ \txout -> checkMinUTxOValue txout bpparams
10471043

10481044
-- check if the balance is positive or negative
10491045
-- in one case we can produce change, in the other the inputs are insufficient
@@ -1078,6 +1074,8 @@ makeTransactionBodyAutoBalance eraInMode systemstart history pparams
10781074
createAndValidateTransactionBody finalTxBodyContent
10791075
return (BalancedTxBody finalTxBodyContent txbody3 (TxOut changeaddr balance TxOutDatumNone ReferenceScriptNone) fee)
10801076
where
1077+
bpparams = bundleProtocolParams era' pparams
1078+
10811079
-- Essentially we check for the existence of collateral inputs. If they exist we
10821080
-- create a fictitious collateral return output. Why? Because we need to put dummy values
10831081
-- to get a fee estimate (i.e we overestimate the fee.)
@@ -1183,19 +1181,18 @@ makeTransactionBodyAutoBalance eraInMode systemstart history pparams
11831181
| txOutValueToLovelace balance < 0 =
11841182
Left . TxBodyErrorAdaBalanceNegative $ txOutValueToLovelace balance
11851183
| otherwise =
1186-
case checkMinUTxOValue (TxOut changeaddr balance TxOutDatumNone ReferenceScriptNone) pparams of
1184+
case checkMinUTxOValue (TxOut changeaddr balance TxOutDatumNone ReferenceScriptNone) bpparams of
11871185
Left (TxBodyErrorMinUTxONotMet txOutAny minUTxO) ->
11881186
Left $ TxBodyErrorAdaBalanceTooSmall txOutAny minUTxO (txOutValueToLovelace balance)
11891187
Left err -> Left err
11901188
Right _ -> Right ()
11911189

11921190
checkMinUTxOValue
11931191
:: TxOut CtxTx era
1194-
-> ProtocolParameters
1192+
-> BundledProtocolParameters era
11951193
-> Either TxBodyErrorAutoBalance ()
1196-
checkMinUTxOValue txout@(TxOut _ v _ _) pparams' = do
1197-
minUTxO <- first TxBodyErrorMinUTxOMissingPParams
1198-
$ calculateMinimumUTxO era txout pparams'
1194+
checkMinUTxOValue txout@(TxOut _ v _ _) bpp = do
1195+
minUTxO <- first TxBodyErrorMinUTxOMissingPParams $ calculateMinimumUTxO era txout bpp
11991196
if txOutValueToLovelace v >= minUTxO
12001197
then Right ()
12011198
else Left $ TxBodyErrorMinUTxONotMet
@@ -1356,36 +1353,33 @@ mapTxScriptWitnesses f txbodycontent@TxBodyContent {
13561353
calculateMinimumUTxO
13571354
:: ShelleyBasedEra era
13581355
-> TxOut CtxTx era
1359-
-> ProtocolParameters
1356+
-> BundledProtocolParameters era
13601357
-> Either MinimumUTxOError Lovelace
1361-
calculateMinimumUTxO era txout@(TxOut _ v _ _) pparams' =
1358+
calculateMinimumUTxO era txout@(TxOut _ v _ _) bpp =
13621359
case era of
1363-
ShelleyBasedEraShelley -> getMinUTxOPreAlonzo pparams'
1360+
ShelleyBasedEraShelley -> getMinUTxOPreAlonzo (unbundleProtocolParams bpp)
13641361
ShelleyBasedEraAllegra -> calcMinUTxOAllegraMary
13651362
ShelleyBasedEraMary -> calcMinUTxOAllegraMary
13661363
ShelleyBasedEraAlonzo ->
13671364
let lTxOut = toShelleyTxOutAny era txout
1368-
babPParams = toAlonzoPParams pparams'
1369-
minUTxO = Shelley.evaluateMinLovelaceOutput babPParams lTxOut
1365+
minUTxO = Shelley.evaluateMinLovelaceOutput (unbundleLedgerShelleyBasedProtocolParams era bpp) lTxOut
13701366
val = fromShelleyLovelace minUTxO
13711367
in Right val
13721368
ShelleyBasedEraBabbage ->
13731369
let lTxOut = toShelleyTxOutAny era txout
1374-
babPParams = toBabbagePParams pparams'
1375-
minUTxO = Shelley.evaluateMinLovelaceOutput babPParams lTxOut
1370+
minUTxO = Shelley.evaluateMinLovelaceOutput (unbundleLedgerShelleyBasedProtocolParams era bpp) lTxOut
13761371
val = fromShelleyLovelace minUTxO
13771372
in Right val
13781373
ShelleyBasedEraConway ->
13791374
let lTxOut = toShelleyTxOutAny era txout
1380-
babPParams = toConwayPParams pparams'
1381-
minUTxO = Shelley.evaluateMinLovelaceOutput babPParams lTxOut
1375+
minUTxO = Shelley.evaluateMinLovelaceOutput (unbundleLedgerShelleyBasedProtocolParams era bpp) lTxOut
13821376
val = fromShelleyLovelace minUTxO
13831377
in Right val
13841378
where
13851379
calcMinUTxOAllegraMary :: Either MinimumUTxOError Lovelace
13861380
calcMinUTxOAllegraMary = do
13871381
let val = txOutValueToValue v
1388-
minUTxO <- getMinUTxOPreAlonzo pparams'
1382+
minUTxO <- getMinUTxOPreAlonzo (unbundleProtocolParams bpp)
13891383
Right $ calcMinimumDeposit val minUTxO
13901384

13911385
getMinUTxOPreAlonzo

0 commit comments

Comments
 (0)