-
Notifications
You must be signed in to change notification settings - Fork 339
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
CIP-0028 | Alonzo Protocol Parameter Description #140
Merged
Merged
Changes from all commits
Commits
Show all changes
11 commits
Select commit
Hold shift + click to select a range
3fd6566
added CIP for initial parameters
kevinhammond f0d55c8
Updated in line with comments
kevinhammond 70e7817
Update Initial.md
kevinhammond 5386007
Update Initial.md
kevinhammond cfcdf08
Update Initial.md
kevinhammond 4f12803
Filename, adding CIP#, Status -> 'Draft'
crptmppt 4a49bc1
CIP moved to proper dir
crptmppt 2aa413f
Merge branch 'cardano-foundation:master' into master
kevinhammond bbcd814
created new CIP describing Alonzo parameters
kevinhammond 46d7441
Update and rename CIP-0009a/CIP-0009.md to CIP-0028/CIP-0028.md
crptmppt 1f12a67
Rename CIP-0028.md to README.md
crptmppt File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,293 @@ | ||
--- | ||
CIP: 28 | ||
Title: Protocol Parameters (Alonzo) | ||
Authors: Kevin Hammond <kevin.hammond@iohk.io> | ||
Status: Draft | ||
Type: Informational | ||
Created: 2021-10-14 | ||
License: CC-BY-4.0 | ||
Requires: CIP-0009 | ||
--- | ||
|
||
## Simple Summary/Abstract | ||
|
||
This CIP extends CIP-0009 to include the new protocol parameters that have been introduced for Alonzo, specifically those relating to the costing of Plutus scripts. It describes the initial settings for those parameters. | ||
|
||
## Motivation | ||
|
||
We need to document the chain of changes to the protocol parameters. This document describes precisely the changes that have been made from CIP-0009, allowing the differences to be determined. It thus supplements rather than replaces CIP-0009. | ||
|
||
## Specification | ||
|
||
|
||
### New Updatable Protocol Parameters | ||
|
||
The new **updatable** protocol parameter values for Alonzo are given below (in JSON format). Any of these parameters may be changed by submitting | ||
a parameter update proposal to the chain, and without triggering a "hard fork". Note that these parameters are given using the names used | ||
in the genesis file. Be aware that some parameters are shown differently using ``cardano-cli query protocol-parameters`` -- this has been raised | ||
as an issue with the development team. | ||
|
||
``` | ||
{ | ||
"lovelacePerUTxOWord": 34482, | ||
"executionPrices": { | ||
"prSteps": | ||
{ | ||
"numerator" : 721, | ||
"denominator" : 10000000 | ||
}, | ||
"prMem": | ||
{ | ||
"numerator" : 577, | ||
"denominator" : 10000 | ||
} | ||
}, | ||
"maxTxExUnits": { | ||
"exUnitsMem": 10000000, | ||
"exUnitsSteps": 10000000000 | ||
}, | ||
"maxBlockExUnits": { | ||
"exUnitsMem": 50000000, | ||
"exUnitsSteps": 40000000000 | ||
}, | ||
"maxValueSize": 5000, | ||
"collateralPercentage": 150, | ||
"maxCollateralInputs": 3, | ||
"costModels": { | ||
"PlutusV1": { | ||
"sha2_256-memory-arguments": 4, | ||
"equalsString-cpu-arguments-constant": 1000, | ||
"cekDelayCost-exBudgetMemory": 100, | ||
"lessThanEqualsByteString-cpu-arguments-intercept": 103599, | ||
"divideInteger-memory-arguments-minimum": 1, | ||
"appendByteString-cpu-arguments-slope": 621, | ||
"blake2b-cpu-arguments-slope": 29175, | ||
"iData-cpu-arguments": 150000, | ||
"encodeUtf8-cpu-arguments-slope": 1000, | ||
"unBData-cpu-arguments": 150000, | ||
"multiplyInteger-cpu-arguments-intercept": 61516, | ||
"cekConstCost-exBudgetMemory": 100, | ||
"nullList-cpu-arguments": 150000, | ||
"equalsString-cpu-arguments-intercept": 150000, | ||
"trace-cpu-arguments": 150000, | ||
"mkNilData-memory-arguments": 32, | ||
"lengthOfByteString-cpu-arguments": 150000, | ||
"cekBuiltinCost-exBudgetCPU": 29773, | ||
"bData-cpu-arguments": 150000, | ||
"subtractInteger-cpu-arguments-slope": 0, | ||
"unIData-cpu-arguments": 150000, | ||
"consByteString-memory-arguments-intercept": 0, | ||
"divideInteger-memory-arguments-slope": 1, | ||
"divideInteger-cpu-arguments-model-arguments-slope": 118, | ||
"listData-cpu-arguments": 150000, | ||
"headList-cpu-arguments": 150000, | ||
"chooseData-memory-arguments": 32, | ||
"equalsInteger-cpu-arguments-intercept": 136542, | ||
"sha3_256-cpu-arguments-slope": 82363, | ||
"sliceByteString-cpu-arguments-slope": 5000, | ||
"unMapData-cpu-arguments": 150000, | ||
"lessThanInteger-cpu-arguments-intercept": 179690, | ||
"mkCons-cpu-arguments": 150000, | ||
"appendString-memory-arguments-intercept": 0, | ||
"modInteger-cpu-arguments-model-arguments-slope": 118, | ||
"ifThenElse-cpu-arguments": 1, | ||
"mkNilPairData-cpu-arguments": 150000, | ||
"lessThanEqualsInteger-cpu-arguments-intercept": 145276, | ||
"addInteger-memory-arguments-slope": 1, | ||
"chooseList-memory-arguments": 32, | ||
"constrData-memory-arguments": 32, | ||
"decodeUtf8-cpu-arguments-intercept": 150000, | ||
"equalsData-memory-arguments": 1, | ||
"subtractInteger-memory-arguments-slope": 1, | ||
"appendByteString-memory-arguments-intercept": 0, | ||
"lengthOfByteString-memory-arguments": 4, | ||
"headList-memory-arguments": 32, | ||
"listData-memory-arguments": 32, | ||
"consByteString-cpu-arguments-intercept": 150000, | ||
"unIData-memory-arguments": 32, | ||
"remainderInteger-memory-arguments-minimum": 1, | ||
"bData-memory-arguments": 32, | ||
"lessThanByteString-cpu-arguments-slope": 248, | ||
"encodeUtf8-memory-arguments-intercept": 0, | ||
"cekStartupCost-exBudgetCPU": 100, | ||
"multiplyInteger-memory-arguments-intercept": 0, | ||
"unListData-memory-arguments": 32, | ||
"remainderInteger-cpu-arguments-model-arguments-slope": 118, | ||
"cekVarCost-exBudgetCPU": 29773, | ||
"remainderInteger-memory-arguments-slope": 1, | ||
"cekForceCost-exBudgetCPU": 29773, | ||
"sha2_256-cpu-arguments-slope": 29175, | ||
"equalsInteger-memory-arguments": 1, | ||
"indexByteString-memory-arguments": 1, | ||
"addInteger-memory-arguments-intercept": 1, | ||
"chooseUnit-cpu-arguments": 150000, | ||
"sndPair-cpu-arguments": 150000, | ||
"cekLamCost-exBudgetCPU": 29773, | ||
"fstPair-cpu-arguments": 150000, | ||
"quotientInteger-memory-arguments-minimum": 1, | ||
"decodeUtf8-cpu-arguments-slope": 1000, | ||
"lessThanInteger-memory-arguments": 1, | ||
"lessThanEqualsInteger-cpu-arguments-slope": 1366, | ||
"fstPair-memory-arguments": 32, | ||
"modInteger-memory-arguments-intercept": 0, | ||
"unConstrData-cpu-arguments": 150000, | ||
"lessThanEqualsInteger-memory-arguments": 1, | ||
"chooseUnit-memory-arguments": 32, | ||
"sndPair-memory-arguments": 32, | ||
"addInteger-cpu-arguments-intercept": 197209, | ||
"decodeUtf8-memory-arguments-slope": 8, | ||
"equalsData-cpu-arguments-intercept": 150000, | ||
"mapData-cpu-arguments": 150000, | ||
"mkPairData-cpu-arguments": 150000, | ||
"quotientInteger-cpu-arguments-constant": 148000, | ||
"consByteString-memory-arguments-slope": 1, | ||
"cekVarCost-exBudgetMemory": 100, | ||
"indexByteString-cpu-arguments": 150000, | ||
"unListData-cpu-arguments": 150000, | ||
"equalsInteger-cpu-arguments-slope": 1326, | ||
"cekStartupCost-exBudgetMemory": 100, | ||
"subtractInteger-cpu-arguments-intercept": 197209, | ||
"divideInteger-cpu-arguments-model-arguments-intercept": 425507, | ||
"divideInteger-memory-arguments-intercept": 0, | ||
"cekForceCost-exBudgetMemory": 100, | ||
"blake2b-cpu-arguments-intercept": 2477736, | ||
"remainderInteger-cpu-arguments-constant": 148000, | ||
"tailList-cpu-arguments": 150000, | ||
"encodeUtf8-cpu-arguments-intercept": 150000, | ||
"equalsString-cpu-arguments-slope": 1000, | ||
"lessThanByteString-memory-arguments": 1, | ||
"multiplyInteger-cpu-arguments-slope": 11218, | ||
"appendByteString-cpu-arguments-intercept": 396231, | ||
"lessThanEqualsByteString-cpu-arguments-slope": 248, | ||
"modInteger-memory-arguments-slope": 1, | ||
"addInteger-cpu-arguments-slope": 0, | ||
"equalsData-cpu-arguments-slope": 10000, | ||
"decodeUtf8-memory-arguments-intercept": 0, | ||
"chooseList-cpu-arguments": 150000, | ||
"constrData-cpu-arguments": 150000, | ||
"equalsByteString-memory-arguments": 1, | ||
"cekApplyCost-exBudgetCPU": 29773, | ||
"quotientInteger-memory-arguments-slope": 1, | ||
"verifySignature-cpu-arguments-intercept": 3345831, | ||
"unMapData-memory-arguments": 32, | ||
"mkCons-memory-arguments": 32, | ||
"sliceByteString-memory-arguments-slope": 1, | ||
"sha3_256-memory-arguments": 4, | ||
"ifThenElse-memory-arguments": 1, | ||
"mkNilPairData-memory-arguments": 32, | ||
"equalsByteString-cpu-arguments-slope": 247, | ||
"appendString-cpu-arguments-intercept": 150000, | ||
"quotientInteger-cpu-arguments-model-arguments-slope": 118, | ||
"cekApplyCost-exBudgetMemory": 100, | ||
"equalsString-memory-arguments": 1, | ||
"multiplyInteger-memory-arguments-slope": 1, | ||
"cekBuiltinCost-exBudgetMemory": 100, | ||
"remainderInteger-memory-arguments-intercept": 0, | ||
"sha2_256-cpu-arguments-intercept": 2477736, | ||
"remainderInteger-cpu-arguments-model-arguments-intercept": 425507, | ||
"lessThanEqualsByteString-memory-arguments": 1, | ||
"tailList-memory-arguments": 32, | ||
"mkNilData-cpu-arguments": 150000, | ||
"chooseData-cpu-arguments": 150000, | ||
"unBData-memory-arguments": 32, | ||
"blake2b-memory-arguments": 4, | ||
"iData-memory-arguments": 32, | ||
"nullList-memory-arguments": 32, | ||
"cekDelayCost-exBudgetCPU": 29773, | ||
"subtractInteger-memory-arguments-intercept": 1, | ||
"lessThanByteString-cpu-arguments-intercept": 103599, | ||
"consByteString-cpu-arguments-slope": 1000, | ||
"appendByteString-memory-arguments-slope": 1, | ||
"trace-memory-arguments": 32, | ||
"divideInteger-cpu-arguments-constant": 148000, | ||
"cekConstCost-exBudgetCPU": 29773, | ||
"encodeUtf8-memory-arguments-slope": 8, | ||
"quotientInteger-cpu-arguments-model-arguments-intercept": 425507, | ||
"mapData-memory-arguments": 32, | ||
"appendString-cpu-arguments-slope": 1000, | ||
"modInteger-cpu-arguments-constant": 148000, | ||
"verifySignature-cpu-arguments-slope": 1, | ||
"unConstrData-memory-arguments": 32, | ||
"quotientInteger-memory-arguments-intercept": 0, | ||
"equalsByteString-cpu-arguments-constant": 150000, | ||
"sliceByteString-memory-arguments-intercept": 0, | ||
"mkPairData-memory-arguments": 32, | ||
"equalsByteString-cpu-arguments-intercept": 112536, | ||
"appendString-memory-arguments-slope": 1, | ||
"lessThanInteger-cpu-arguments-slope": 497, | ||
"modInteger-cpu-arguments-model-arguments-intercept": 425507, | ||
"modInteger-memory-arguments-minimum": 1, | ||
"sha3_256-cpu-arguments-intercept": 0, | ||
"verifySignature-memory-arguments": 1, | ||
"cekLamCost-exBudgetMemory": 100, | ||
"sliceByteString-cpu-arguments-intercept": 150000 | ||
} | ||
} | ||
} | ||
``` | ||
|
||
The meaning of the fields is: | ||
|
||
| Field | Initial Value | Description | | ||
|----------------------- |------------------------------------------------------------------------ |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ||
| lovelacePerUTxOWord | 34482 | Deposit charged per word of UTxO storage. | | ||
| executionPrices | `{ "prSteps": { "numerator" : 721, "denominator" : 10000000}, "prMem": { "numerator" : 577, "denominator" : 10000 } }` | Fee per Plutus execution step and per memory unit | | ||
| maxTxExUnits | `{ "exUnitsMem": 10000000, "exUnitsSteps": 10000000000 }` | Maximum number of memory units and steps in a single transaction. | | ||
| maxBlockExUnits | `{ "exUnitsMem": 50000000, "exUnitsSteps": 40000000000 }` | Maximum number of memory units and steps in a single block. | | ||
| maxValueSize | 5000 | The limit on the serialized size of the Value in each output. | | ||
| collateralPercentage | 150 | Percentage of fee that is used as collateral for a failed transaction. | | ||
| maxCollateralInputs | 3 | Maximum number of collateral inputs in a transaction. | | ||
| costModels | `{ "PlutusV1": { ... } }` | Detailed cost models for each Plutus version. | | ||
|
||
Each version of the Plutus interpreter may use different cost model parameters and settings. Although the parameters are updatable, | ||
they are likely to be changed only when introducing new Plutus interpreter versions at a "hard fork". | ||
For simplicity, the details of the parameter settings is omitted here. | ||
|
||
### Obsoleted Updatable Protocol Parameters | ||
|
||
``minUTxOValue`` is no longer used. It is replaced by ``lovelacePerUTxOWord``. | ||
|
||
### Non-Updatable Parameters | ||
|
||
There are no changes to the non-updatable protocol parameters. | ||
|
||
## Rationale for Parameter Choices | ||
|
||
The majority of the parameters are needed to enable the use of Plutus scripts on-chain. They relate to the fees calculations for | ||
transactions that include Plutus scripts. | ||
|
||
``executionPrices`` are specified in fractions of lovelace per Plutus CPU execution step or memory unit. | ||
These have been set to be consistent with the cost for a full transaction. | ||
|
||
``lovelacePerUTxOWord`` replaces ``minUTxOValue``. | ||
Rather than determining a fixed minimum deposit, the new value scales each word that is used. | ||
The value is set to give a very similar result for an ada-only UTxO entry (previously, 1,000,000 lovelace; now 999,978 lovelace, since each ada-only | ||
UTxO entry is 29 words). | ||
|
||
``collateralPercentage``has been chosen to be higher than the transaction fee. Collateral should only be used to pay fees if a user has deliberately | ||
submitted a transaction that is known to fail. Setting the percentage high acts to discourage the submission of rogue transactions, which | ||
maliciously consume chain resources. | ||
|
||
``maxCollateralInputs`` has been set to allow the option of multiple inputs to be used to pay collateral, if needed (e.g. so that | ||
multiple instance of a transaction can be submitted without sharing a single collateral, that might restrict concurrency or cause | ||
script failure if the collateral was not available). | ||
|
||
``maxValueSize`` has been set based on benchmarking. | ||
|
||
``costModels`` has been set for ``PlutusV1`` based on benchmarking inputs. Each Plutus Core primitive has associated costs. | ||
|
||
## Change Log | ||
|
||
There have been no changes to the updatable parameters since the Alonzo hard fork. | ||
|
||
## Test Cases | ||
|
||
Not Applicable. | ||
|
||
## Implementations | ||
|
||
Not applicable. | ||
|
||
## Copyright | ||
|
||
This CIP is licensed under Apache-2.0 |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shouldn't this be a standard CIP, considering these are parameters that all node implementations should be aware of?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I feel the distinction to limit expectations: as understood this is meant as a "snapshot" CIP (and therefore might best sit as "Informational"). Current conversation around the changed block size since this PR was created is reflecting this.
This is an ongoing conversation really.