Skip to content

Commit fe2ab9d

Browse files
JonathanOppenheimerceyonurStephenButtolph
authored
Register secp256r1 precompile (#1044)
Signed-off-by: Jonathan Oppenheimer <jonathan.oppenheimer@avalabs.org> Signed-off-by: Jonathan Oppenheimer <147infiniti@gmail.com> Co-authored-by: Ceyhun Onur <ceyhun.onur@avalabs.org> Co-authored-by: Stephen Buttolph <stephen@avalabs.org>
1 parent 74e8218 commit fe2ab9d

File tree

3 files changed

+46
-47
lines changed

3 files changed

+46
-47
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ require (
66
github.com/VictoriaMetrics/fastcache v1.12.1
77
github.com/ava-labs/avalanchego v1.13.5-rc.4
88
github.com/ava-labs/firewood-go-ethhash/ffi v0.0.12
9-
github.com/ava-labs/libevm v1.13.14-0.3.0.rc.7
9+
github.com/ava-labs/libevm v1.13.15-0.20250904180142-72e9ad796212
1010
github.com/davecgh/go-spew v1.1.1
1111
github.com/deckarep/golang-set/v2 v2.1.0
1212
github.com/fjl/gencodec v0.1.1

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ github.com/ava-labs/avalanchego v1.13.5-rc.4 h1:5aPlOFQFbKBLvUzsxLgybGhOCqEyi74x
6464
github.com/ava-labs/avalanchego v1.13.5-rc.4/go.mod h1:6bXxADKsAkU/f9Xme0gFJGRALp3IVzwq8NMDyx6ucRs=
6565
github.com/ava-labs/firewood-go-ethhash/ffi v0.0.12 h1:aMcrLbpJ/dyu2kZDf/Di/4JIWsUcYPyTDKymiHpejt0=
6666
github.com/ava-labs/firewood-go-ethhash/ffi v0.0.12/go.mod h1:cq89ua3iiZ5wPBALTEQS5eG8DIZcs7ov6OiL4YR1BVY=
67-
github.com/ava-labs/libevm v1.13.14-0.3.0.rc.7 h1:z4rEAa/WTULwZOPiBj05Ba0iveMGek1x6MVhAhSu4aE=
68-
github.com/ava-labs/libevm v1.13.14-0.3.0.rc.7/go.mod h1:zP/DOcABRWargBmUWv1jXplyWNcfmBy9cxr0lw3LW3g=
67+
github.com/ava-labs/libevm v1.13.15-0.20250904180142-72e9ad796212 h1:z/X5qArZUrGLtCWmxhuj3qUVg15q+jTBvzrA8DRV2ic=
68+
github.com/ava-labs/libevm v1.13.15-0.20250904180142-72e9ad796212/go.mod h1:zP/DOcABRWargBmUWv1jXplyWNcfmBy9cxr0lw3LW3g=
6969
github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g=
7070
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
7171
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=

params/hooks_libevm.go

Lines changed: 43 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ import (
3131
// (August 2nd, 2025, 04:00 UTC)
3232
const invalidateDelegateUnix = 1754107200
3333

34+
// P256VerifyAddress is the address of the p256 signature verification precompile
35+
var P256VerifyAddress = common.BytesToAddress([]byte{0x1, 0x00})
36+
3437
type RulesExtra extras.Rules
3538

3639
func GetRulesExtra(r Rules) *extras.Rules {
@@ -51,71 +54,66 @@ func (RulesExtra) MinimumGasConsumption(x uint64) uint64 {
5154
return (ethparams.NOOPHooks{}).MinimumGasConsumption(x)
5255
}
5356

54-
var PrecompiledContractsApricotPhase2 = map[common.Address]contract.StatefulPrecompiledContract{
55-
nativeasset.GenesisContractAddr: &nativeasset.DeprecatedContract{},
56-
nativeasset.NativeAssetBalanceAddr: &nativeasset.NativeAssetBalance{GasCost: AssetBalanceApricot},
57-
nativeasset.NativeAssetCallAddr: &nativeasset.NativeAssetCall{GasCost: AssetCallApricot, CallNewAccountGas: ethparams.CallNewAccountGas},
57+
var PrecompiledContractsApricotPhase2 = map[common.Address]vm.PrecompiledContract{
58+
nativeasset.GenesisContractAddr: makePrecompile(&nativeasset.DeprecatedContract{}),
59+
nativeasset.NativeAssetBalanceAddr: makePrecompile(&nativeasset.NativeAssetBalance{GasCost: AssetBalanceApricot}),
60+
nativeasset.NativeAssetCallAddr: makePrecompile(&nativeasset.NativeAssetCall{GasCost: AssetCallApricot, CallNewAccountGas: ethparams.CallNewAccountGas}),
5861
}
5962

60-
var PrecompiledContractsApricotPhasePre6 = map[common.Address]contract.StatefulPrecompiledContract{
61-
nativeasset.GenesisContractAddr: &nativeasset.DeprecatedContract{},
62-
nativeasset.NativeAssetBalanceAddr: &nativeasset.DeprecatedContract{},
63-
nativeasset.NativeAssetCallAddr: &nativeasset.DeprecatedContract{},
63+
var PrecompiledContractsApricotPhasePre6 = map[common.Address]vm.PrecompiledContract{
64+
nativeasset.GenesisContractAddr: makePrecompile(&nativeasset.DeprecatedContract{}),
65+
nativeasset.NativeAssetBalanceAddr: makePrecompile(&nativeasset.DeprecatedContract{}),
66+
nativeasset.NativeAssetCallAddr: makePrecompile(&nativeasset.DeprecatedContract{}),
6467
}
6568

66-
var PrecompiledContractsApricotPhase6 = map[common.Address]contract.StatefulPrecompiledContract{
67-
nativeasset.GenesisContractAddr: &nativeasset.DeprecatedContract{},
68-
nativeasset.NativeAssetBalanceAddr: &nativeasset.NativeAssetBalance{GasCost: AssetBalanceApricot},
69-
nativeasset.NativeAssetCallAddr: &nativeasset.NativeAssetCall{GasCost: AssetCallApricot, CallNewAccountGas: ethparams.CallNewAccountGas},
69+
var PrecompiledContractsApricotPhase6 = map[common.Address]vm.PrecompiledContract{
70+
nativeasset.GenesisContractAddr: makePrecompile(&nativeasset.DeprecatedContract{}),
71+
nativeasset.NativeAssetBalanceAddr: makePrecompile(&nativeasset.NativeAssetBalance{GasCost: AssetBalanceApricot}),
72+
nativeasset.NativeAssetCallAddr: makePrecompile(&nativeasset.NativeAssetCall{GasCost: AssetCallApricot, CallNewAccountGas: ethparams.CallNewAccountGas}),
7073
}
7174

72-
var PrecompiledContractsBanff = map[common.Address]contract.StatefulPrecompiledContract{
73-
nativeasset.GenesisContractAddr: &nativeasset.DeprecatedContract{},
74-
nativeasset.NativeAssetBalanceAddr: &nativeasset.DeprecatedContract{},
75-
nativeasset.NativeAssetCallAddr: &nativeasset.DeprecatedContract{},
75+
var PrecompiledContractsBanff = map[common.Address]vm.PrecompiledContract{
76+
nativeasset.GenesisContractAddr: makePrecompile(&nativeasset.DeprecatedContract{}),
77+
nativeasset.NativeAssetBalanceAddr: makePrecompile(&nativeasset.DeprecatedContract{}),
78+
nativeasset.NativeAssetCallAddr: makePrecompile(&nativeasset.DeprecatedContract{}),
7679
}
7780

78-
func (r RulesExtra) ActivePrecompiles(existing []common.Address) []common.Address {
79-
var precompiles map[common.Address]contract.StatefulPrecompiledContract
80-
switch {
81-
case r.IsBanff:
82-
precompiles = PrecompiledContractsBanff
83-
case r.IsApricotPhase6:
84-
precompiles = PrecompiledContractsApricotPhase6
85-
case r.IsApricotPhasePre6:
86-
precompiles = PrecompiledContractsApricotPhasePre6
87-
case r.IsApricotPhase2:
88-
precompiles = PrecompiledContractsApricotPhase2
89-
}
81+
var PrecompiledContractsGranite = map[common.Address]vm.PrecompiledContract{
82+
nativeasset.GenesisContractAddr: makePrecompile(&nativeasset.DeprecatedContract{}),
83+
nativeasset.NativeAssetBalanceAddr: makePrecompile(&nativeasset.DeprecatedContract{}),
84+
nativeasset.NativeAssetCallAddr: makePrecompile(&nativeasset.DeprecatedContract{}),
85+
P256VerifyAddress: &vm.P256Verify{},
86+
}
9087

88+
func (r RulesExtra) ActivePrecompiles(existing []common.Address) []common.Address {
9189
var addresses []common.Address
92-
addresses = slices.AppendSeq(addresses, maps.Keys(precompiles))
90+
addresses = slices.AppendSeq(addresses, maps.Keys(r.currentPrecompiles()))
9391
addresses = append(addresses, existing...)
9492
return addresses
9593
}
9694

97-
// precompileOverrideBuiltin specifies precompiles that were activated prior to the
98-
// dynamic precompile activation registry.
99-
// These were only active historically and are not active in the current network.
100-
func (r RulesExtra) precompileOverrideBuiltin(addr common.Address) (libevm.PrecompiledContract, bool) {
101-
var precompiles map[common.Address]contract.StatefulPrecompiledContract
95+
func (r RulesExtra) currentPrecompiles() map[common.Address]vm.PrecompiledContract {
10296
switch {
97+
case r.IsGranite:
98+
return PrecompiledContractsGranite
10399
case r.IsBanff:
104-
precompiles = PrecompiledContractsBanff
100+
return PrecompiledContractsBanff
105101
case r.IsApricotPhase6:
106-
precompiles = PrecompiledContractsApricotPhase6
102+
return PrecompiledContractsApricotPhase6
107103
case r.IsApricotPhasePre6:
108-
precompiles = PrecompiledContractsApricotPhasePre6
104+
return PrecompiledContractsApricotPhasePre6
109105
case r.IsApricotPhase2:
110-
precompiles = PrecompiledContractsApricotPhase2
111-
}
112-
113-
precompile, ok := precompiles[addr]
114-
if !ok {
115-
return nil, false
106+
return PrecompiledContractsApricotPhase2
116107
}
108+
return nil
109+
}
117110

118-
return makePrecompile(precompile), true
111+
// precompileOverrideBuiltin specifies precompiles that were activated prior to the
112+
// dynamic precompile activation registry.
113+
// These were only active historically and are not active in the current network.
114+
func (r RulesExtra) precompileOverrideBuiltin(addr common.Address) (libevm.PrecompiledContract, bool) {
115+
precompile, ok := r.currentPrecompiles()[addr]
116+
return precompile, ok
119117
}
120118

121119
func makePrecompile(contract contract.StatefulPrecompiledContract) libevm.PrecompiledContract {
@@ -159,6 +157,7 @@ func (r RulesExtra) PrecompileOverride(addr common.Address) (libevm.PrecompiledC
159157
if p, ok := r.precompileOverrideBuiltin(addr); ok {
160158
return p, true
161159
}
160+
162161
if _, ok := r.Precompiles[addr]; !ok {
163162
return nil, false
164163
}

0 commit comments

Comments
 (0)