@@ -305,19 +305,20 @@ type parityChainSpecAccount struct {
305305
306306// parityChainSpecBuiltin is the precompiled contract definition.
307307type 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.
316315type 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)
335338type 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.
347351type 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.
353368func 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
516590func (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 ())
0 commit comments