Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
plugin
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
link33
plugin
Commits
5d8922a2
Commit
5d8922a2
authored
Dec 09, 2019
by
harrylee
Committed by
vipwzw
Dec 26, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add exchange_test.go
parent
ef710316
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
159 additions
and
75 deletions
+159
-75
exchange_test.go
plugin/dapp/exchange/executor/exchange_test.go
+0
-0
exchangedb.go
plugin/dapp/exchange/executor/exchangedb.go
+88
-46
exec.go
plugin/dapp/exchange/executor/exec.go
+7
-9
exec_local.go
plugin/dapp/exchange/executor/exec_local.go
+57
-12
kv.go
plugin/dapp/exchange/executor/kv.go
+6
-4
query.go
plugin/dapp/exchange/executor/query.go
+0
-3
exchange.proto
plugin/dapp/exchange/proto/exchange.proto
+1
-1
exchange.pb.go
plugin/dapp/exchange/types/exchange.pb.go
+0
-0
No files found.
plugin/dapp/exchange/executor/exchange_test.go
View file @
5d8922a2
This diff is collapsed.
Click to expand it.
plugin/dapp/exchange/executor/exchangedb.go
View file @
5d8922a2
This diff is collapsed.
Click to expand it.
plugin/dapp/exchange/executor/exec.go
View file @
5d8922a2
package
executor
import
(
"fmt"
"github.com/33cn/chain33/types"
exchangetypes
"github.com/33cn/plugin/plugin/dapp/exchange/types"
)
...
...
@@ -11,19 +12,16 @@ import (
*/
func
(
e
*
exchange
)
Exec_LimitOrder
(
payload
*
exchangetypes
.
LimitOrder
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
var
receipt
*
types
.
Receipt
//implement code
return
receipt
,
nil
action
:=
NewAction
(
e
,
tx
,
index
)
return
action
.
LimitOrder
(
payload
)
}
func
(
e
*
exchange
)
Exec_MarketOrder
(
payload
*
exchangetypes
.
MarketOrder
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
var
receipt
*
types
.
Receipt
//implement code
return
receipt
,
nil
//TODO marketOrder
return
nil
,
fmt
.
Errorf
(
"%s"
,
"not support MarketOrder.."
)
}
func
(
e
*
exchange
)
Exec_RevokeOrder
(
payload
*
exchangetypes
.
RevokeOrder
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
var
receipt
*
types
.
Receipt
//implement code
return
receipt
,
nil
action
:=
NewAction
(
e
,
tx
,
index
)
return
action
.
RevokeOrder
(
payload
)
}
plugin/dapp/exchange/executor/exec_local.go
View file @
5d8922a2
...
...
@@ -30,13 +30,37 @@ func (e *exchange) ExecLocal_LimitOrder(payload *exchangetypes.LimitOrder, tx *t
func
(
e
*
exchange
)
ExecLocal_MarketOrder
(
payload
*
exchangetypes
.
MarketOrder
,
tx
*
types
.
Transaction
,
receiptData
*
types
.
ReceiptData
,
index
int
)
(
*
types
.
LocalDBSet
,
error
)
{
dbSet
:=
&
types
.
LocalDBSet
{}
//implement code
if
receiptData
.
Ty
==
types
.
ExecOk
{
for
_
,
log
:=
range
receiptData
.
Logs
{
switch
log
.
Ty
{
case
exchangetypes
.
TyMarketOrderLog
:
receipt
:=
&
exchangetypes
.
ReceiptExchange
{}
if
err
:=
types
.
Decode
(
log
.
Log
,
receipt
);
err
!=
nil
{
return
nil
,
err
}
kv
:=
e
.
updateIndex
(
receipt
)
dbSet
.
KV
=
append
(
dbSet
.
KV
,
kv
...
)
}
}
}
return
e
.
addAutoRollBack
(
tx
,
dbSet
.
KV
),
nil
}
func
(
e
*
exchange
)
ExecLocal_RevokeOrder
(
payload
*
exchangetypes
.
RevokeOrder
,
tx
*
types
.
Transaction
,
receiptData
*
types
.
ReceiptData
,
index
int
)
(
*
types
.
LocalDBSet
,
error
)
{
dbSet
:=
&
types
.
LocalDBSet
{}
//implement code
if
receiptData
.
Ty
==
types
.
ExecOk
{
for
_
,
log
:=
range
receiptData
.
Logs
{
switch
log
.
Ty
{
case
exchangetypes
.
TyRevokeOrderLog
:
receipt
:=
&
exchangetypes
.
ReceiptExchange
{}
if
err
:=
types
.
Decode
(
log
.
Log
,
receipt
);
err
!=
nil
{
return
nil
,
err
}
kv
:=
e
.
updateIndex
(
receipt
)
dbSet
.
KV
=
append
(
dbSet
.
KV
,
kv
...
)
}
}
}
return
e
.
addAutoRollBack
(
tx
,
dbSet
.
KV
),
nil
}
...
...
@@ -66,8 +90,10 @@ func (e *exchange) updateIndex(receipt *exchangetypes.ReceiptExchange) (kvs []*t
markDepth
.
RightAsset
=
right
markDepth
.
Op
=
op
markDepth
.
Amount
=
receipt
.
Order
.
Balance
}
else
{
markDepth
.
Amount
=
markDepth
.
Amount
+
receipt
.
Order
.
Balance
}
markDepth
.
Amount
=
markDepth
.
Amount
+
receipt
.
Order
.
Balance
//marketDepth
kvs
=
append
(
kvs
,
&
types
.
KeyValue
{
Key
:
calcMarketDepthKey
(
left
,
right
,
op
,
price
),
Value
:
types
.
Encode
(
&
markDepth
)})
//orderID
...
...
@@ -78,23 +104,23 @@ func (e *exchange) updateIndex(receipt *exchangetypes.ReceiptExchange) (kvs []*t
if
len
(
receipt
.
MatchOrders
)
>
0
{
//撮合交易更新
var
balance
int64
for
_
,
matchOrder
:=
range
receipt
.
MatchOrders
{
for
i
,
matchOrder
:=
range
receipt
.
MatchOrders
{
if
matchOrder
.
Status
==
exchangetypes
.
Completed
{
// 删除原有状态orderID
kvs
=
append
(
kvs
,
&
types
.
KeyValue
{
Key
:
calcMarketDepthOrderKey
(
left
,
right
,
matchOrder
.
GetLimitOrder
()
.
Op
,
price
,
matchOrder
.
Index
),
Value
:
nil
})
//删除原有状态orderID
kvs
=
append
(
kvs
,
&
types
.
KeyValue
{
Key
:
calcUserOrderIDKey
(
exchangetypes
.
Ordered
,
matchOrder
.
Addr
,
matchOrder
.
Index
),
Value
:
nil
})
//更新状态为已完成,索引index,改为当前的index
kvs
=
append
(
kvs
,
&
types
.
KeyValue
{
Key
:
calcUserOrderIDKey
(
exchangetypes
.
Completed
,
matchOrder
.
Addr
,
index
),
Value
:
types
.
Encode
(
&
exchangetypes
.
OrderID
{
ID
:
matchOrder
.
OrderID
,
Index
:
index
})})
kvs
=
append
(
kvs
,
&
types
.
KeyValue
{
Key
:
calcUserOrderIDKey
(
exchangetypes
.
Completed
,
matchOrder
.
Addr
,
index
+
int64
(
i
+
1
)),
Value
:
types
.
Encode
(
&
exchangetypes
.
OrderID
{
ID
:
matchOrder
.
OrderID
,
Index
:
index
+
int64
(
i
+
1
)
})})
//calcCompletedOrderKey
kvs
=
append
(
kvs
,
&
types
.
KeyValue
{
Key
:
calcCompletedOrderKey
(
left
,
right
,
index
),
Value
:
types
.
Encode
(
&
exchangetypes
.
OrderID
{
ID
:
matchOrder
.
OrderID
,
Index
:
index
})})
kvs
=
append
(
kvs
,
&
types
.
KeyValue
{
Key
:
calcCompletedOrderKey
(
left
,
right
,
index
+
int64
(
i
+
1
)),
Value
:
types
.
Encode
(
&
exchangetypes
.
OrderID
{
ID
:
matchOrder
.
OrderID
,
Index
:
index
+
int64
(
i
+
1
)
})})
}
if
matchOrder
.
Status
==
exchangetypes
.
Ordered
{
//只需统一更改市场深度状态,其他不需要处理
balance
=
balance
+
matchOrder
.
Balance
}
}
//更改市场深度
//更改
匹配
市场深度
var
matchDepth
exchangetypes
.
MarketDepth
err
=
findObject
(
e
.
GetLocalDB
(),
calcMarketDepthKey
(
left
,
right
,
OpSwap
(
op
),
price
),
&
matchDepth
)
if
err
==
types
.
ErrNotFound
{
...
...
@@ -103,10 +129,15 @@ func (e *exchange) updateIndex(receipt *exchangetypes.ReceiptExchange) (kvs []*t
matchDepth
.
RightAsset
=
right
matchDepth
.
Op
=
OpSwap
(
op
)
matchDepth
.
Amount
=
balance
}
else
{
matchDepth
.
Amount
=
matchDepth
.
Amount
-
receipt
.
Order
.
Executed
}
matchDepth
.
Amount
=
matchDepth
.
Amount
-
receipt
.
Order
.
Executed
//marketDepth
kvs
=
append
(
kvs
,
&
types
.
KeyValue
{
Key
:
calcMarketDepthKey
(
left
,
right
,
OpSwap
(
op
),
price
),
Value
:
types
.
Encode
(
&
matchDepth
)})
if
matchDepth
.
Amount
==
0
{
//删除
kvs
=
append
(
kvs
,
&
types
.
KeyValue
{
Key
:
calcMarketDepthKey
(
left
,
right
,
OpSwap
(
op
),
price
),
Value
:
nil
})
}
}
return
case
exchangetypes
.
Completed
:
...
...
@@ -121,19 +152,22 @@ func (e *exchange) updateIndex(receipt *exchangetypes.ReceiptExchange) (kvs []*t
//user orderID
kvs
=
append
(
kvs
,
&
types
.
KeyValue
{
Key
:
calcUserOrderIDKey
(
exchangetypes
.
Completed
,
addr
,
index
),
Value
:
types
.
Encode
(
&
exchangetypes
.
OrderID
{
ID
:
oderID
,
Index
:
index
})})
//calcCompletedOrderKey
kvs
=
append
(
kvs
,
&
types
.
KeyValue
{
Key
:
calcCompletedOrderKey
(
left
,
right
,
index
),
Value
:
types
.
Encode
(
&
exchangetypes
.
OrderID
{
ID
:
oderID
,
Index
:
index
})})
if
len
(
receipt
.
MatchOrders
)
>
0
{
//撮合交易更新
var
balance
int64
for
_
,
matchOrder
:=
range
receipt
.
MatchOrders
{
for
i
,
matchOrder
:=
range
receipt
.
MatchOrders
{
if
matchOrder
.
Status
==
exchangetypes
.
Completed
{
// 删除原有状态orderID
kvs
=
append
(
kvs
,
&
types
.
KeyValue
{
Key
:
calcMarketDepthOrderKey
(
left
,
right
,
matchOrder
.
GetLimitOrder
()
.
Op
,
price
,
matchOrder
.
Index
),
Value
:
nil
})
//删除原有状态orderID
kvs
=
append
(
kvs
,
&
types
.
KeyValue
{
Key
:
calcUserOrderIDKey
(
exchangetypes
.
Ordered
,
matchOrder
.
Addr
,
matchOrder
.
Index
),
Value
:
nil
})
//更新状态为已完成,更新索引
kvs
=
append
(
kvs
,
&
types
.
KeyValue
{
Key
:
calcUserOrderIDKey
(
exchangetypes
.
Completed
,
matchOrder
.
Addr
,
index
),
Value
:
types
.
Encode
(
&
exchangetypes
.
OrderID
{
ID
:
matchOrder
.
OrderID
,
Index
:
index
})})
kvs
=
append
(
kvs
,
&
types
.
KeyValue
{
Key
:
calcUserOrderIDKey
(
exchangetypes
.
Completed
,
matchOrder
.
Addr
,
index
+
int64
(
i
+
1
)),
Value
:
types
.
Encode
(
&
exchangetypes
.
OrderID
{
ID
:
matchOrder
.
OrderID
,
Index
:
index
+
int64
(
i
+
1
)
})})
//calcCompletedOrderKey
kvs
=
append
(
kvs
,
&
types
.
KeyValue
{
Key
:
calcCompletedOrderKey
(
left
,
right
,
index
),
Value
:
types
.
Encode
(
&
exchangetypes
.
OrderID
{
ID
:
matchOrder
.
OrderID
,
Index
:
index
})})
kvs
=
append
(
kvs
,
&
types
.
KeyValue
{
Key
:
calcCompletedOrderKey
(
left
,
right
,
index
+
int64
(
i
+
1
)),
Value
:
types
.
Encode
(
&
exchangetypes
.
OrderID
{
ID
:
matchOrder
.
OrderID
,
Index
:
index
+
int64
(
i
+
1
)
})})
}
if
matchOrder
.
Status
==
exchangetypes
.
Ordered
{
...
...
@@ -150,10 +184,15 @@ func (e *exchange) updateIndex(receipt *exchangetypes.ReceiptExchange) (kvs []*t
matchDepth
.
RightAsset
=
right
matchDepth
.
Op
=
OpSwap
(
op
)
matchDepth
.
Amount
=
balance
}
else
{
matchDepth
.
Amount
=
matchDepth
.
Amount
-
receipt
.
Order
.
Executed
}
matchDepth
.
Amount
=
matchDepth
.
Amount
-
receipt
.
Order
.
Executed
//marketDepth
kvs
=
append
(
kvs
,
&
types
.
KeyValue
{
Key
:
calcMarketDepthKey
(
left
,
right
,
OpSwap
(
op
),
price
),
Value
:
types
.
Encode
(
&
matchDepth
)})
if
matchDepth
.
Amount
==
0
{
//删除
kvs
=
append
(
kvs
,
&
types
.
KeyValue
{
Key
:
calcMarketDepthKey
(
left
,
right
,
OpSwap
(
op
),
price
),
Value
:
nil
})
}
}
return
case
exchangetypes
.
Revoked
:
...
...
@@ -170,8 +209,14 @@ func (e *exchange) updateIndex(receipt *exchangetypes.ReceiptExchange) (kvs []*t
if
err
==
nil
{
//marketDepth
marketDepth
.
Amount
=
marketDepth
.
Amount
-
receipt
.
GetOrder
()
.
Balance
elog
.
Error
(
"revoked"
,
"recept.order.balance"
,
receipt
.
GetOrder
()
.
Balance
)
kvs
=
append
(
kvs
,
&
types
.
KeyValue
{
Key
:
calcMarketDepthKey
(
left
,
right
,
op
,
price
),
Value
:
types
.
Encode
(
&
marketDepth
)})
}
elog
.
Error
(
"revoked"
,
"marketDepth.Amount"
,
marketDepth
.
Amount
)
if
marketDepth
.
Amount
==
0
{
//删除
kvs
=
append
(
kvs
,
&
types
.
KeyValue
{
Key
:
calcMarketDepthKey
(
left
,
right
,
op
,
price
),
Value
:
nil
})
}
// 删除原有状态orderID
kvs
=
append
(
kvs
,
&
types
.
KeyValue
{
Key
:
calcMarketDepthOrderKey
(
left
,
right
,
op
,
price
,
receipt
.
GetOrder
()
.
Index
),
Value
:
nil
})
//删除原有状态orderID
...
...
plugin/dapp/exchange/executor/kv.go
View file @
5d8922a2
...
...
@@ -45,14 +45,15 @@ func calcMarketDepthOrderPrefix(left, right *types.Asset, op int32, price float3
// localdb中存储市场挂单ID
func
calcMarketDepthOrderKey
(
left
,
right
*
types
.
Asset
,
op
int32
,
price
float32
,
index
int64
)
[]
byte
{
// 设置精度为1e8
key
:=
fmt
.
Sprintf
(
"%s"
+
"order-%s-%s-%d:%016d:%0
18
d"
,
KeyPrefixLocalDB
,
left
.
GetSymbol
(),
right
.
GetSymbol
(),
op
,
int64
(
Truncate
(
price
)
*
float32
(
1e8
)),
index
)
key
:=
fmt
.
Sprintf
(
"%s"
+
"order-%s-%s-%d:%016d:%0
22
d"
,
KeyPrefixLocalDB
,
left
.
GetSymbol
(),
right
.
GetSymbol
(),
op
,
int64
(
Truncate
(
price
)
*
float32
(
1e8
)),
index
)
return
[]
byte
(
key
)
}
//最新已经成交的订单,这里状态固定都是完成状态,这个主要给外部使用,可以查询最新得成交信息
//最新已经成交的订单,这里状态固定都是完成状态,这个主要给外部使用,可以查询最新得成交信息,存在多个情况
//matchOrderIndex,是匹配order在数组中的index,这里预留4个0000,用来解决同一笔交易中存在key重复得情况,这样设计保证了key得唯一性
func
calcCompletedOrderKey
(
left
,
right
*
types
.
Asset
,
index
int64
)
[]
byte
{
// 设置精度为1e8
key
:=
fmt
.
Sprintf
(
"%s"
+
"completed-%s-%s-%d:%0
18
d"
,
KeyPrefixLocalDB
,
left
.
GetSymbol
(),
right
.
GetSymbol
(),
types
.
Completed
,
index
)
key
:=
fmt
.
Sprintf
(
"%s"
+
"completed-%s-%s-%d:%0
22
d"
,
KeyPrefixLocalDB
,
left
.
GetSymbol
(),
right
.
GetSymbol
(),
types
.
Completed
,
index
)
return
[]
byte
(
key
)
}
func
calcCompletedOrderPrefix
(
left
,
right
*
types
.
Asset
)
[]
byte
{
...
...
@@ -66,7 +67,8 @@ func calcUserOrderIDPrefix(status int32, addr string) []byte {
key
:=
fmt
.
Sprintf
(
"%s"
+
"addr:%s:%d:"
,
KeyPrefixLocalDB
,
addr
,
status
)
return
[]
byte
(
key
)
}
//matchOrderIndex,用来解决同一笔交易中存在key重复得情况,这样设计保证了key得唯一性
func
calcUserOrderIDKey
(
status
int32
,
addr
string
,
index
int64
)
[]
byte
{
key
:=
fmt
.
Sprintf
(
"%s"
+
"addr:%s:%d:%0
18
d"
,
KeyPrefixLocalDB
,
addr
,
status
,
index
)
key
:=
fmt
.
Sprintf
(
"%s"
+
"addr:%s:%d:%0
22
d"
,
KeyPrefixLocalDB
,
addr
,
status
,
index
)
return
[]
byte
(
key
)
}
plugin/dapp/exchange/executor/query.go
View file @
5d8922a2
...
...
@@ -16,9 +16,6 @@ func (s *exchange) Query_QueryMarketDepth(in *et.QueryMarketDepth) (types.Messag
if
!
CheckExchangeAsset
(
in
.
LeftAsset
,
in
.
RightAsset
)
{
return
nil
,
et
.
ErrAsset
}
if
!
CheckPrice
(
in
.
Price
)
{
return
nil
,
et
.
ErrAssetPrice
}
if
!
CheckOp
(
in
.
Op
)
{
return
nil
,
et
.
ErrAssetOp
...
...
plugin/dapp/exchange/proto/exchange.proto
View file @
5d8922a2
...
...
@@ -7,7 +7,7 @@ message Exchange {
message
ExchangeAction
{
oneof
value
{
LimitOrder
limitOrder
=
1
;
//
MarketOrder marketOrder = 2;
MarketOrder
marketOrder
=
2
;
RevokeOrder
revokeOrder
=
3
;
}
int32
ty
=
6
;
...
...
plugin/dapp/exchange/types/exchange.pb.go
View file @
5d8922a2
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment