Skip to content

Commit 2d38767

Browse files
authored
feat: Alonzo protocol parameter updates (#751)
* update protocol parameter set from protocol param update spec * update protocol parameter set from genesis * move ExUnit types to common * update types for genesis Fixes #744
1 parent b9a3d41 commit 2d38767

File tree

6 files changed

+335
-57
lines changed

6 files changed

+335
-57
lines changed

ledger/alonzo/alonzo.go

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -475,48 +475,6 @@ func (t *AlonzoTransaction) Utxorpc() *utxorpc.Tx {
475475
return t.Body.Utxorpc()
476476
}
477477

478-
type ExUnit struct {
479-
cbor.StructAsArray
480-
Mem uint
481-
Steps uint
482-
}
483-
484-
type ExUnitPrice struct {
485-
cbor.StructAsArray
486-
MemPrice uint
487-
StepPrice uint
488-
}
489-
490-
type AlonzoProtocolParameters struct {
491-
mary.MaryProtocolParameters
492-
MinPoolCost uint
493-
AdaPerUtxoByte uint
494-
CostModels uint
495-
ExecutionCosts uint
496-
MaxTxExUnits uint
497-
MaxBlockExUnits uint
498-
MaxValueSize uint
499-
CollateralPercentage uint
500-
MaxCollateralInputs uint
501-
}
502-
503-
type AlonzoProtocolParameterUpdate struct {
504-
mary.MaryProtocolParameterUpdate
505-
MinPoolCost uint `cbor:"16,keyasint"`
506-
AdaPerUtxoByte uint `cbor:"17,keyasint"`
507-
CostModels map[uint][]uint `cbor:"18,keyasint"`
508-
ExecutionCosts *ExUnitPrice `cbor:"19,keyasint"`
509-
MaxTxExUnits *ExUnit `cbor:"20,keyasint"`
510-
MaxBlockExUnits *ExUnit `cbor:"21,keyasint"`
511-
MaxValueSize uint `cbor:"22,keyasint"`
512-
CollateralPercentage uint `cbor:"23,keyasint"`
513-
MaxCollateralInputs uint `cbor:"24,keyasint"`
514-
}
515-
516-
func (u *AlonzoProtocolParameterUpdate) UnmarshalCBOR(data []byte) error {
517-
return u.UnmarshalCbor(data, u)
518-
}
519-
520478
func NewAlonzoBlockFromCbor(data []byte) (*AlonzoBlock, error) {
521479
var alonzoBlock AlonzoBlock
522480
if _, err := cbor.Decode(data, &alonzoBlock); err != nil {

ledger/alonzo/genesis.go

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,18 @@ package alonzo
1717
import (
1818
"encoding/json"
1919
"io"
20+
"math/big"
2021
"os"
2122
)
2223

2324
type AlonzoGenesis struct {
2425
LovelacePerUtxoWord uint64 `json:"lovelacePerUTxOWord"`
25-
MaxValueSize int
26-
CollateralPercentage int
27-
MaxCollateralInputs int
28-
ExecutionPrices map[string]map[string]int
29-
MaxTxExUnits map[string]int
30-
MaxBlockExUnits map[string]int
26+
MaxValueSize uint
27+
CollateralPercentage uint
28+
MaxCollateralInputs uint
29+
ExecutionPrices AlonzoGenesisExecutionPrices
30+
MaxTxExUnits AlonzoGenesisExUnits
31+
MaxBlockExUnits AlonzoGenesisExUnits
3132
CostModels map[string]map[string]int
3233
}
3334

@@ -49,3 +50,29 @@ func NewAlonzoGenesisFromFile(path string) (AlonzoGenesis, error) {
4950
defer f.Close()
5051
return NewAlonzoGenesisFromReader(f)
5152
}
53+
54+
type AlonzoGenesisExUnits struct {
55+
Mem uint `json:"exUnitsMem"`
56+
Steps uint `json:"exUnitsSteps"`
57+
}
58+
59+
type AlonzoGenesisExecutionPrices struct {
60+
Steps *AlonzoGenesisExecutionPricesRat `json:"prSteps"`
61+
Mem *AlonzoGenesisExecutionPricesRat `json:"prMem"`
62+
}
63+
64+
type AlonzoGenesisExecutionPricesRat struct {
65+
*big.Rat
66+
}
67+
68+
func (r *AlonzoGenesisExecutionPricesRat) UnmarshalJSON(data []byte) error {
69+
var tmpData struct {
70+
Numerator int64 `json:"numerator"`
71+
Denominator int64 `json:"denominator"`
72+
}
73+
if err := json.Unmarshal(data, &tmpData); err != nil {
74+
return err
75+
}
76+
r.Rat = big.NewRat(tmpData.Numerator, tmpData.Denominator)
77+
return nil
78+
}

ledger/alonzo/genesis_test.go

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package alonzo_test
1616

1717
import (
18+
"math/big"
1819
"reflect"
1920
"strings"
2021
"testing"
@@ -226,17 +227,21 @@ var expectedGenesisObj = alonzo.AlonzoGenesis{
226227
MaxValueSize: 5000,
227228
CollateralPercentage: 150,
228229
MaxCollateralInputs: 3,
229-
ExecutionPrices: map[string]map[string]int{
230-
"prMem": {"denominator": 10000, "numerator": 577},
231-
"prSteps": {"denominator": 10000000, "numerator": 721},
230+
ExecutionPrices: alonzo.AlonzoGenesisExecutionPrices{
231+
Mem: &alonzo.AlonzoGenesisExecutionPricesRat{
232+
Rat: big.NewRat(577, 10000),
233+
},
234+
Steps: &alonzo.AlonzoGenesisExecutionPricesRat{
235+
Rat: big.NewRat(721, 10000000),
236+
},
232237
},
233-
MaxTxExUnits: map[string]int{
234-
"exUnitsMem": 10000000,
235-
"exUnitsSteps": 10000000000,
238+
MaxTxExUnits: alonzo.AlonzoGenesisExUnits{
239+
Mem: 10000000,
240+
Steps: 10000000000,
236241
},
237-
MaxBlockExUnits: map[string]int{
238-
"exUnitsMem": 50000000,
239-
"exUnitsSteps": 40000000000,
242+
MaxBlockExUnits: alonzo.AlonzoGenesisExUnits{
243+
Mem: 50000000,
244+
Steps: 40000000000,
240245
},
241246
CostModels: map[string]map[string]int{
242247
"PlutusV1": {

ledger/alonzo/pparams.go

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
// Copyright 2024 Blink Labs Software
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package alonzo
16+
17+
import (
18+
"github.com/blinklabs-io/gouroboros/cbor"
19+
"github.com/blinklabs-io/gouroboros/ledger/common"
20+
"github.com/blinklabs-io/gouroboros/ledger/mary"
21+
)
22+
23+
type AlonzoProtocolParameters struct {
24+
mary.MaryProtocolParameters
25+
MinPoolCost uint64
26+
AdaPerUtxoByte uint64
27+
CostModels map[uint][]uint64
28+
ExecutionCosts common.ExUnitPrice
29+
MaxTxExUnits common.ExUnit
30+
MaxBlockExUnits common.ExUnit
31+
MaxValueSize uint
32+
CollateralPercentage uint
33+
MaxCollateralInputs uint
34+
}
35+
36+
func (p *AlonzoProtocolParameters) Update(paramUpdate *AlonzoProtocolParameterUpdate) {
37+
p.MaryProtocolParameters.Update(
38+
&paramUpdate.MaryProtocolParameterUpdate,
39+
)
40+
if paramUpdate.MinPoolCost != nil {
41+
p.MinPoolCost = *paramUpdate.MinPoolCost
42+
}
43+
if paramUpdate.AdaPerUtxoByte != nil {
44+
p.AdaPerUtxoByte = *paramUpdate.AdaPerUtxoByte
45+
}
46+
if paramUpdate.CostModels != nil {
47+
p.CostModels = paramUpdate.CostModels
48+
}
49+
if paramUpdate.ExecutionCosts != nil {
50+
p.ExecutionCosts = *paramUpdate.ExecutionCosts
51+
}
52+
if paramUpdate.MaxTxExUnits != nil {
53+
p.MaxTxExUnits = *paramUpdate.MaxTxExUnits
54+
}
55+
if paramUpdate.MaxBlockExUnits != nil {
56+
p.MaxBlockExUnits = *paramUpdate.MaxBlockExUnits
57+
}
58+
if paramUpdate.MaxValueSize != nil {
59+
p.MaxValueSize = *paramUpdate.MaxValueSize
60+
}
61+
if paramUpdate.CollateralPercentage != nil {
62+
p.CollateralPercentage = *paramUpdate.CollateralPercentage
63+
}
64+
if paramUpdate.MaxCollateralInputs != nil {
65+
p.MaxCollateralInputs = *paramUpdate.MaxCollateralInputs
66+
}
67+
}
68+
69+
func (p *AlonzoProtocolParameters) UpdateFromGenesis(genesis *AlonzoGenesis) {
70+
// XXX: do we need to convert this?
71+
p.AdaPerUtxoByte = genesis.LovelacePerUtxoWord
72+
p.MaxValueSize = genesis.MaxValueSize
73+
p.CollateralPercentage = genesis.CollateralPercentage
74+
p.MaxCollateralInputs = genesis.MaxCollateralInputs
75+
p.MaxTxExUnits = common.ExUnit{
76+
Mem: genesis.MaxTxExUnits.Mem,
77+
Steps: genesis.MaxTxExUnits.Steps,
78+
}
79+
p.MaxBlockExUnits = common.ExUnit{
80+
Mem: genesis.MaxBlockExUnits.Mem,
81+
Steps: genesis.MaxBlockExUnits.Steps,
82+
}
83+
if genesis.ExecutionPrices.Mem != nil && genesis.ExecutionPrices.Steps != nil {
84+
p.ExecutionCosts = common.ExUnitPrice{
85+
MemPrice: &cbor.Rat{Rat: genesis.ExecutionPrices.Mem.Rat},
86+
StepPrice: &cbor.Rat{Rat: genesis.ExecutionPrices.Steps.Rat},
87+
}
88+
}
89+
// TODO: cost models
90+
// We have 150+ string values to map to array indexes
91+
// CostModels map[string]map[string]int
92+
}
93+
94+
type AlonzoProtocolParameterUpdate struct {
95+
mary.MaryProtocolParameterUpdate
96+
MinPoolCost *uint64 `cbor:"16,keyasint"`
97+
AdaPerUtxoByte *uint64 `cbor:"17,keyasint"`
98+
CostModels map[uint][]uint64 `cbor:"18,keyasint"`
99+
ExecutionCosts *common.ExUnitPrice `cbor:"19,keyasint"`
100+
MaxTxExUnits *common.ExUnit `cbor:"20,keyasint"`
101+
MaxBlockExUnits *common.ExUnit `cbor:"21,keyasint"`
102+
MaxValueSize *uint `cbor:"22,keyasint"`
103+
CollateralPercentage *uint `cbor:"23,keyasint"`
104+
MaxCollateralInputs *uint `cbor:"24,keyasint"`
105+
}
106+
107+
func (u *AlonzoProtocolParameterUpdate) UnmarshalCBOR(data []byte) error {
108+
return u.UnmarshalCbor(data, u)
109+
}

0 commit comments

Comments
 (0)