Skip to content

Commit c3c5184

Browse files
authored
feat: add Utxorpc support for cardano.PParams in Conway (#767)
1 parent 80906aa commit c3c5184

File tree

6 files changed

+165
-3
lines changed

6 files changed

+165
-3
lines changed

ledger/allegra/pparams.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@
1414

1515
package allegra
1616

17-
import "github.com/blinklabs-io/gouroboros/ledger/shelley"
17+
import (
18+
"github.com/blinklabs-io/gouroboros/ledger/shelley"
19+
"github.com/utxorpc/go-codegen/utxorpc/v1alpha/cardano"
20+
)
1821

1922
type AllegraProtocolParameters struct {
2023
shelley.ShelleyProtocolParameters
@@ -33,3 +36,8 @@ type AllegraProtocolParameterUpdate struct {
3336
func (u *AllegraProtocolParameterUpdate) UnmarshalCBOR(data []byte) error {
3437
return u.UnmarshalCbor(data, u)
3538
}
39+
40+
func (p *AllegraProtocolParameters) Utxorpc() *cardano.PParams {
41+
// TODO: Implement the conversion logic to cardano.PParams
42+
return &cardano.PParams{}
43+
}

ledger/alonzo/pparams.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"github.com/blinklabs-io/gouroboros/cbor"
1919
"github.com/blinklabs-io/gouroboros/ledger/common"
2020
"github.com/blinklabs-io/gouroboros/ledger/mary"
21+
"github.com/utxorpc/go-codegen/utxorpc/v1alpha/cardano"
2122
)
2223

2324
type AlonzoProtocolParameters struct {
@@ -95,7 +96,7 @@ type AlonzoProtocolParameterUpdate struct {
9596
mary.MaryProtocolParameterUpdate
9697
MinPoolCost *uint64 `cbor:"16,keyasint"`
9798
AdaPerUtxoByte *uint64 `cbor:"17,keyasint"`
98-
CostModels map[uint][]int64 `cbor:"18,keyasint"`
99+
CostModels map[uint][]int64 `cbor:"18,keyasint"`
99100
ExecutionCosts *common.ExUnitPrice `cbor:"19,keyasint"`
100101
MaxTxExUnits *common.ExUnit `cbor:"20,keyasint"`
101102
MaxBlockExUnits *common.ExUnit `cbor:"21,keyasint"`
@@ -107,3 +108,8 @@ type AlonzoProtocolParameterUpdate struct {
107108
func (u *AlonzoProtocolParameterUpdate) UnmarshalCBOR(data []byte) error {
108109
return u.UnmarshalCbor(data, u)
109110
}
111+
112+
func (p *AlonzoProtocolParameters) Utxorpc() *cardano.PParams {
113+
// TODO: Implement the conversion logic to cardano.PParams
114+
return &cardano.PParams{}
115+
}

ledger/babbage/pparams.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package babbage
1717
import (
1818
"github.com/blinklabs-io/gouroboros/cbor"
1919
"github.com/blinklabs-io/gouroboros/ledger/common"
20+
"github.com/utxorpc/go-codegen/utxorpc/v1alpha/cardano"
2021
)
2122

2223
// BabbageProtocolParameters represents the current Babbage protocol parameters as seen in local-state-query
@@ -134,7 +135,7 @@ type BabbageProtocolParameterUpdate struct {
134135
ProtocolVersion *common.ProtocolParametersProtocolVersion `cbor:"14,keyasint"`
135136
MinPoolCost *uint64 `cbor:"16,keyasint"`
136137
AdaPerUtxoByte *uint64 `cbor:"17,keyasint"`
137-
CostModels map[uint][]int64 `cbor:"18,keyasint"`
138+
CostModels map[uint][]int64 `cbor:"18,keyasint"`
138139
ExecutionCosts *common.ExUnitPrice `cbor:"19,keyasint"`
139140
MaxTxExUnits *common.ExUnit `cbor:"20,keyasint"`
140141
MaxBlockExUnits *common.ExUnit `cbor:"21,keyasint"`
@@ -148,3 +149,8 @@ func (BabbageProtocolParameterUpdate) IsProtocolParameterUpdate() {}
148149
func (u *BabbageProtocolParameterUpdate) UnmarshalCBOR(data []byte) error {
149150
return u.UnmarshalCbor(data, u)
150151
}
152+
153+
func (p *BabbageProtocolParameters) Utxorpc() *cardano.PParams {
154+
// TODO: Implement the conversion logic to cardano.PParams
155+
return &cardano.PParams{}
156+
}

ledger/common/pparams.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@ package common
1616

1717
import (
1818
"fmt"
19+
"log/slog"
1920

2021
"github.com/blinklabs-io/gouroboros/cbor"
22+
"github.com/utxorpc/go-codegen/utxorpc/v1alpha/cardano"
2123
)
2224

2325
type ProtocolParameterUpdate interface {
@@ -31,6 +33,10 @@ type ProtocolParametersProtocolVersion struct {
3133
Minor uint
3234
}
3335

36+
type ProtocolParametersUtxorpc interface {
37+
Utxorpc() *cardano.PParams
38+
}
39+
3440
const (
3541
NonceType0 = 0
3642
NonceType1 = 1
@@ -79,3 +85,23 @@ type ExUnitPrice struct {
7985
MemPrice *cbor.Rat
8086
StepPrice *cbor.Rat
8187
}
88+
89+
// ConvertToUtxorpcCardanoCostModels converts a map of cost models for Plutus scripts into cardano.CostModels
90+
// Only PlutusV(keys 1, 2, and 3) are supported.
91+
func ConvertToUtxorpcCardanoCostModels(models map[uint][]int64) *cardano.CostModels {
92+
costModels := &cardano.CostModels{}
93+
for k, v := range models {
94+
costModel := &cardano.CostModel{Values: v}
95+
switch k {
96+
case 1:
97+
costModels.PlutusV1 = costModel
98+
case 2:
99+
costModels.PlutusV2 = costModel
100+
case 3:
101+
costModels.PlutusV3 = costModel
102+
default:
103+
slog.Warn("unsupported cost model version", "version", k)
104+
}
105+
}
106+
return costModels
107+
}

ledger/conway/pparams.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"github.com/blinklabs-io/gouroboros/cbor"
1919
"github.com/blinklabs-io/gouroboros/ledger/babbage"
2020
"github.com/blinklabs-io/gouroboros/ledger/common"
21+
"github.com/utxorpc/go-codegen/utxorpc/v1alpha/cardano"
2122
)
2223

2324
type ConwayProtocolParameters struct {
@@ -55,6 +56,39 @@ type ConwayProtocolParameters struct {
5556
MinFeeRefScriptCostPerByte *cbor.Rat
5657
}
5758

59+
func (p *ConwayProtocolParameters) Utxorpc() *cardano.PParams {
60+
return &cardano.PParams{
61+
CoinsPerUtxoByte: p.AdaPerUtxoByte,
62+
MaxTxSize: uint64(p.MaxTxSize),
63+
MinFeeCoefficient: uint64(p.MinFeeA),
64+
MinFeeConstant: uint64(p.MinFeeB),
65+
MaxBlockBodySize: uint64(p.MaxBlockBodySize),
66+
MaxBlockHeaderSize: uint64(p.MaxBlockHeaderSize),
67+
StakeKeyDeposit: uint64(p.KeyDeposit),
68+
PoolDeposit: uint64(p.PoolDeposit),
69+
PoolRetirementEpochBound: uint64(p.MaxEpoch),
70+
DesiredNumberOfPools: uint64(p.NOpt),
71+
PoolInfluence: &cardano.RationalNumber{Numerator: int32(p.A0.Num().Int64()), Denominator: uint32(p.A0.Denom().Int64())},
72+
MonetaryExpansion: &cardano.RationalNumber{Numerator: int32(p.Rho.Num().Int64()), Denominator: uint32(p.Rho.Denom().Int64())},
73+
TreasuryExpansion: &cardano.RationalNumber{Numerator: int32(p.Tau.Num().Int64()), Denominator: uint32(p.Tau.Denom().Int64())},
74+
MinPoolCost: p.MinPoolCost,
75+
ProtocolVersion: &cardano.ProtocolVersion{
76+
Major: uint32(p.ProtocolVersion.Major),
77+
Minor: uint32(p.ProtocolVersion.Minor),
78+
},
79+
MaxValueSize: uint64(p.MaxValueSize),
80+
CollateralPercentage: uint64(p.CollateralPercentage),
81+
MaxCollateralInputs: uint64(p.MaxCollateralInputs),
82+
CostModels: common.ConvertToUtxorpcCardanoCostModels(p.CostModels),
83+
Prices: &cardano.ExPrices{
84+
Memory: &cardano.RationalNumber{Numerator: int32(p.ExecutionCosts.MemPrice.Num().Int64()), Denominator: uint32(p.ExecutionCosts.MemPrice.Denom().Int64())},
85+
Steps: &cardano.RationalNumber{Numerator: int32(p.ExecutionCosts.StepPrice.Num().Int64()), Denominator: uint32(p.ExecutionCosts.StepPrice.Denom().Int64())},
86+
},
87+
MaxExecutionUnitsPerTransaction: &cardano.ExUnits{Memory: uint64(p.MaxTxExUnits.Mem), Steps: uint64(p.MaxTxExUnits.Steps)},
88+
MaxExecutionUnitsPerBlock: &cardano.ExUnits{Memory: uint64(p.MaxBlockExUnits.Mem), Steps: uint64(p.MaxBlockExUnits.Steps)},
89+
}
90+
}
91+
5892
func (p *ConwayProtocolParameters) Update(paramUpdate *ConwayProtocolParameterUpdate) {
5993
if paramUpdate.MinFeeA != nil {
6094
p.MinFeeA = *paramUpdate.MinFeeA

ledger/conway/pparams_test.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@ package conway_test
1616

1717
import (
1818
"encoding/hex"
19+
"math/big"
1920
"reflect"
2021
"strings"
2122
"testing"
2223

2324
"github.com/blinklabs-io/gouroboros/cbor"
2425
"github.com/blinklabs-io/gouroboros/ledger/common"
2526
"github.com/blinklabs-io/gouroboros/ledger/conway"
27+
"github.com/utxorpc/go-codegen/utxorpc/v1alpha/cardano"
2628
)
2729

2830
func TestConwayProtocolParamsUpdate(t *testing.T) {
@@ -118,3 +120,83 @@ func TestConwayProtocolParamsUpdateFromGenesis(t *testing.T) {
118120
}
119121
}
120122
}
123+
func TestUtxorpc(t *testing.T) {
124+
// Define test cases
125+
testDefs := []struct {
126+
startParams conway.ConwayProtocolParameters
127+
expectedUtxorpc *cardano.PParams
128+
}{
129+
{
130+
startParams: conway.ConwayProtocolParameters{
131+
AdaPerUtxoByte: 44,
132+
MaxTxSize: 16384,
133+
MinFeeA: 500,
134+
MinFeeB: 2,
135+
MaxBlockBodySize: 65536,
136+
MaxBlockHeaderSize: 1024,
137+
KeyDeposit: 2000,
138+
PoolDeposit: 500000,
139+
MaxEpoch: 2160,
140+
NOpt: 100,
141+
A0: &cbor.Rat{Rat: big.NewRat(1, 2)},
142+
Rho: &cbor.Rat{Rat: big.NewRat(3, 4)},
143+
Tau: &cbor.Rat{Rat: big.NewRat(5, 6)},
144+
MinPoolCost: 340000000,
145+
ProtocolVersion: common.ProtocolParametersProtocolVersion{Major: 8, Minor: 0},
146+
MaxValueSize: 1024,
147+
CollateralPercentage: 150,
148+
MaxCollateralInputs: 5,
149+
ExecutionCosts: common.ExUnitPrice{MemPrice: &cbor.Rat{Rat: big.NewRat(1, 2)}, StepPrice: &cbor.Rat{Rat: big.NewRat(2, 3)}},
150+
MaxTxExUnits: common.ExUnit{Mem: 1000000, Steps: 200000},
151+
MaxBlockExUnits: common.ExUnit{Mem: 5000000, Steps: 1000000},
152+
CostModels: map[uint][]int64{
153+
1: {100, 200, 300},
154+
2: {400, 500, 600},
155+
3: {700, 800, 900},
156+
},
157+
},
158+
expectedUtxorpc: &cardano.PParams{
159+
CoinsPerUtxoByte: 44,
160+
MaxTxSize: 16384,
161+
MinFeeCoefficient: 500,
162+
MinFeeConstant: 2,
163+
MaxBlockBodySize: 65536,
164+
MaxBlockHeaderSize: 1024,
165+
StakeKeyDeposit: 2000,
166+
PoolDeposit: 500000,
167+
PoolRetirementEpochBound: 2160,
168+
DesiredNumberOfPools: 100,
169+
PoolInfluence: &cardano.RationalNumber{Numerator: int32(1), Denominator: uint32(2)},
170+
MonetaryExpansion: &cardano.RationalNumber{Numerator: int32(3), Denominator: uint32(4)},
171+
TreasuryExpansion: &cardano.RationalNumber{Numerator: int32(5), Denominator: uint32(6)},
172+
MinPoolCost: 340000000,
173+
ProtocolVersion: &cardano.ProtocolVersion{
174+
Major: 8,
175+
Minor: 0,
176+
},
177+
MaxValueSize: 1024,
178+
CollateralPercentage: 150,
179+
MaxCollateralInputs: 5,
180+
CostModels: &cardano.CostModels{
181+
PlutusV1: &cardano.CostModel{Values: []int64{100, 200, 300}},
182+
PlutusV2: &cardano.CostModel{Values: []int64{400, 500, 600}},
183+
PlutusV3: &cardano.CostModel{Values: []int64{700, 800, 900}},
184+
},
185+
Prices: &cardano.ExPrices{
186+
Memory: &cardano.RationalNumber{Numerator: int32(1), Denominator: uint32(2)},
187+
Steps: &cardano.RationalNumber{Numerator: int32(2), Denominator: uint32(3)},
188+
},
189+
MaxExecutionUnitsPerTransaction: &cardano.ExUnits{Memory: 1000000, Steps: 200000},
190+
MaxExecutionUnitsPerBlock: &cardano.ExUnits{Memory: 5000000, Steps: 1000000},
191+
},
192+
},
193+
}
194+
195+
for _, testDef := range testDefs {
196+
result := testDef.startParams.Utxorpc()
197+
// Compare the result with the expected value
198+
if !reflect.DeepEqual(result, testDef.expectedUtxorpc) {
199+
t.Fatalf("Utxorpc() test failed:\nExpected: %#v\nGot: %#v", testDef.expectedUtxorpc, result)
200+
}
201+
}
202+
}

0 commit comments

Comments
 (0)