Skip to content

Commit

Permalink
state: always deserialize LastGasPerVote
Browse files Browse the repository at this point in the history
It can be non-zero even if VoteTo is NULL. Fixes state diff with 3.6.0:

  block 41660: value mismatch for key +////xTrvgat3qG/w8hQoD/I4MgUz6rygA==: QQQhAS8hA7yiAAAhAA== vs QQQhAS8hA7yiAAAhB+POSWfBCAE=

Related to #2844.

Signed-off-by: Roman Khimov <roman@nspcc.ru>
  • Loading branch information
roman-khimov committed Sep 5, 2023
1 parent c6850b4 commit 9bdf66a
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 10 deletions.
20 changes: 10 additions & 10 deletions pkg/core/state/native_state.go
Original file line number Diff line number Diff line change
Expand Up @@ -148,17 +148,17 @@ func (s *NEOBalance) FromStackItem(item stackitem.Item) error {
s.BalanceHeight = uint32(h.Int64())
if _, ok := structItem[2].(stackitem.Null); ok {
s.VoteTo = nil
return nil
}
bs, err := structItem[2].TryBytes()
if err != nil {
return fmt.Errorf("invalid public key stackitem: %w", err)
}
pub, err := keys.NewPublicKeyFromBytes(bs, elliptic.P256())
if err != nil {
return fmt.Errorf("invalid public key bytes: %w", err)
} else {
bs, err := structItem[2].TryBytes()
if err != nil {
return fmt.Errorf("invalid public key stackitem: %w", err)
}

Check warning on line 155 in pkg/core/state/native_state.go

View check run for this annotation

Codecov / codecov/patch

pkg/core/state/native_state.go#L154-L155

Added lines #L154 - L155 were not covered by tests
pub, err := keys.NewPublicKeyFromBytes(bs, elliptic.P256())
if err != nil {
return fmt.Errorf("invalid public key bytes: %w", err)
}

Check warning on line 159 in pkg/core/state/native_state.go

View check run for this annotation

Codecov / codecov/patch

pkg/core/state/native_state.go#L158-L159

Added lines #L158 - L159 were not covered by tests
s.VoteTo = pub
}
s.VoteTo = pub
if len(structItem) >= 4 {
lastGasPerVote, err := structItem[3].TryInteger()
if err != nil {
Expand Down
32 changes: 32 additions & 0 deletions pkg/core/state/native_state_test.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package state

import (
"math/big"
"testing"

"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
"github.com/stretchr/testify/require"
)
Expand Down Expand Up @@ -47,6 +49,36 @@ func TestNEP17BalanceFromBytesInvalid(t *testing.T) {
require.Error(t, err)
}

func TestNEOBalanceSerialization(t *testing.T) {
var b = NEOBalance{
NEP17Balance: NEP17Balance{*big.NewInt(100500)},
BalanceHeight: 42,
}
si, err := b.ToStackItem()
require.NoError(t, err)

var bb NEOBalance
require.NoError(t, bb.FromStackItem(si))
require.Equal(t, b, bb)

b.VoteTo, err = keys.NewPublicKeyFromString("03b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c")
require.NoError(t, err)
b.LastGasPerVote = *big.NewInt(100500)

si, err = b.ToStackItem()
require.NoError(t, err)
bb = NEOBalance{}
require.NoError(t, bb.FromStackItem(si))
require.Equal(t, b, bb)

b.VoteTo = nil
si, err = b.ToStackItem()
require.NoError(t, err)
bb = NEOBalance{}
require.NoError(t, bb.FromStackItem(si))
require.Equal(t, b, bb)
}

func BenchmarkNEP17BalanceBytes(b *testing.B) {
var bl NEP17Balance
bl.Balance.SetInt64(0x12345678910)
Expand Down

0 comments on commit 9bdf66a

Please sign in to comment.