diff --git a/pkg/core/interops.go b/pkg/core/interops.go index 551c4c8cf..940d5928b 100644 --- a/pkg/core/interops.go +++ b/pkg/core/interops.go @@ -52,6 +52,9 @@ func (ic *interopContext) SpawnVM() *vm.VM { }) vm.RegisterInteropGetter(ic.getSystemInterop) vm.RegisterInteropGetter(ic.getNeoInterop) + if ic.bc != nil && ic.bc.GetConfig().EnableStateRoot { + vm.RegisterInteropGetter(ic.getNeoxInterop) + } return vm } @@ -77,6 +80,12 @@ func (ic *interopContext) getNeoInterop(id uint32) *vm.InteropFuncPrice { return ic.getInteropFromSlice(id, neoInterops) } +// getNeoxInterop returns matching interop function from the NeoX extension +// for a given id in the current context. +func (ic *interopContext) getNeoxInterop(id uint32) *vm.InteropFuncPrice { + return ic.getInteropFromSlice(id, neoxInterops) +} + // getInteropFromSlice returns matching interop function from the given slice of // interop functions in the current context. func (ic *interopContext) getInteropFromSlice(id uint32, slice []interopedFunction) *vm.InteropFuncPrice { @@ -166,8 +175,6 @@ var neoInterops = []interopedFunction{ {Name: "Neo.Contract.GetStorageContext", Func: (*interopContext).contractGetStorageContext, Price: 1}, {Name: "Neo.Contract.IsPayable", Func: (*interopContext).contractIsPayable, Price: 1}, {Name: "Neo.Contract.Migrate", Func: (*interopContext).contractMigrate, Price: 0}, - {Name: "Neo.Cryptography.Secp256k1Recover", Func: (*interopContext).secp256k1Recover, Price: 100}, - {Name: "Neo.Cryptography.Secp256r1Recover", Func: (*interopContext).secp256r1Recover, Price: 100}, {Name: "Neo.Enumerator.Concat", Func: (*interopContext).enumeratorConcat, Price: 1}, {Name: "Neo.Enumerator.Create", Func: (*interopContext).enumeratorCreate, Price: 1}, {Name: "Neo.Enumerator.Next", Func: (*interopContext).enumeratorNext, Price: 1}, @@ -278,6 +285,11 @@ var neoInterops = []interopedFunction{ {Name: "AntShares.Transaction.GetType", Func: (*interopContext).txGetType, Price: 1}, } +var neoxInterops = []interopedFunction{ + {Name: "Neo.Cryptography.Secp256k1Recover", Func: (*interopContext).secp256k1Recover, Price: 100}, + {Name: "Neo.Cryptography.Secp256r1Recover", Func: (*interopContext).secp256r1Recover, Price: 100}, +} + // initIDinInteropsSlice initializes IDs from names in one given // interopedFunction slice and then sorts it. func initIDinInteropsSlice(iops []interopedFunction) { @@ -293,4 +305,5 @@ func initIDinInteropsSlice(iops []interopedFunction) { func init() { initIDinInteropsSlice(systemInterops) initIDinInteropsSlice(neoInterops) + initIDinInteropsSlice(neoxInterops) }