diff --git a/pkg/innerring/state.go b/pkg/innerring/state.go index ef36566d8..f4d4cdbbb 100644 --- a/pkg/innerring/state.go +++ b/pkg/innerring/state.go @@ -1,5 +1,10 @@ package innerring +import ( + "github.com/nspcc-dev/neo-go/pkg/crypto/keys" + "github.com/nspcc-dev/neofs-node/pkg/innerring/invoke" +) + // EpochCounter is a getter for a global epoch counter. func (s *Server) EpochCounter() uint64 { return s.epochCounter.Load() @@ -21,3 +26,28 @@ func (s *Server) IsActive() bool { func (s *Server) Index() int32 { return s.innerRingIndex.Load() } + +func (s *Server) voteForSidechainValidator(validators []keys.PublicKey) error { + index := s.Index() + if index < 0 || index >= alphabetContractsN { + s.log.Info("ignore validator vote: node not in alphabet range") + + return nil + } + + if len(validators) == 0 { + s.log.Info("ignore validator vote: empty validators list") + + return nil + } + + // len(validators) can be less than 7, in this case we split votes by + // using `mod` operations, e.g: with two validators: + // - node[0] vote for validators[0], + // - node[1] vote for validators[1], + // - node[2] vote for validators[0], etc. + // If there are more than 7 validators, this function will ignore the rest. + candidate := validators[int(index)%len(validators)] + + return invoke.AlphabetVote(s.morphClient, s.contracts.alphabet[index], candidate) +}