• R/O
  • HTTP
  • SSH
  • HTTPS

vapor: 提交

Golang implemented sidechain for Bytom


Commit MetaInfo

修订版cb7cbe853f41babf892f935896773df131519582 (tree)
时间2020-02-13 22:02:13
作者Paladz <yzhu101@uott...>
CommiterGitHub

Log Message

fix add order bug (#489)

* fix add order bug

* edit for code review

Co-authored-by: Colt-Z <453256728@qq.com>

更改概述

差异

--- a/application/mov/match/match.go
+++ b/application/mov/match/match.go
@@ -113,9 +113,7 @@ func (e *Engine) addPartialTradeOrder(tx *types.Tx) error {
113113 return err
114114 }
115115
116- if err := e.orderBook.AddOrder(order); err != nil {
117- return err
118- }
116+ e.orderBook.AddOrder(order)
119117 }
120118 return nil
121119 }
--- a/application/mov/match/order_book.go
+++ b/application/mov/match/order_book.go
@@ -6,7 +6,6 @@ import (
66
77 "github.com/bytom/vapor/application/mov/common"
88 "github.com/bytom/vapor/application/mov/database"
9- "github.com/bytom/vapor/errors"
109 )
1110
1211 // OrderBook is used to handle the mov orders in memory like stack
@@ -59,16 +58,16 @@ func NewOrderBook(movStore database.MovStore, arrivalAddOrders, arrivalDelOrders
5958
6059 // AddOrder add the in memory temp order to order table, because temp order is what left for the
6160 // partial trade order, so the price should be lowest.
62-func (o *OrderBook) AddOrder(order *common.Order) error {
61+func (o *OrderBook) AddOrder(order *common.Order) {
6362 tradePairKey := order.TradePair().Key()
6463 orders := o.getArrivalAddOrders(tradePairKey)
65- if len(orders) > 0 && order.Cmp(orders[len(orders)-1]) > 0 {
66- return errors.New("rate of order must less than the min order in order table")
67- }
68-
64+ // use binary search to find the insert position
65+ i := sort.Search(len(orders), func(i int) bool { return order.Cmp(orders[i]) > 0 })
6966 orders = append(orders, order)
67+ copy(orders[i+1:], orders[i:])
68+ orders[i] = order
69+
7070 o.arrivalAddOrders.Store(tradePairKey, orders)
71- return nil
7271 }
7372
7473 // DelOrder mark the order has been deleted in order book
--- a/application/mov/match/order_book_test.go
+++ b/application/mov/match/order_book_test.go
@@ -173,9 +173,7 @@ func TestOrderBook(t *testing.T) {
173173 for i, c := range cases {
174174 orderBook := NewOrderBook(c.initMovStore, c.initArrivalAddOrders, c.initArrivalDelOrders)
175175 for _, order := range c.addOrders {
176- if err := orderBook.AddOrder(order); err != nil {
177- t.Fatal(err)
178- }
176+ orderBook.AddOrder(order)
179177 }
180178
181179 for _, tradePair := range c.popOrders {
@@ -300,3 +298,79 @@ func TestPeekArrivalOrder(t *testing.T) {
300298 }
301299 }
302300 }
301+
302+func TestAddOrder(t *testing.T) {
303+ cases := []struct {
304+ initOrders []*common.Order
305+ wantOrders []*common.Order
306+ addOrder *common.Order
307+ }{
308+ {
309+ initOrders: []*common.Order{},
310+ addOrder: &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 53, RatioDenominator: 1},
311+ wantOrders: []*common.Order{
312+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 53, RatioDenominator: 1},
313+ },
314+ },
315+ {
316+ initOrders: []*common.Order{
317+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 51, RatioDenominator: 1},
318+ },
319+ addOrder: &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 50, RatioDenominator: 1},
320+ wantOrders: []*common.Order{
321+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 51, RatioDenominator: 1},
322+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 50, RatioDenominator: 1},
323+ },
324+ },
325+ {
326+ initOrders: []*common.Order{
327+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 50, RatioDenominator: 1},
328+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 51, RatioDenominator: 1},
329+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 52, RatioDenominator: 1},
330+ },
331+ addOrder: &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 53, RatioDenominator: 1},
332+ wantOrders: []*common.Order{
333+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 53, RatioDenominator: 1},
334+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 52, RatioDenominator: 1},
335+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 51, RatioDenominator: 1},
336+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 50, RatioDenominator: 1},
337+ },
338+ },
339+ {
340+ initOrders: []*common.Order{
341+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 50, RatioDenominator: 1},
342+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 51, RatioDenominator: 1},
343+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 52, RatioDenominator: 1},
344+ },
345+ addOrder: &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 49, RatioDenominator: 1},
346+ wantOrders: []*common.Order{
347+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 52, RatioDenominator: 1},
348+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 51, RatioDenominator: 1},
349+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 50, RatioDenominator: 1},
350+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 49, RatioDenominator: 1},
351+ },
352+ },
353+ {
354+ initOrders: []*common.Order{
355+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 52, RatioDenominator: 1},
356+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 51, RatioDenominator: 1},
357+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 49, RatioDenominator: 1},
358+ },
359+ addOrder: &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 50, RatioDenominator: 1},
360+ wantOrders: []*common.Order{
361+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 52, RatioDenominator: 1},
362+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 51, RatioDenominator: 1},
363+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 50, RatioDenominator: 1},
364+ &common.Order{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH, RatioNumerator: 49, RatioDenominator: 1},
365+ },
366+ },
367+ }
368+
369+ for i, c := range cases {
370+ orderBook := NewOrderBook(mock.NewMovStore(nil, nil), c.initOrders, nil)
371+ orderBook.AddOrder(c.addOrder)
372+ if gotOrders := orderBook.getArrivalAddOrders(btc2eth.Key()); !testutil.DeepEqual(gotOrders, c.wantOrders) {
373+ t.Fatalf("#%d: the gotOrders(%v) is differnt than wantOrders(%v)", i, gotOrders, c.wantOrders)
374+ }
375+ }
376+}
--- a/application/mov/mov_core.go
+++ b/application/mov/mov_core.go
@@ -287,9 +287,7 @@ func (m *MovCore) validateMatchedTxSequence(txs []*types.Tx) error {
287287 }
288288
289289 for _, order := range addOrders {
290- if err := orderBook.AddOrder(order); err != nil {
291- return err
292- }
290+ orderBook.AddOrder(order)
293291 }
294292 }
295293 return nil
Show on old repository browser