forked from TrueCloudLab/neoneo-go
Merge pull request #1834 from nspcc-dev/interop/remove-isstandardcontract
core: remove System.Contract.IsStandard
This commit is contained in:
commit
dcc02744aa
6 changed files with 0 additions and 98 deletions
|
@ -64,7 +64,6 @@ func TestSyscallExecution(t *testing.T) {
|
||||||
"contract.Call": {interopnames.SystemContractCall, []string{u160, `"m"`, "1", "3"}, false},
|
"contract.Call": {interopnames.SystemContractCall, []string{u160, `"m"`, "1", "3"}, false},
|
||||||
"contract.CreateMultisigAccount": {interopnames.SystemContractCreateMultisigAccount, []string{"1", pubs}, false},
|
"contract.CreateMultisigAccount": {interopnames.SystemContractCreateMultisigAccount, []string{"1", pubs}, false},
|
||||||
"contract.CreateStandardAccount": {interopnames.SystemContractCreateStandardAccount, []string{pub}, false},
|
"contract.CreateStandardAccount": {interopnames.SystemContractCreateStandardAccount, []string{pub}, false},
|
||||||
"contract.IsStandard": {interopnames.SystemContractIsStandard, []string{u160}, false},
|
|
||||||
"contract.GetCallFlags": {interopnames.SystemContractGetCallFlags, nil, false},
|
"contract.GetCallFlags": {interopnames.SystemContractGetCallFlags, nil, false},
|
||||||
"iterator.Create": {interopnames.SystemIteratorCreate, []string{pubs}, false},
|
"iterator.Create": {interopnames.SystemIteratorCreate, []string{pubs}, false},
|
||||||
"iterator.Next": {interopnames.SystemIteratorNext, []string{"iterator.Iterator{}"}, false},
|
"iterator.Next": {interopnames.SystemIteratorNext, []string{"iterator.Iterator{}"}, false},
|
||||||
|
|
|
@ -10,7 +10,6 @@ const (
|
||||||
SystemContractCallNative = "System.Contract.CallNative"
|
SystemContractCallNative = "System.Contract.CallNative"
|
||||||
SystemContractCreateMultisigAccount = "System.Contract.CreateMultisigAccount"
|
SystemContractCreateMultisigAccount = "System.Contract.CreateMultisigAccount"
|
||||||
SystemContractCreateStandardAccount = "System.Contract.CreateStandardAccount"
|
SystemContractCreateStandardAccount = "System.Contract.CreateStandardAccount"
|
||||||
SystemContractIsStandard = "System.Contract.IsStandard"
|
|
||||||
SystemContractGetCallFlags = "System.Contract.GetCallFlags"
|
SystemContractGetCallFlags = "System.Contract.GetCallFlags"
|
||||||
SystemContractNativeOnPersist = "System.Contract.NativeOnPersist"
|
SystemContractNativeOnPersist = "System.Contract.NativeOnPersist"
|
||||||
SystemContractNativePostPersist = "System.Contract.NativePostPersist"
|
SystemContractNativePostPersist = "System.Contract.NativePostPersist"
|
||||||
|
@ -50,7 +49,6 @@ var names = []string{
|
||||||
SystemContractCallNative,
|
SystemContractCallNative,
|
||||||
SystemContractCreateMultisigAccount,
|
SystemContractCreateMultisigAccount,
|
||||||
SystemContractCreateStandardAccount,
|
SystemContractCreateStandardAccount,
|
||||||
SystemContractIsStandard,
|
|
||||||
SystemContractGetCallFlags,
|
SystemContractGetCallFlags,
|
||||||
SystemContractNativeOnPersist,
|
SystemContractNativeOnPersist,
|
||||||
SystemContractNativePostPersist,
|
SystemContractNativePostPersist,
|
||||||
|
|
|
@ -14,8 +14,6 @@ import (
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/hash"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/hash"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/vm"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
|
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -176,31 +174,6 @@ func storageContextAsReadOnly(ic *interop.Context) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// contractIsStandard checks if contract is standard (sig or multisig) contract.
|
|
||||||
func contractIsStandard(ic *interop.Context) error {
|
|
||||||
h := ic.VM.Estack().Pop().Bytes()
|
|
||||||
u, err := util.Uint160DecodeBytesBE(h)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var result bool
|
|
||||||
cs, _ := ic.GetContract(u)
|
|
||||||
if cs != nil {
|
|
||||||
result = vm.IsStandardContract(cs.NEF.Script)
|
|
||||||
} else {
|
|
||||||
if tx, ok := ic.Container.(*transaction.Transaction); ok {
|
|
||||||
for _, witness := range tx.Scripts {
|
|
||||||
if witness.ScriptHash() == u {
|
|
||||||
result = vm.IsStandardContract(witness.VerificationScript)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ic.VM.Estack().PushVal(result)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// contractCreateMultisigAccount calculates multisig contract scripthash for a
|
// contractCreateMultisigAccount calculates multisig contract scripthash for a
|
||||||
// given m and a set of public keys.
|
// given m and a set of public keys.
|
||||||
func contractCreateMultisigAccount(ic *interop.Context) error {
|
func contractCreateMultisigAccount(ic *interop.Context) error {
|
||||||
|
|
|
@ -6,9 +6,7 @@ import (
|
||||||
"math/big"
|
"math/big"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/dbft/crypto"
|
|
||||||
"github.com/nspcc-dev/neo-go/internal/random"
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/interop"
|
"github.com/nspcc-dev/neo-go/pkg/core/interop"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/interop/contract"
|
"github.com/nspcc-dev/neo-go/pkg/core/interop/contract"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/interop/interopnames"
|
"github.com/nspcc-dev/neo-go/pkg/core/interop/interopnames"
|
||||||
|
@ -30,65 +28,6 @@ import (
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestContractIsStandard(t *testing.T) {
|
|
||||||
v, ic, chain := createVM(t)
|
|
||||||
|
|
||||||
t.Run("contract not stored", func(t *testing.T) {
|
|
||||||
priv, err := keys.NewPrivateKey()
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
pub := priv.PublicKey()
|
|
||||||
tx := transaction.New(netmode.TestNet, []byte{1, 2, 3}, 1)
|
|
||||||
tx.Scripts = []transaction.Witness{
|
|
||||||
{
|
|
||||||
InvocationScript: []byte{1, 2, 3},
|
|
||||||
VerificationScript: pub.GetVerificationScript(),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
ic.Container = tx
|
|
||||||
|
|
||||||
t.Run("true", func(t *testing.T) {
|
|
||||||
v.Estack().PushVal(pub.GetScriptHash().BytesBE())
|
|
||||||
require.NoError(t, contractIsStandard(ic))
|
|
||||||
require.True(t, v.Estack().Pop().Bool())
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("false", func(t *testing.T) {
|
|
||||||
tx.Scripts[0].VerificationScript = []byte{9, 8, 7}
|
|
||||||
v.Estack().PushVal(pub.GetScriptHash().BytesBE())
|
|
||||||
require.NoError(t, contractIsStandard(ic))
|
|
||||||
require.False(t, v.Estack().Pop().Bool())
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("contract stored, true", func(t *testing.T) {
|
|
||||||
priv, err := keys.NewPrivateKey()
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
pub := priv.PublicKey()
|
|
||||||
ne, err := nef.NewFile(pub.GetVerificationScript())
|
|
||||||
require.NoError(t, err)
|
|
||||||
err = chain.contracts.Management.PutContractState(ic.DAO,
|
|
||||||
&state.Contract{ContractBase: state.ContractBase{ID: 42, Hash: pub.GetScriptHash(), NEF: *ne}})
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
v.Estack().PushVal(pub.GetScriptHash().BytesBE())
|
|
||||||
require.NoError(t, contractIsStandard(ic))
|
|
||||||
require.True(t, v.Estack().Pop().Bool())
|
|
||||||
})
|
|
||||||
t.Run("contract stored, false", func(t *testing.T) {
|
|
||||||
script := []byte{byte(opcode.PUSHT)}
|
|
||||||
ne, err := nef.NewFile(script)
|
|
||||||
require.NoError(t, err)
|
|
||||||
require.NoError(t, chain.contracts.Management.PutContractState(ic.DAO,
|
|
||||||
&state.Contract{ContractBase: state.ContractBase{ID: 24, Hash: hash.Hash160(script), NEF: *ne}}))
|
|
||||||
|
|
||||||
v.Estack().PushVal(crypto.Hash160(script).BytesBE())
|
|
||||||
require.NoError(t, contractIsStandard(ic))
|
|
||||||
require.False(t, v.Estack().Pop().Bool())
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestContractCreateAccount(t *testing.T) {
|
func TestContractCreateAccount(t *testing.T) {
|
||||||
v, ic, _ := createVM(t)
|
v, ic, _ := createVM(t)
|
||||||
t.Run("Good", func(t *testing.T) {
|
t.Run("Good", func(t *testing.T) {
|
||||||
|
|
|
@ -35,7 +35,6 @@ var systemInterops = []interop.Function{
|
||||||
{Name: interopnames.SystemContractCallNative, Func: native.Call, Price: 0, ParamCount: 1},
|
{Name: interopnames.SystemContractCallNative, Func: native.Call, Price: 0, ParamCount: 1},
|
||||||
{Name: interopnames.SystemContractCreateMultisigAccount, Func: contractCreateMultisigAccount, Price: 1 << 8, ParamCount: 2},
|
{Name: interopnames.SystemContractCreateMultisigAccount, Func: contractCreateMultisigAccount, Price: 1 << 8, ParamCount: 2},
|
||||||
{Name: interopnames.SystemContractCreateStandardAccount, Func: contractCreateStandardAccount, Price: 1 << 8, ParamCount: 1},
|
{Name: interopnames.SystemContractCreateStandardAccount, Func: contractCreateStandardAccount, Price: 1 << 8, ParamCount: 1},
|
||||||
{Name: interopnames.SystemContractIsStandard, Func: contractIsStandard, Price: 1 << 10, RequiredFlags: callflag.ReadStates, ParamCount: 1},
|
|
||||||
{Name: interopnames.SystemContractGetCallFlags, Func: contractGetCallFlags, Price: 1 << 10},
|
{Name: interopnames.SystemContractGetCallFlags, Func: contractGetCallFlags, Price: 1 << 10},
|
||||||
{Name: interopnames.SystemContractNativeOnPersist, Func: native.OnPersist, Price: 0, RequiredFlags: callflag.WriteStates},
|
{Name: interopnames.SystemContractNativeOnPersist, Func: native.OnPersist, Price: 0, RequiredFlags: callflag.WriteStates},
|
||||||
{Name: interopnames.SystemContractNativePostPersist, Func: native.PostPersist, Price: 0, RequiredFlags: callflag.WriteStates},
|
{Name: interopnames.SystemContractNativePostPersist, Func: native.PostPersist, Price: 0, RequiredFlags: callflag.WriteStates},
|
||||||
|
|
|
@ -24,12 +24,6 @@ const (
|
||||||
NoneFlag CallFlag = 0
|
NoneFlag CallFlag = 0
|
||||||
)
|
)
|
||||||
|
|
||||||
// IsStandard checks if contract with provided hash is a standard signature/multisig contract.
|
|
||||||
// This function uses `System.Contract.IsStandard` syscall.
|
|
||||||
func IsStandard(h interop.Hash160) bool {
|
|
||||||
return neogointernal.Syscall1("System.Contract.IsStandard", h).(bool)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateMultisigAccount calculates script hash of an m out of n multisignature
|
// CreateMultisigAccount calculates script hash of an m out of n multisignature
|
||||||
// script using given m and a set of public keys bytes. This function uses
|
// script using given m and a set of public keys bytes. This function uses
|
||||||
// `System.Contract.CreateMultisigAccount` syscall.
|
// `System.Contract.CreateMultisigAccount` syscall.
|
||||||
|
|
Loading…
Reference in a new issue