Golang implemented sidechain for Bytom
修订版 | cb7cbe853f41babf892f935896773df131519582 (tree) |
---|---|
时间 | 2020-02-13 22:02:13 |
作者 | Paladz <yzhu101@uott...> |
Commiter | GitHub |
fix add order bug (#489)
* fix add order bug
* edit for code review
Co-authored-by: Colt-Z <453256728@qq.com>
@@ -113,9 +113,7 @@ func (e *Engine) addPartialTradeOrder(tx *types.Tx) error { | ||
113 | 113 | return err |
114 | 114 | } |
115 | 115 | |
116 | - if err := e.orderBook.AddOrder(order); err != nil { | |
117 | - return err | |
118 | - } | |
116 | + e.orderBook.AddOrder(order) | |
119 | 117 | } |
120 | 118 | return nil |
121 | 119 | } |
@@ -6,7 +6,6 @@ import ( | ||
6 | 6 | |
7 | 7 | "github.com/bytom/vapor/application/mov/common" |
8 | 8 | "github.com/bytom/vapor/application/mov/database" |
9 | - "github.com/bytom/vapor/errors" | |
10 | 9 | ) |
11 | 10 | |
12 | 11 | // OrderBook is used to handle the mov orders in memory like stack |
@@ -59,16 +58,16 @@ func NewOrderBook(movStore database.MovStore, arrivalAddOrders, arrivalDelOrders | ||
59 | 58 | |
60 | 59 | // AddOrder add the in memory temp order to order table, because temp order is what left for the |
61 | 60 | // 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) { | |
63 | 62 | tradePairKey := order.TradePair().Key() |
64 | 63 | 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 }) | |
69 | 66 | orders = append(orders, order) |
67 | + copy(orders[i+1:], orders[i:]) | |
68 | + orders[i] = order | |
69 | + | |
70 | 70 | o.arrivalAddOrders.Store(tradePairKey, orders) |
71 | - return nil | |
72 | 71 | } |
73 | 72 | |
74 | 73 | // DelOrder mark the order has been deleted in order book |
@@ -173,9 +173,7 @@ func TestOrderBook(t *testing.T) { | ||
173 | 173 | for i, c := range cases { |
174 | 174 | orderBook := NewOrderBook(c.initMovStore, c.initArrivalAddOrders, c.initArrivalDelOrders) |
175 | 175 | for _, order := range c.addOrders { |
176 | - if err := orderBook.AddOrder(order); err != nil { | |
177 | - t.Fatal(err) | |
178 | - } | |
176 | + orderBook.AddOrder(order) | |
179 | 177 | } |
180 | 178 | |
181 | 179 | for _, tradePair := range c.popOrders { |
@@ -300,3 +298,79 @@ func TestPeekArrivalOrder(t *testing.T) { | ||
300 | 298 | } |
301 | 299 | } |
302 | 300 | } |
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 | +} |
@@ -287,9 +287,7 @@ func (m *MovCore) validateMatchedTxSequence(txs []*types.Tx) error { | ||
287 | 287 | } |
288 | 288 | |
289 | 289 | for _, order := range addOrders { |
290 | - if err := orderBook.AddOrder(order); err != nil { | |
291 | - return err | |
292 | - } | |
290 | + orderBook.AddOrder(order) | |
293 | 291 | } |
294 | 292 | } |
295 | 293 | return nil |