neo-go/pkg/core/native_neo_test.go

102 lines
2.9 KiB
Go
Raw Normal View History

2020-08-03 13:24:22 +00:00
package core
import (
"math/big"
"testing"
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
"github.com/nspcc-dev/neo-go/pkg/internal/testchain"
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
2020-08-03 13:24:22 +00:00
"github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger"
"github.com/nspcc-dev/neo-go/pkg/util"
"github.com/nspcc-dev/neo-go/pkg/vm"
2020-08-03 13:24:22 +00:00
"github.com/stretchr/testify/require"
)
func setSigner(tx *transaction.Transaction, h util.Uint160) {
tx.Signers = []transaction.Signer{{
Account: h,
Scopes: transaction.Global,
}}
}
func TestNEO_Vote(t *testing.T) {
bc := newTestChain(t)
defer bc.Close()
neo := bc.contracts.NEO
tx := transaction.New(netmode.UnitTestNet, []byte{}, 0)
ic := bc.newInteropContext(trigger.System, bc.dao, nil, tx)
ic.VM = vm.New()
2020-08-03 13:24:22 +00:00
pubs, err := neo.GetValidatorsInternal(bc, ic.DAO)
require.NoError(t, err)
require.Equal(t, bc.GetStandByValidators(), pubs)
sz := testchain.Size()
candidates := make(keys.PublicKeys, sz)
for i := 0; i < sz; i++ {
priv, err := keys.NewPrivateKey()
require.NoError(t, err)
candidates[i] = priv.PublicKey()
if i > 0 {
require.NoError(t, neo.RegisterCandidateInternal(ic, candidates[i]))
}
}
for i := 0; i < sz; i++ {
to := testchain.PrivateKeyByID(i).GetScriptHash()
ic.VM.Load(testchain.MultisigVerificationScript())
ic.VM.LoadScriptWithHash(testchain.MultisigVerificationScript(), testchain.MultisigScriptHash(), smartcontract.All)
2020-08-03 13:24:22 +00:00
require.NoError(t, neo.TransferInternal(ic, testchain.MultisigScriptHash(), to, big.NewInt(int64(sz-i)*10000000)))
}
for i := 1; i < sz; i++ {
priv := testchain.PrivateKeyByID(i)
h := priv.GetScriptHash()
2020-08-03 13:24:22 +00:00
setSigner(tx, h)
ic.VM.Load(priv.PublicKey().GetVerificationScript())
2020-08-03 13:24:22 +00:00
require.NoError(t, neo.VoteInternal(ic, h, candidates[i]))
}
// First 3 validators must be the ones we have voted for.
pubs, err = neo.GetValidatorsInternal(bc, ic.DAO)
require.NoError(t, err)
for i := 1; i < sz; i++ {
require.Equal(t, pubs[i-1], candidates[i])
}
var ok bool
for _, p := range bc.GetStandByValidators() {
if pubs[sz-1].Equal(p) {
ok = true
break
}
}
require.True(t, ok, "last validator must be stand by")
// Register and give some value to the last validator.
require.NoError(t, neo.RegisterCandidateInternal(ic, candidates[0]))
priv := testchain.PrivateKeyByID(0)
h := priv.GetScriptHash()
2020-08-03 13:24:22 +00:00
setSigner(tx, h)
ic.VM.Load(priv.PublicKey().GetVerificationScript())
2020-08-03 13:24:22 +00:00
require.NoError(t, neo.VoteInternal(ic, h, candidates[0]))
pubs, err = neo.GetValidatorsInternal(bc, ic.DAO)
require.NoError(t, err)
require.Equal(t, candidates, pubs)
require.NoError(t, neo.UnregisterCandidateInternal(ic, candidates[0]))
require.Error(t, neo.VoteInternal(ic, h, candidates[0]))
pubs, err = neo.GetValidatorsInternal(bc, ic.DAO)
require.NoError(t, err)
for i := range pubs {
require.NotEqual(t, candidates[0], pubs[i])
}
2020-08-03 13:24:22 +00:00
}