@@ -305,19 +305,20 @@ type parityChainSpecAccount struct {
305
305
306
306
// parityChainSpecBuiltin is the precompiled contract definition.
307
307
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
312
311
}
313
312
314
313
// parityChainSpecPricing represents the different pricing models that builtin
315
314
// contracts might advertise using.
316
315
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"`
321
322
322
323
// Blake2F is the price per round of Blake2 compression
323
324
Blake2F * parityChainSpecBlakePricing `json:"blake2_f,omitempty"`
@@ -332,22 +333,36 @@ type parityChainSpecModExpPricing struct {
332
333
Divisor uint64 `json:"divisor"`
333
334
}
334
335
336
+ // parityChainSpecAltBnConstOperationPricing defines the price
337
+ // policy for bn const operation(used after istanbul)
335
338
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"`
338
340
}
339
341
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"`
345
347
}
346
348
349
+ // parityChainSpecBlakePricing defines the price policy for blake2 f
350
+ // compression.
347
351
type parityChainSpecBlakePricing struct {
348
352
GasPerRound uint64 `json:"gas_per_round"`
349
353
}
350
354
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
+
351
366
// newParityChainSpec converts a go-ethereum genesis block into a Parity specific
352
367
// chain specification format.
353
368
func newParityChainSpec (network string , genesis * core.Genesis , bootnodes []string ) (* parityChainSpec , error ) {
@@ -445,33 +460,92 @@ func newParityChainSpec(network string, genesis *core.Genesis, bootnodes []strin
445
460
})
446
461
if genesis .Config .ByzantiumBlock != nil {
447
462
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
+ },
449
468
})
450
469
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
+ },
452
475
})
453
476
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
+ },
455
482
})
456
483
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
+ },
458
489
})
459
490
}
460
491
if genesis .Config .IstanbulBlock != nil {
461
492
if genesis .Config .ByzantiumBlock == nil {
462
493
return nil , errors .New ("invalid genesis, istanbul fork is enabled while byzantium is not" )
463
494
}
464
495
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
+ },
466
510
})
467
511
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
+ },
469
526
})
470
527
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
+ },
472
542
})
473
543
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
+ },
475
549
})
476
550
}
477
551
return spec , nil
@@ -514,8 +588,6 @@ func (spec *parityChainSpec) setConstantinopleFix(num *big.Int) {
514
588
}
515
589
516
590
func (spec * parityChainSpec ) setIstanbul (num * big.Int ) {
517
- // spec.Params.EIP152Transition = hexutil.Uint64(num.Uint64())
518
- // spec.Params.EIP1108Transition = hexutil.Uint64(num.Uint64())
519
591
spec .Params .EIP1344Transition = hexutil .Uint64 (num .Uint64 ())
520
592
spec .Params .EIP1884Transition = hexutil .Uint64 (num .Uint64 ())
521
593
spec .Params .EIP2028Transition = hexutil .Uint64 (num .Uint64 ())
0 commit comments