core: get rid of NEP5TransferSize

Part of #1133

It will help us to use big.Int to store amount of NEP5 tokens. As far as
big.Int doesn't have constant size, we shouldn't use `NEP5TransferSize`
constant anymore.
This commit is contained in:
Anna Shaleva 2020-07-09 10:41:53 +03:00
parent f32920bf39
commit 43b28ffa06
2 changed files with 21 additions and 9 deletions

View file

@ -17,11 +17,10 @@ type NEP5Tracker struct {
// NEP5TransferLog is a log of NEP5 token transfers for the specific command. // NEP5TransferLog is a log of NEP5 token transfers for the specific command.
type NEP5TransferLog struct { type NEP5TransferLog struct {
Raw []byte Raw []byte
// size is the number of NEP5Transfers written into Raw
size int
} }
// NEP5TransferSize is a size of a marshaled NEP5Transfer struct in bytes.
const NEP5TransferSize = util.Uint160Size*3 + 8 + 4 + 8 + util.Uint256Size
// NEP5Transfer represents a single NEP5 Transfer event. // NEP5Transfer represents a single NEP5 Transfer event.
type NEP5Transfer struct { type NEP5Transfer struct {
// Asset is a NEP5 contract hash. // Asset is a NEP5 contract hash.
@ -89,6 +88,7 @@ func (lg *NEP5TransferLog) Append(tr *NEP5Transfer) error {
return w.Err return w.Err
} }
lg.Raw = append(lg.Raw, w.Bytes()...) lg.Raw = append(lg.Raw, w.Bytes()...)
lg.size++
return nil return nil
} }
@ -98,9 +98,10 @@ func (lg *NEP5TransferLog) ForEach(f func(*NEP5Transfer) error) error {
return nil return nil
} }
tr := new(NEP5Transfer) tr := new(NEP5Transfer)
for i := 0; i < len(lg.Raw); i += NEP5TransferSize { var bytesRead int
r := io.NewBinReaderFromBuf(lg.Raw[i : i+NEP5TransferSize]) for i := 0; i < len(lg.Raw); i += bytesRead {
tr.DecodeBinary(r) r := io.NewBinReaderFromBuf(lg.Raw[i:])
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 { } else if err := f(tr); err != nil {
@ -112,7 +113,7 @@ func (lg *NEP5TransferLog) ForEach(f func(*NEP5Transfer) error) error {
// Size returns an amount of transfer written in log. // Size returns an amount of transfer written in log.
func (lg *NEP5TransferLog) Size() int { func (lg *NEP5TransferLog) Size() int {
return len(lg.Raw) / NEP5TransferSize return lg.size
} }
// EncodeBinary implements io.Serializable interface. // EncodeBinary implements io.Serializable interface.
@ -128,7 +129,6 @@ func (t *NEP5Tracker) DecodeBinary(r *io.BinReader) {
} }
// EncodeBinary implements io.Serializable interface. // EncodeBinary implements io.Serializable interface.
// Note: change NEP5TransferSize constant when changing this function.
func (t *NEP5Transfer) EncodeBinary(w *io.BinWriter) { func (t *NEP5Transfer) EncodeBinary(w *io.BinWriter) {
w.WriteBytes(t.Asset[:]) w.WriteBytes(t.Asset[:])
w.WriteBytes(t.Tx[:]) w.WriteBytes(t.Tx[:])
@ -141,6 +141,11 @@ func (t *NEP5Transfer) EncodeBinary(w *io.BinWriter) {
// DecodeBinary implements io.Serializable interface. // DecodeBinary implements io.Serializable interface.
func (t *NEP5Transfer) DecodeBinary(r *io.BinReader) { func (t *NEP5Transfer) DecodeBinary(r *io.BinReader) {
_ = t.DecodeBinaryReturnCount(r)
}
// DecodeBinaryReturnCount decodes NEP5Transfer and returns the number of bytes read.
func (t *NEP5Transfer) DecodeBinaryReturnCount(r *io.BinReader) int {
r.ReadBytes(t.Asset[:]) r.ReadBytes(t.Asset[:])
r.ReadBytes(t.Tx[:]) r.ReadBytes(t.Tx[:])
r.ReadBytes(t.From[:]) r.ReadBytes(t.From[:])
@ -148,4 +153,5 @@ func (t *NEP5Transfer) DecodeBinary(r *io.BinReader) {
t.Block = r.ReadU32LE() t.Block = r.ReadU32LE()
t.Timestamp = r.ReadU64LE() t.Timestamp = r.ReadU64LE()
t.Amount = int64(r.ReadU64LE()) t.Amount = int64(r.ReadU64LE())
return util.Uint160Size*3 + 8 + 4 + 8 + util.Uint256Size
} }

View file

@ -64,7 +64,13 @@ func TestNEP5Transfer_DecodeBinary(t *testing.T) {
func TestNEP5TransferSize(t *testing.T) { func TestNEP5TransferSize(t *testing.T) {
tr := randomTransfer(rand.New(rand.NewSource(0))) tr := randomTransfer(rand.New(rand.NewSource(0)))
size := io.GetVarSize(tr) size := io.GetVarSize(tr)
require.EqualValues(t, NEP5TransferSize, size) w := io.NewBufBinWriter()
tr.EncodeBinary(w.BinWriter)
require.NoError(t, w.Err)
r := io.NewBinReaderFromBuf(w.Bytes())
actualTr := &NEP5Transfer{}
actual := actualTr.DecodeBinaryReturnCount(r)
require.EqualValues(t, actual, size)
} }
func randomTransfer(r *rand.Rand) *NEP5Transfer { func randomTransfer(r *rand.Rand) *NEP5Transfer {