core/state: reverse the order of ForEachTransfer

When using limits we're usually concerned about the most recent
transfers. Returning 3 transfers from the middle of the chain isn't very
helpful.
This commit is contained in:
Roman Khimov 2020-09-08 12:57:45 +03:00
parent ff11a5f990
commit 373c669c6a
3 changed files with 16 additions and 14 deletions

View file

@ -789,8 +789,8 @@ func (bc *Blockchain) ForEachNEP5Transfer(acc util.Uint160, f func(*state.NEP5Tr
if err != nil { if err != nil {
return nil return nil
} }
for i := uint32(0); i <= balances.NextTransferBatch; i++ { for i := int(balances.NextTransferBatch); i >= 0; i-- {
lg, err := bc.dao.GetNEP5TransferLog(acc, i) lg, err := bc.dao.GetNEP5TransferLog(acc, uint32(i))
if err != nil { if err != nil {
return nil return nil
} }

View file

@ -103,18 +103,20 @@ func (lg *NEP5TransferLog) Append(tr *NEP5Transfer) error {
// ForEach iterates over transfer log returning on first error. // ForEach iterates over transfer log returning on first error.
func (lg *NEP5TransferLog) ForEach(f func(*NEP5Transfer) error) error { func (lg *NEP5TransferLog) ForEach(f func(*NEP5Transfer) error) error {
if lg == nil { if lg == nil || len(lg.Raw) == 0 {
return nil return nil
} }
tr := new(NEP5Transfer) transfers := make([]NEP5Transfer, lg.Size())
var bytesRead int r := io.NewBinReaderFromBuf(lg.Raw[1:])
for i := 1; i < len(lg.Raw); i += bytesRead { for i := 0; i < lg.Size(); i++ {
r := io.NewBinReaderFromBuf(lg.Raw[i:]) transfers[i].DecodeBinary(r)
bytesRead = tr.DecodeBinaryReturnCount(r) }
if r.Err != nil { if r.Err != nil {
return r.Err return r.Err
} else if err := f(tr); err != nil { }
return nil for i := len(transfers) - 1; i >= 0; i-- {
if err := f(&transfers[i]); err != nil {
return err
} }
} }
return nil return nil

View file

@ -29,10 +29,10 @@ func TestNEP5TransferLog_Append(t *testing.T) {
require.Equal(t, len(expected), lg.Size()) require.Equal(t, len(expected), lg.Size())
i := 0 i := len(expected) - 1
err := lg.ForEach(func(tr *NEP5Transfer) error { err := lg.ForEach(func(tr *NEP5Transfer) error {
require.Equal(t, expected[i], tr) require.Equal(t, expected[i], tr)
i++ i--
return nil return nil
}) })
require.NoError(t, err) require.NoError(t, err)