Skip to content
This repository was archived by the owner on May 21, 2024. It is now read-only.

Commit 01a6254

Browse files
rjl493456442elizabethengelman
authored andcommitted
cmd/puppeth: update chain spec of parity (ethereum#20241)
1 parent af3806f commit 01a6254

File tree

3 files changed

+148
-62
lines changed

3 files changed

+148
-62
lines changed

cmd/puppeth/genesis.go

Lines changed: 97 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -305,19 +305,20 @@ type parityChainSpecAccount struct {
305305

306306
// parityChainSpecBuiltin is the precompiled contract definition.
307307
type parityChainSpecBuiltin struct {
308-
Name string `json:"name"` // Each builtin should has it own name
309-
Pricing *parityChainSpecPricing `json:"pricing"` // Each builtin should has it own price strategy
310-
ActivateAt *hexutil.Big `json:"activate_at,omitempty"` // ActivateAt can't be omitted if empty, default means no fork
311-
EIP1108Transition *hexutil.Big `json:"eip1108_transition,omitempty"` // EIP1108Transition can't be omitted if empty, default means no fork
308+
Name string `json:"name"` // Each builtin should has it own name
309+
Pricing interface{} `json:"pricing"` // Each builtin should has it own price strategy
310+
ActivateAt *hexutil.Big `json:"activate_at,omitempty"` // ActivateAt can't be omitted if empty, default means no fork
312311
}
313312

314313
// parityChainSpecPricing represents the different pricing models that builtin
315314
// contracts might advertise using.
316315
type parityChainSpecPricing struct {
317-
Linear *parityChainSpecLinearPricing `json:"linear,omitempty"`
318-
ModExp *parityChainSpecModExpPricing `json:"modexp,omitempty"`
319-
AltBnPairing *parityChainSpecAltBnPairingPricing `json:"alt_bn128_pairing,omitempty"`
320-
AltBnConstOperation *parityChainSpecAltBnConstOperationPricing `json:"alt_bn128_const_operations,omitempty"`
316+
Linear *parityChainSpecLinearPricing `json:"linear,omitempty"`
317+
ModExp *parityChainSpecModExpPricing `json:"modexp,omitempty"`
318+
319+
// Before the https://github.com/paritytech/parity-ethereum/pull/11039,
320+
// Parity uses this format to config bn pairing price policy.
321+
AltBnPairing *parityChainSepcAltBnPairingPricing `json:"alt_bn128_pairing,omitempty"`
321322

322323
// Blake2F is the price per round of Blake2 compression
323324
Blake2F *parityChainSpecBlakePricing `json:"blake2_f,omitempty"`
@@ -332,22 +333,36 @@ type parityChainSpecModExpPricing struct {
332333
Divisor uint64 `json:"divisor"`
333334
}
334335

336+
// parityChainSpecAltBnConstOperationPricing defines the price
337+
// policy for bn const operation(used after istanbul)
335338
type parityChainSpecAltBnConstOperationPricing struct {
336-
Price uint64 `json:"price"`
337-
EIP1108TransitionPrice uint64 `json:"eip1108_transition_price,omitempty"` // Before Istanbul fork, this field is nil
339+
Price uint64 `json:"price"`
338340
}
339341

340-
type parityChainSpecAltBnPairingPricing struct {
341-
Base uint64 `json:"base"`
342-
Pair uint64 `json:"pair"`
343-
EIP1108TransitionBase uint64 `json:"eip1108_transition_base,omitempty"` // Before Istanbul fork, this field is nil
344-
EIP1108TransitionPair uint64 `json:"eip1108_transition_pair,omitempty"` // Before Istanbul fork, this field is nil
342+
// parityChainSepcAltBnPairingPricing defines the price policy
343+
// for bn pairing.
344+
type parityChainSepcAltBnPairingPricing struct {
345+
Base uint64 `json:"base"`
346+
Pair uint64 `json:"pair"`
345347
}
346348

349+
// parityChainSpecBlakePricing defines the price policy for blake2 f
350+
// compression.
347351
type parityChainSpecBlakePricing struct {
348352
GasPerRound uint64 `json:"gas_per_round"`
349353
}
350354

355+
type parityChainSpecAlternativePrice struct {
356+
AltBnConstOperationPrice *parityChainSpecAltBnConstOperationPricing `json:"alt_bn128_const_operations,omitempty"`
357+
AltBnPairingPrice *parityChainSepcAltBnPairingPricing `json:"alt_bn128_pairing,omitempty"`
358+
}
359+
360+
// parityChainSpecVersionedPricing represents a single version price policy.
361+
type parityChainSpecVersionedPricing struct {
362+
Price *parityChainSpecAlternativePrice `json:"price,omitempty"`
363+
Info string `json:"info,omitempty"`
364+
}
365+
351366
// newParityChainSpec converts a go-ethereum genesis block into a Parity specific
352367
// chain specification format.
353368
func newParityChainSpec(network string, genesis *core.Genesis, bootnodes []string) (*parityChainSpec, error) {
@@ -445,33 +460,92 @@ func newParityChainSpec(network string, genesis *core.Genesis, bootnodes []strin
445460
})
446461
if genesis.Config.ByzantiumBlock != nil {
447462
spec.setPrecompile(5, &parityChainSpecBuiltin{
448-
Name: "modexp", ActivateAt: (*hexutil.Big)(genesis.Config.ByzantiumBlock), Pricing: &parityChainSpecPricing{ModExp: &parityChainSpecModExpPricing{Divisor: 20}},
463+
Name: "modexp",
464+
ActivateAt: (*hexutil.Big)(genesis.Config.ByzantiumBlock),
465+
Pricing: &parityChainSpecPricing{
466+
ModExp: &parityChainSpecModExpPricing{Divisor: 20},
467+
},
449468
})
450469
spec.setPrecompile(6, &parityChainSpecBuiltin{
451-
Name: "alt_bn128_add", ActivateAt: (*hexutil.Big)(genesis.Config.ByzantiumBlock), Pricing: &parityChainSpecPricing{AltBnConstOperation: &parityChainSpecAltBnConstOperationPricing{Price: 500}},
470+
Name: "alt_bn128_add",
471+
ActivateAt: (*hexutil.Big)(genesis.Config.ByzantiumBlock),
472+
Pricing: &parityChainSpecPricing{
473+
Linear: &parityChainSpecLinearPricing{Base: 500, Word: 0},
474+
},
452475
})
453476
spec.setPrecompile(7, &parityChainSpecBuiltin{
454-
Name: "alt_bn128_mul", ActivateAt: (*hexutil.Big)(genesis.Config.ByzantiumBlock), Pricing: &parityChainSpecPricing{AltBnConstOperation: &parityChainSpecAltBnConstOperationPricing{Price: 40000}},
477+
Name: "alt_bn128_mul",
478+
ActivateAt: (*hexutil.Big)(genesis.Config.ByzantiumBlock),
479+
Pricing: &parityChainSpecPricing{
480+
Linear: &parityChainSpecLinearPricing{Base: 40000, Word: 0},
481+
},
455482
})
456483
spec.setPrecompile(8, &parityChainSpecBuiltin{
457-
Name: "alt_bn128_pairing", ActivateAt: (*hexutil.Big)(genesis.Config.ByzantiumBlock), Pricing: &parityChainSpecPricing{AltBnPairing: &parityChainSpecAltBnPairingPricing{Base: 100000, Pair: 80000}},
484+
Name: "alt_bn128_pairing",
485+
ActivateAt: (*hexutil.Big)(genesis.Config.ByzantiumBlock),
486+
Pricing: &parityChainSpecPricing{
487+
AltBnPairing: &parityChainSepcAltBnPairingPricing{Base: 100000, Pair: 80000},
488+
},
458489
})
459490
}
460491
if genesis.Config.IstanbulBlock != nil {
461492
if genesis.Config.ByzantiumBlock == nil {
462493
return nil, errors.New("invalid genesis, istanbul fork is enabled while byzantium is not")
463494
}
464495
spec.setPrecompile(6, &parityChainSpecBuiltin{
465-
Name: "alt_bn128_add", ActivateAt: (*hexutil.Big)(genesis.Config.ByzantiumBlock), EIP1108Transition: (*hexutil.Big)(genesis.Config.IstanbulBlock), Pricing: &parityChainSpecPricing{AltBnConstOperation: &parityChainSpecAltBnConstOperationPricing{Price: 500, EIP1108TransitionPrice: 150}},
496+
Name: "alt_bn128_add",
497+
ActivateAt: (*hexutil.Big)(genesis.Config.ByzantiumBlock),
498+
Pricing: map[*hexutil.Big]*parityChainSpecVersionedPricing{
499+
(*hexutil.Big)(big.NewInt(0)): {
500+
Price: &parityChainSpecAlternativePrice{
501+
AltBnConstOperationPrice: &parityChainSpecAltBnConstOperationPricing{Price: 500},
502+
},
503+
},
504+
(*hexutil.Big)(genesis.Config.IstanbulBlock): {
505+
Price: &parityChainSpecAlternativePrice{
506+
AltBnConstOperationPrice: &parityChainSpecAltBnConstOperationPricing{Price: 150},
507+
},
508+
},
509+
},
466510
})
467511
spec.setPrecompile(7, &parityChainSpecBuiltin{
468-
Name: "alt_bn128_mul", ActivateAt: (*hexutil.Big)(genesis.Config.ByzantiumBlock), EIP1108Transition: (*hexutil.Big)(genesis.Config.IstanbulBlock), Pricing: &parityChainSpecPricing{AltBnConstOperation: &parityChainSpecAltBnConstOperationPricing{Price: 40000, EIP1108TransitionPrice: 6000}},
512+
Name: "alt_bn128_mul",
513+
ActivateAt: (*hexutil.Big)(genesis.Config.ByzantiumBlock),
514+
Pricing: map[*hexutil.Big]*parityChainSpecVersionedPricing{
515+
(*hexutil.Big)(big.NewInt(0)): {
516+
Price: &parityChainSpecAlternativePrice{
517+
AltBnConstOperationPrice: &parityChainSpecAltBnConstOperationPricing{Price: 40000},
518+
},
519+
},
520+
(*hexutil.Big)(genesis.Config.IstanbulBlock): {
521+
Price: &parityChainSpecAlternativePrice{
522+
AltBnConstOperationPrice: &parityChainSpecAltBnConstOperationPricing{Price: 6000},
523+
},
524+
},
525+
},
469526
})
470527
spec.setPrecompile(8, &parityChainSpecBuiltin{
471-
Name: "alt_bn128_pairing", ActivateAt: (*hexutil.Big)(genesis.Config.ByzantiumBlock), EIP1108Transition: (*hexutil.Big)(genesis.Config.IstanbulBlock), Pricing: &parityChainSpecPricing{AltBnPairing: &parityChainSpecAltBnPairingPricing{Base: 100000, Pair: 80000, EIP1108TransitionBase: 45000, EIP1108TransitionPair: 34000}},
528+
Name: "alt_bn128_pairing",
529+
ActivateAt: (*hexutil.Big)(genesis.Config.ByzantiumBlock),
530+
Pricing: map[*hexutil.Big]*parityChainSpecVersionedPricing{
531+
(*hexutil.Big)(big.NewInt(0)): {
532+
Price: &parityChainSpecAlternativePrice{
533+
AltBnPairingPrice: &parityChainSepcAltBnPairingPricing{Base: 100000, Pair: 80000},
534+
},
535+
},
536+
(*hexutil.Big)(genesis.Config.IstanbulBlock): {
537+
Price: &parityChainSpecAlternativePrice{
538+
AltBnPairingPrice: &parityChainSepcAltBnPairingPricing{Base: 45000, Pair: 34000},
539+
},
540+
},
541+
},
472542
})
473543
spec.setPrecompile(9, &parityChainSpecBuiltin{
474-
Name: "blake2_f", ActivateAt: (*hexutil.Big)(genesis.Config.IstanbulBlock), Pricing: &parityChainSpecPricing{Blake2F: &parityChainSpecBlakePricing{GasPerRound: 1}},
544+
Name: "blake2_f",
545+
ActivateAt: (*hexutil.Big)(genesis.Config.IstanbulBlock),
546+
Pricing: &parityChainSpecPricing{
547+
Blake2F: &parityChainSpecBlakePricing{GasPerRound: 1},
548+
},
475549
})
476550
}
477551
return spec, nil
@@ -514,8 +588,6 @@ func (spec *parityChainSpec) setConstantinopleFix(num *big.Int) {
514588
}
515589

516590
func (spec *parityChainSpec) setIstanbul(num *big.Int) {
517-
// spec.Params.EIP152Transition = hexutil.Uint64(num.Uint64())
518-
// spec.Params.EIP1108Transition = hexutil.Uint64(num.Uint64())
519591
spec.Params.EIP1344Transition = hexutil.Uint64(num.Uint64())
520592
spec.Params.EIP1884Transition = hexutil.Uint64(num.Uint64())
521593
spec.Params.EIP2028Transition = hexutil.Uint64(num.Uint64())

cmd/puppeth/genesis_test.go

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package main
1818

1919
import (
20+
"bytes"
2021
"encoding/json"
2122
"io/ioutil"
2223
"reflect"
@@ -80,29 +81,15 @@ func TestParitySturebyConverter(t *testing.T) {
8081
if err != nil {
8182
t.Fatalf("failed creating chainspec: %v", err)
8283
}
83-
84+
enc, err := json.MarshalIndent(spec, "", " ")
85+
if err != nil {
86+
t.Fatalf("failed encoding chainspec: %v", err)
87+
}
8488
expBlob, err := ioutil.ReadFile("testdata/stureby_parity.json")
8589
if err != nil {
8690
t.Fatalf("could not read file: %v", err)
8791
}
88-
expspec := &parityChainSpec{}
89-
if err := json.Unmarshal(expBlob, expspec); err != nil {
90-
t.Fatalf("failed parsing genesis: %v", err)
91-
}
92-
expspec.Nodes = []string{}
93-
94-
if !reflect.DeepEqual(expspec, spec) {
95-
t.Errorf("chainspec mismatch")
96-
c := spew.ConfigState{
97-
DisablePointerAddresses: true,
98-
SortKeys: true,
99-
}
100-
exp := strings.Split(c.Sdump(expspec), "\n")
101-
got := strings.Split(c.Sdump(spec), "\n")
102-
for i := 0; i < len(exp) && i < len(got); i++ {
103-
if exp[i] != got[i] {
104-
t.Logf("got: %v\nexp: %v\n", exp[i], got[i])
105-
}
106-
}
92+
if !bytes.Equal(expBlob, enc) {
93+
t.Fatalf("chainspec mismatch")
10794
}
10895
}

cmd/puppeth/testdata/stureby_parity.json

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -131,43 +131,70 @@
131131
"builtin": {
132132
"name": "alt_bn128_add",
133133
"pricing": {
134-
"alt_bn128_const_operations": {
135-
"price": 500,
136-
"eip1108_transition_price": 150
134+
"0x0": {
135+
"price": {
136+
"alt_bn128_const_operations": {
137+
"price": 500
138+
}
139+
}
140+
},
141+
"0xc350": {
142+
"price": {
143+
"alt_bn128_const_operations": {
144+
"price": 150
145+
}
146+
}
137147
}
138148
},
139-
"activate_at": "0x7530",
140-
"eip1108_transition": "0xc350"
149+
"activate_at": "0x7530"
141150
}
142151
},
143152
"0000000000000000000000000000000000000007": {
144153
"balance": "0x1",
145154
"builtin": {
146155
"name": "alt_bn128_mul",
147156
"pricing": {
148-
"alt_bn128_const_operations": {
149-
"price": 40000,
150-
"eip1108_transition_price": 6000
157+
"0x0": {
158+
"price": {
159+
"alt_bn128_const_operations": {
160+
"price": 40000
161+
}
162+
}
163+
},
164+
"0xc350": {
165+
"price": {
166+
"alt_bn128_const_operations": {
167+
"price": 6000
168+
}
169+
}
151170
}
152171
},
153-
"activate_at": "0x7530",
154-
"eip1108_transition": "0xc350"
172+
"activate_at": "0x7530"
155173
}
156174
},
157175
"0000000000000000000000000000000000000008": {
158176
"balance": "0x1",
159177
"builtin": {
160178
"name": "alt_bn128_pairing",
161179
"pricing": {
162-
"alt_bn128_pairing": {
163-
"base": 100000,
164-
"pair": 80000,
165-
"eip1108_transition_base": 45000,
166-
"eip1108_transition_pair": 34000
180+
"0x0": {
181+
"price": {
182+
"alt_bn128_pairing": {
183+
"base": 100000,
184+
"pair": 80000
185+
}
186+
}
187+
},
188+
"0xc350": {
189+
"price": {
190+
"alt_bn128_pairing": {
191+
"base": 45000,
192+
"pair": 34000
193+
}
194+
}
167195
}
168196
},
169-
"activate_at": "0x7530",
170-
"eip1108_transition": "0xc350"
197+
"activate_at": "0x7530"
171198
}
172199
},
173200
"0000000000000000000000000000000000000009": {

0 commit comments

Comments
 (0)