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  }