github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/core/native_designate_test.go (about) 1 package core 2 3 import ( 4 "testing" 5 6 "github.com/nspcc-dev/neo-go/internal/testchain" 7 "github.com/nspcc-dev/neo-go/pkg/core/block" 8 "github.com/nspcc-dev/neo-go/pkg/core/native" 9 "github.com/nspcc-dev/neo-go/pkg/core/native/noderoles" 10 "github.com/nspcc-dev/neo-go/pkg/core/transaction" 11 "github.com/nspcc-dev/neo-go/pkg/crypto/keys" 12 "github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger" 13 "github.com/nspcc-dev/neo-go/pkg/vm/opcode" 14 "github.com/stretchr/testify/require" 15 ) 16 17 // Technically this test belongs to the native package, but it's so deeply tied to 18 // the core internals that it needs to be rewritten to be moved. So let it be 19 // there just to remind us about the imperfect world we live in. 20 func TestDesignate_DesignateAsRole(t *testing.T) { 21 bc := newTestChain(t) 22 23 des := bc.contracts.Designate 24 tx := transaction.New([]byte{byte(opcode.PUSH1)}, 0) 25 bl := block.New(bc.config.StateRootInHeader) 26 bl.Index = bc.BlockHeight() + 1 27 ic := bc.newInteropContext(trigger.Application, bc.dao, bl, tx) 28 ic.SpawnVM() 29 ic.VM.LoadScript([]byte{byte(opcode.RET)}) 30 31 _, _, err := des.GetDesignatedByRole(bc.dao, 0xFF, 255) 32 require.ErrorIs(t, err, native.ErrInvalidRole) 33 34 pubs, index, err := des.GetDesignatedByRole(bc.dao, noderoles.Oracle, 255) 35 require.NoError(t, err) 36 require.Equal(t, 0, len(pubs)) 37 require.Equal(t, uint32(0), index) 38 39 err = des.DesignateAsRole(ic, noderoles.Oracle, keys.PublicKeys{}) 40 require.ErrorIs(t, err, native.ErrEmptyNodeList) 41 42 err = des.DesignateAsRole(ic, noderoles.Oracle, make(keys.PublicKeys, 32+1)) 43 require.ErrorIs(t, err, native.ErrLargeNodeList) 44 45 priv, err := keys.NewPrivateKey() 46 require.NoError(t, err) 47 pub := priv.PublicKey() 48 49 err = des.DesignateAsRole(ic, 0xFF, keys.PublicKeys{pub}) 50 require.ErrorIs(t, err, native.ErrInvalidRole) 51 52 err = des.DesignateAsRole(ic, noderoles.Oracle, keys.PublicKeys{pub}) 53 require.ErrorIs(t, err, native.ErrInvalidWitness) 54 55 setSigner(tx, testchain.CommitteeScriptHash()) 56 err = des.DesignateAsRole(ic, noderoles.Oracle, keys.PublicKeys{pub}) 57 require.NoError(t, err) 58 59 pubs, index, err = des.GetDesignatedByRole(ic.DAO, noderoles.Oracle, bl.Index+1) 60 require.NoError(t, err) 61 require.Equal(t, keys.PublicKeys{pub}, pubs) 62 require.Equal(t, bl.Index+1, index) 63 64 pubs, index, err = des.GetDesignatedByRole(ic.DAO, noderoles.StateValidator, 255) 65 require.NoError(t, err) 66 require.Equal(t, 0, len(pubs)) 67 require.Equal(t, uint32(0), index) 68 69 // Set StateValidator role. 70 _, err = keys.NewPrivateKey() 71 require.NoError(t, err) 72 pub1 := priv.PublicKey() 73 err = des.DesignateAsRole(ic, noderoles.StateValidator, keys.PublicKeys{pub1}) 74 require.NoError(t, err) 75 76 pubs, index, err = des.GetDesignatedByRole(ic.DAO, noderoles.Oracle, 255) 77 require.NoError(t, err) 78 require.Equal(t, keys.PublicKeys{pub}, pubs) 79 require.Equal(t, bl.Index+1, index) 80 81 pubs, index, err = des.GetDesignatedByRole(ic.DAO, noderoles.StateValidator, 255) 82 require.NoError(t, err) 83 require.Equal(t, keys.PublicKeys{pub1}, pubs) 84 require.Equal(t, bl.Index+1, index) 85 86 // Set P2PNotary role. 87 pubs, index, err = des.GetDesignatedByRole(ic.DAO, noderoles.P2PNotary, 255) 88 require.NoError(t, err) 89 require.Equal(t, 0, len(pubs)) 90 require.Equal(t, uint32(0), index) 91 92 err = des.DesignateAsRole(ic, noderoles.P2PNotary, keys.PublicKeys{pub1}) 93 require.NoError(t, err) 94 95 pubs, index, err = des.GetDesignatedByRole(ic.DAO, noderoles.P2PNotary, 255) 96 require.NoError(t, err) 97 require.Equal(t, keys.PublicKeys{pub1}, pubs) 98 require.Equal(t, bl.Index+1, index) 99 }