Skip to content

Commit c02b0ab

Browse files
authored
Merge pull request #4903 from input-output-hk/newhoggy/reduce-number-of-calls-to-toLedgerPParams
Reduce number of calls to toLedgerPParams
2 parents d91516b + 228889f commit c02b0ab

File tree

10 files changed

+177
-133
lines changed

10 files changed

+177
-133
lines changed

Diff for: cardano-api/ChangeLog.md

+5
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@
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+
New type `BundledProtocolParameters` and new functions `bundleProtocolParams` and `unbundleProtocolParams`.
37+
([PR4903](https://github.com/input-output-hk/cardano-node/pull/4903))
38+
3439
### Bugs
3540

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

Diff for: 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,

Diff for: 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

Diff for: 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)