Protocol Parameters Reference

Cardano protocol parameters control fees, block sizes, staking mechanics, script execution budgets, and governance. Every one of them is mutable through a ParameterChange governance action, so the values below are not constants — always query a node for truth.

Mainnet values in this page were read from mainnet epoch 646. They are included to give a sense of scale, not as defaults. Re-read them from a node before relying on any of them.

Querying Parameters

dugite-cli query protocol-parameters \
  --socket-path ./node.sock \
  --out-file protocol-params.json

The JSON key names in the tables below are the cardano-cli-compatible names that dugite-cli emits and accepts. They are not the Rust field names and they are not produced by serde — they are written by the N2C client decoder in crates/dugite-network/src/n2c_client.rs. Where cardano-cli accepts an older alias, both are listed.

Fee Parameters

ParameterJSON KeyDescriptionMainnet value
Min fee coefficienttxFeePerByte / minFeeAFee per byte of transaction size44
Min fee constanttxFeeFixed / minFeeBFixed fee component155381
Min UTxO cost per byteutxoCostPerByte / coinsPerUTxOByteMinimum lovelace per byte of UTxO (Babbage+)4310
Reference script feeminFeeRefScriptCostPerByteTiered fee per byte of reference script (Conway)15

The base transaction fee formula is:

fee = txFeePerByte * tx_size_in_bytes + txFeeFixed

Conway adds a tiered reference-script surcharge on top, growing geometrically with total reference-script size.

Minimum-UTxO is era-dispatched, not one formula. Dugite selects the per-era Haskell calculation from the protocol version in force (issue #919): flat minUTxOValue at PV ≤ 3; Mary scaledMinDeposit at PV 4; Alonzo (27 + size + dataHashSize) × coinsPerUTxOWord at PV 5–6; Babbage (160 + size) × coinsPerUTxOByte at PV ≥ 7. Key 17 therefore means coinsPerUTxOWord before Babbage and coinsPerUTxOByte from Babbage on.

Block Size Parameters

ParameterJSON KeyDescriptionMainnet value
Max block body sizemaxBlockBodySizeMaximum block body size in bytes90112
Max transaction sizemaxTxSizeMaximum transaction size in bytes16384
Max block header sizemaxBlockHeaderSizeMaximum block header size in bytes1100

Staking Parameters

ParameterJSON KeyDescriptionMainnet value
Stake address depositstakeAddressDeposit / keyDepositDeposit for stake key registration (lovelace)2000000
Pool depositstakePoolDeposit / poolDepositDeposit for pool registration (lovelace)500000000
Pool retire max epochpoolRetireMaxEpoch / eMaxMaximum future epochs for pool retirement18
Pool target countstakePoolTargetNum / nOptTarget number of pools (k parameter)500
Min pool costminPoolCostMinimum fixed pool cost (lovelace)170000000

Monetary Policy

ParameterJSON KeyDescriptionMainnet value
Monetary expansion (rho)monetaryExpansionRate of new ADA created from reserves per epoch0.003
Treasury cut (tau)treasuryCutFraction of rewards directed to the treasury0.20
Pledge influence (a0)poolPledgeInfluenceHow pledge affects reward calculation0.3

These three are exact rationals on the wire (CBOR tag 30), not floats. Dugite parses genesis values as exact Scientific and never through an f64 intermediate — a lossy parse here diverges the reward calculation.

Plutus Execution Parameters

ParameterJSON KeyDescriptionMainnet value
Execution unit pricesexecutionUnitPrices{priceMemory, priceSteps} rationals{0.0577, 0.0000721}
Max tx execution unitsmaxTxExecutionUnits{memory, steps} per transaction{16500000, 10000000000}
Max block execution unitsmaxBlockExecutionUnits{memory, steps} per block{72000000, 20000000000}
Max value sizemaxValueSizeMaximum serialized value size in bytes5000
Collateral percentagecollateralPercentageCollateral % of total tx fee for Plutus txs150
Max collateral inputsmaxCollateralInputsMaximum collateral inputs per tx3
Cost modelscostModelsPer-language builtin cost vectors (PlutusV1PlutusV3)

maxValueSize is compared with a strict >, against a size computed with Haskell encodeMap semantics — indefinite-length CBOR map headers above 23 entries, definite at or below. Getting that wrong over-counts by one byte on large asset maps and produces a false Phase-1 rejection (issue #930).

Governance Parameters (Conway)

ParameterJSON KeyDescriptionMainnet value
DRep depositdRepDepositDeposit for DRep registration (lovelace)500000000
DRep activitydRepActivityEpochs of inactivity before a DRep goes dormant20
Gov action depositgovActionDepositDeposit for governance action submission (lovelace)100000000000
Gov action lifetimegovActionLifetimeGovernance action expiry (epochs)6
Committee min sizecommitteeMinSizeMinimum constitutional committee size5
Committee max termcommitteeMaxTermLengthMaximum committee member term (epochs)146

Voting Thresholds

The threshold parameters travel on the wire as two fixed-order arrays, not as individual keys: poolVotingThresholds (5 entries, CBOR key 25) and drepVotingThresholds (10 entries, CBOR key 26).

poolVotingThresholds — array order:

PositionJSON Key
0pvtMotionNoConfidence
1pvtCommitteeNormal
2pvtCommitteeNoConfidence
3pvtHardForkInitiation
4pvtPPSecurityGroup

drepVotingThresholds — array order:

PositionJSON Key
0dvtMotionNoConfidence
1dvtCommitteeNormal
2dvtCommitteeNoConfidence
3dvtUpdateToConstitution
4dvtHardForkInitiation
5dvtPPNetworkGroup
6dvtPPEconomicGroup
7dvtPPTechnicalGroup
8dvtPPGovGroup
9dvtTreasuryWithdrawal

Which body votes on what

This is the ratification matrix Dugite implements, matching Haskell Conway.Rules.Ratify. "—" means that body does not vote on the action at all (it is not an abstention — the check is simply absent).

Action typeDRep thresholdSPO thresholdConstitutional Committee
No ConfidencedvtMotionNoConfidencepvtMotionNoConfidence
Update Committee (normal)dvtCommitteeNormalpvtCommitteeNormal
Update Committee (under no-confidence)dvtCommitteeNoConfidencepvtCommitteeNoConfidence
New ConstitutiondvtUpdateToConstitutionvotes
Hard Fork InitiationdvtHardForkInitiationpvtHardForkInitiationvotes
Parameter Changeevery affected group's dvtPP*Group must pass independentlypvtPPSecurityGroup, only if a security-tagged parameter is touchedvotes
Treasury WithdrawaldvtTreasuryWithdrawalvotes
Infonever ratifies (informational only)

Two consequences worth internalising:

  • There is no pvtPPEconomicGroup. The only SPO threshold for parameter changes is pvtPPSecurityGroup, and SPOs are excluded entirely from a parameter change that touches no security-tagged parameter.
  • A parameter change spanning several groups must clear each group's DRep threshold, not just the highest one.

During the Conway bootstrap phase, DRep thresholds are treated as zero (always met) and only the SPO and committee checks bind.

CBOR keys for a ProtocolParamUpdate

Governance actions carry parameter changes as a sparse CBOR map keyed by integer. This is the complete table Dugite encodes and decodes.

KeyParameterNotes
0txFeePerByte / minFeeA
1txFeeFixed / minFeeB
2maxBlockBodySize
3maxTxSize
4maxBlockHeaderSize
5stakeAddressDeposit / keyDeposit
6stakePoolDeposit / poolDeposit
7poolRetireMaxEpoch / eMax
8stakePoolTargetNum / nOpt
9poolPledgeInfluence (a0)CBOR tag 30 rational
10monetaryExpansion (rho)CBOR tag 30 rational
11treasuryCut (tau)CBOR tag 30 rational
12decentralization (d)pre-Conway only — decode only
13extraEntropypre-Conway only — decode only
14protocolVersionpre-Conway only[major, minor], decode only
15minUTxOValuepre-Conway only — decode only (restored in #919)
16minPoolCost
17coinsPerUTxOWord / utxoCostPerByteMeaning depends on the PV in force before this update's own PV bump
18costModelsmap {0: PlutusV1, 1: PlutusV2, 2: PlutusV3, 3: PlutusV4}
19executionUnitPrices[memPrice, stepPrice]
20maxTxExecutionUnits[mem, steps]
21maxBlockExecutionUnits[mem, steps]
22maxValueSize
23collateralPercentage
24maxCollateralInputs
25poolVotingThresholdsarray of 5 rationals, order above
26drepVotingThresholdsarray of 10 rationals, order above
27committeeMinSize
28committeeMaxTermLength
29govActionLifetime
30govActionDeposit
31dRepDeposit
32dRepActivity
33minFeeRefScriptCostPerByteCBOR tag 30 rational
34maxRefScriptSizePerBlockDijkstra — decode only
35maxRefScriptSizePerTxDijkstra — decode only
36refScriptCostStrideDijkstra — decode only
37refScriptCostMultiplierDijkstra — decode only

Notes on asymmetry, because it bites:

  • Keys 12–15 exist only in the pre-Conway (Shelley → Babbage) update shape. Dugite decodes them for historical replay; the Conway encoder never emits them, and the Conway decoder skips them.
  • Keys 34–37 are the unreleased Dijkstra era. They decode but are not encoded.
  • Key 30 is govActionDeposit and key 31 is dRepDeposit — the order is the opposite of what the alphabetical reading suggests, and swapping them silently produces a valid-looking but wrong proposal.

Encoder: crates/dugite-serialization/src/encode/protocol_params.rs. Decoders: crates/dugite-serialization/src/decode/era_conway.rs (Conway and later) and .../era_shelley.rs (pre-Conway).

N2C wire encoding of the current parameters

The GetCurrentPParams LocalStateQuery reply is not the sparse integer-keyed map above. It is a positional CBOR array(31), indices 0–30, matching Haskell's EncCBOR (ConwayPParams Identity ConwayEra). The two layouts are different and are not interchangeable.

IndexParameterIndexParameter
0txFeePerByte16executionUnitPrices
1txFeeFixed17maxTxExecutionUnits
2maxBlockBodySize18maxBlockExecutionUnits
3maxTxSize19maxValueSize
4maxBlockHeaderSize20collateralPercentage
5stakeAddressDeposit21maxCollateralInputs
6stakePoolDeposit22poolVotingThresholds
7poolRetireMaxEpoch23drepVotingThresholds
8stakePoolTargetNum24committeeMinSize
9poolPledgeInfluence25committeeMaxTermLength
10monetaryExpansion26govActionLifetime
11treasuryCut27govActionDeposit
12protocolVersion ([major, minor])28dRepDeposit
13minPoolCost29dRepActivity
14utxoCostPerByte30minFeeRefScriptCostPerByte
15costModels

Every index 0–30 is populated; there are no gaps and no Dijkstra slots. GetGenesisConfig uses a different, legacy Shelley-era layout — array(18) on N2C v16–v20 and array(17) on v21+.

Encoder: crates/dugite-node/src/node/n2c_query/encoding.rs (encode_protocol_params_cbor). Client-side decoder to cardano-cli JSON: crates/dugite-network/src/n2c_client.rs (parse_protocol_params_cbor).