Commit 7a717b8d authored by hxzqlh's avatar hxzqlh

update matchModel

parent e891a96d
...@@ -317,7 +317,7 @@ func (a *Action) matchLimitOrder(payload *et.LimitOrder, leftAccountDB, rightAcc ...@@ -317,7 +317,7 @@ func (a *Action) matchLimitOrder(payload *et.LimitOrder, leftAccountDB, rightAcc
continue continue
} }
//撮合,指针传递 //撮合,指针传递
log, kv, err := a.matchModel(leftAccountDB, rightAccountDB, payload, matchorder, or, re) log, kv, err := a.matchModel(leftAccountDB, rightAccountDB, payload, matchorder, or, re) // payload, or redundant
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -382,13 +382,18 @@ func (a *Action) matchLimitOrder(payload *et.LimitOrder, leftAccountDB, rightAcc ...@@ -382,13 +382,18 @@ func (a *Action) matchLimitOrder(payload *et.LimitOrder, leftAccountDB, rightAcc
func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload *et.LimitOrder, matchorder *et.Order, or *et.Order, re *et.ReceiptExchange) ([]*types.ReceiptLog, []*types.KeyValue, error) { func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload *et.LimitOrder, matchorder *et.Order, or *et.Order, re *et.ReceiptExchange) ([]*types.ReceiptLog, []*types.KeyValue, error) {
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
var kvs []*types.KeyValue var kvs []*types.KeyValue
//TODO 这里得逻辑是否需要调整?当匹配的单数过多,会导致receipt日志数量激增,理论上存在日志存储攻击,需要加下最大匹配深度,防止这种攻击发生 var matched int64
//先判断挂单得额度够不够,只有两种状态,大于等于,或者小于
if matchorder.GetBalance() >= or.GetBalance() { if matchorder.GetBalance() >= or.GetBalance() {
matched = or.GetBalance()
} else {
matched = matchorder.GetBalance()
}
// 挂卖吃 matchorder:买单
if payload.Op == et.OpSell { if payload.Op == et.OpSell {
//转移冻结资产 //转移冻结资产
amount := a.calcActualCost(matchorder.GetLimitOrder().Op, or.GetBalance(), payload.Price) amount := a.calcActualCost(matchorder.GetLimitOrder().Op, matched, payload.Price)
receipt, err := rightAccountDB.ExecTransferFrozen(matchorder.Addr, a.fromaddr, a.execaddr, amount) receipt, err := rightAccountDB.ExecTransferFrozen(matchorder.Addr, a.fromaddr, a.execaddr, amount)
if err != nil { if err != nil {
elog.Error("matchLimitOrder.ExecTransferFrozen", "addr", matchorder.Addr, "amount", amount, "err", err) elog.Error("matchLimitOrder.ExecTransferFrozen", "addr", matchorder.Addr, "amount", amount, "err", err)
...@@ -399,7 +404,7 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload * ...@@ -399,7 +404,7 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload *
//解冻多余资金 //解冻多余资金
if payload.Price < matchorder.GetLimitOrder().Price { if payload.Price < matchorder.GetLimitOrder().Price {
amount := a.calcActualCost(matchorder.GetLimitOrder().Op, or.GetBalance(), matchorder.GetLimitOrder().Price-payload.Price) amount := a.calcActualCost(matchorder.GetLimitOrder().Op, matched, matchorder.GetLimitOrder().Price-payload.Price)
receipt, err := rightAccountDB.ExecActive(matchorder.Addr, a.execaddr, amount) receipt, err := rightAccountDB.ExecActive(matchorder.Addr, a.execaddr, amount)
if err != nil { if err != nil {
elog.Error("matchLimitOrder.ExecActive", "addr", matchorder.Addr, "amount", amount, "err", err.Error()) elog.Error("matchLimitOrder.ExecActive", "addr", matchorder.Addr, "amount", amount, "err", err.Error())
...@@ -409,7 +414,7 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload * ...@@ -409,7 +414,7 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload *
kvs = append(kvs, receipt.KV...) kvs = append(kvs, receipt.KV...)
} }
//将达成交易的相应资产结算 //将达成交易的相应资产结算
amount = a.calcActualCost(payload.Op, or.GetBalance(), payload.Price) amount = a.calcActualCost(payload.Op, matched, payload.Price)
receipt, err = leftAccountDB.ExecTransfer(a.fromaddr, matchorder.Addr, a.execaddr, amount) receipt, err = leftAccountDB.ExecTransfer(a.fromaddr, matchorder.Addr, a.execaddr, amount)
if err != nil { if err != nil {
elog.Error("matchLimitOrder.ExecTransfer", "addr", a.fromaddr, "amount", amount, "err", err.Error()) elog.Error("matchLimitOrder.ExecTransfer", "addr", a.fromaddr, "amount", amount, "err", err.Error())
...@@ -422,11 +427,11 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload * ...@@ -422,11 +427,11 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload *
or.AVGPrice = payload.Price or.AVGPrice = payload.Price
//计算matchOrder平均成交价格 //计算matchOrder平均成交价格
matchorder.AVGPrice = caclAVGPrice(matchorder, payload.Price, payload.Amount) matchorder.AVGPrice = caclAVGPrice(matchorder, payload.Price, payload.Amount)
} }
// 挂买吃 matchorder:卖单
if payload.Op == et.OpBuy { if payload.Op == et.OpBuy {
//转移冻结资产 //转移冻结资产
amount := a.calcActualCost(matchorder.GetLimitOrder().Op, or.GetBalance(), matchorder.GetLimitOrder().Price) amount := a.calcActualCost(matchorder.GetLimitOrder().Op, matched, matchorder.GetLimitOrder().Price)
receipt, err := leftAccountDB.ExecTransferFrozen(matchorder.Addr, a.fromaddr, a.execaddr, amount) receipt, err := leftAccountDB.ExecTransferFrozen(matchorder.Addr, a.fromaddr, a.execaddr, amount)
if err != nil { if err != nil {
elog.Error("matchLimitOrder.ExecTransferFrozen", "addr", matchorder.Addr, "amount", amount, "err", err.Error()) elog.Error("matchLimitOrder.ExecTransferFrozen", "addr", matchorder.Addr, "amount", amount, "err", err.Error())
...@@ -435,7 +440,7 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload * ...@@ -435,7 +440,7 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload *
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
kvs = append(kvs, receipt.KV...) kvs = append(kvs, receipt.KV...)
//将达成交易的相应资产结算 //将达成交易的相应资产结算
amount = a.calcActualCost(payload.Op, or.GetBalance(), matchorder.GetLimitOrder().Price) amount = a.calcActualCost(payload.Op, matched, matchorder.GetLimitOrder().Price)
receipt, err = rightAccountDB.ExecTransfer(a.fromaddr, matchorder.Addr, a.execaddr, amount) receipt, err = rightAccountDB.ExecTransfer(a.fromaddr, matchorder.Addr, a.execaddr, amount)
if err != nil { if err != nil {
elog.Error("matchLimitOrder.ExecTransfer", "addr", a.fromaddr, "amount", amount, "err", err.Error()) elog.Error("matchLimitOrder.ExecTransfer", "addr", a.fromaddr, "amount", amount, "err", err.Error())
...@@ -449,109 +454,33 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload * ...@@ -449,109 +454,33 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload *
matchorder.AVGPrice = caclAVGPrice(matchorder, matchorder.GetLimitOrder().Price, payload.Amount) matchorder.AVGPrice = caclAVGPrice(matchorder, matchorder.GetLimitOrder().Price, payload.Amount)
} }
// match receiptorder,涉及赋值先手顺序,代码顺序不可变 if matched == matchorder.GetBalance() {
matchorder.Status = func(a, b int64) int32 { matchorder.Status = et.Completed
if a > b { } else {
return et.Ordered matchorder.Status = et.Ordered
} }
return et.Completed
}(matchorder.GetBalance(), or.GetBalance())
matchorder.Balance = matchorder.GetBalance() - or.GetBalance()
//记录本次成交得量
matchorder.Executed = or.GetBalance()
a.updateStateDBCache(matchorder)
kvs = append(kvs, a.GetKVSet(matchorder)...)
or.Executed = or.Executed + or.GetBalance() if matched == or.GetBalance() {
or.Status = et.Completed or.Status = et.Completed
or.Balance = 0 } else {
//update receipt order or.Status = et.Ordered
re.Order = or
re.MatchOrders = append(re.MatchOrders, matchorder)
a.updateStateDBCache(or)
kvs = append(kvs, a.GetKVSet(or)...)
return logs, kvs, nil
}
if payload.Op == et.OpSell {
//转移冻结资产
amount := a.calcActualCost(matchorder.GetLimitOrder().Op, matchorder.GetBalance(), payload.Price)
receipt, err := rightAccountDB.ExecTransferFrozen(matchorder.Addr, a.fromaddr, a.execaddr, amount)
if err != nil {
elog.Error("matchLimitOrder.ExecTransferFrozen", "addr", matchorder.Addr, "amount", amount, "err", err.Error())
return nil, nil, err
}
logs = append(logs, receipt.Logs...)
kvs = append(kvs, receipt.KV...)
//解冻成交部分 多余资金
if payload.Price < matchorder.GetLimitOrder().Price {
amount := a.calcActualCost(matchorder.GetLimitOrder().Op, matchorder.GetBalance(), matchorder.GetLimitOrder().Price-payload.Price)
receipt, err := rightAccountDB.ExecActive(matchorder.Addr, a.execaddr, amount)
if err != nil {
elog.Error("matchLimitOrder.ExecActive", "addr", matchorder.Addr, "amount", amount, "err", err.Error())
return nil, nil, err
}
logs = append(logs, receipt.Logs...)
kvs = append(kvs, receipt.KV...)
}
//将达成交易的相应资产结算
amount = a.calcActualCost(payload.Op, matchorder.GetBalance(), payload.Price)
receipt, err = leftAccountDB.ExecTransfer(a.fromaddr, matchorder.Addr, a.execaddr, amount)
if err != nil {
elog.Error("matchLimitOrder.ExecTransfer", "addr", a.fromaddr, "amount", amount, "err", err.Error())
return nil, nil, err
}
logs = append(logs, receipt.Logs...)
kvs = append(kvs, receipt.KV...)
//买单得话,价格选取卖单的价格
or.AVGPrice = payload.Price
//计算matchOrder平均成交价格
matchorder.AVGPrice = caclAVGPrice(matchorder, payload.Price, matchorder.GetBalance())
}
if payload.Op == et.OpBuy {
//转移冻结资产
amount := a.calcActualCost(matchorder.GetLimitOrder().Op, matchorder.GetBalance(), matchorder.GetLimitOrder().Price)
receipt, err := leftAccountDB.ExecTransferFrozen(matchorder.Addr, a.fromaddr, a.execaddr, amount)
if err != nil {
elog.Error("matchLimitOrder.ExecTransferFrozen", "addr", matchorder.Addr, "amount", amount, "err", err.Error())
return nil, nil, err
}
logs = append(logs, receipt.Logs...)
kvs = append(kvs, receipt.KV...)
//将达成交易的相应资产结算
amount = a.calcActualCost(payload.Op, matchorder.GetBalance(), matchorder.GetLimitOrder().Price)
receipt, err = rightAccountDB.ExecTransfer(a.fromaddr, matchorder.Addr, a.execaddr, amount)
if err != nil {
elog.Error("matchLimitOrder.ExecTransfer", "addr", a.fromaddr, "amount", amount, "err", err.Error())
return nil, nil, err
} }
logs = append(logs, receipt.Logs...)
kvs = append(kvs, receipt.KV...)
//买单得话,价格选取卖单的价格 matchorder.Balance -= matched
or.AVGPrice = matchorder.GetLimitOrder().Price matchorder.Executed += matched
//计算matchOrder平均成交价格
matchorder.AVGPrice = caclAVGPrice(matchorder, matchorder.GetLimitOrder().Price, matchorder.GetBalance())
}
//涉及赋值先后顺序,不可颠倒 or.Balance -= matched
or.Balance = or.Balance - matchorder.Balance or.Executed += matched
or.Executed = or.Executed + matchorder.Balance
or.Status = et.Ordered
a.updateStateDBCache(or)
// match receiptorder
matchorder.Executed = matchorder.Balance
matchorder.Status = et.Completed
matchorder.Balance = 0
a.updateStateDBCache(matchorder) a.updateStateDBCache(matchorder)
kvs = append(kvs, a.GetKVSet(matchorder)...) a.updateStateDBCache(or)
re.Order = or re.Order = or
re.MatchOrders = append(re.MatchOrders, matchorder) re.MatchOrders = append(re.MatchOrders, matchorder)
kvs = append(kvs, a.GetKVSet(matchorder)...)
kvs = append(kvs, a.GetKVSet(or)...)
return logs, kvs, nil return logs, kvs, nil
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment