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
c7422357
Commit
c7422357
authored
Nov 10, 2021
by
cxb
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update exchange
parent
7fe229ce
Show whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
1198 additions
and
121 deletions
+1198
-121
go.sum
go.sum
+0
-11
README.md
plugin/dapp/exchange/README.md
+1
-1
client.go
plugin/dapp/exchange/client/client.go
+11
-0
exchange.go
plugin/dapp/exchange/client/exchange.go
+143
-0
exchange_test.go
plugin/dapp/exchange/client/exchange_test.go
+143
-0
grpc_cli.go
plugin/dapp/exchange/client/grpc_cli.go
+145
-0
exchange_test.go
plugin/dapp/exchange/executor/exchange_test.go
+14
-14
exchangedb.go
plugin/dapp/exchange/executor/exchangedb.go
+167
-22
exchange.proto
plugin/dapp/exchange/proto/exchange.proto
+12
-0
chain33.toml
plugin/dapp/exchange/test/chain33.toml
+56
-0
main.go
plugin/dapp/exchange/test/cmd/main.go
+25
-0
exchange_test.go
plugin/dapp/exchange/test/exchange_test.go
+1
-0
exec_cli.go
plugin/dapp/exchange/test/exec_cli.go
+17
-2
grpc_cli.go
plugin/dapp/exchange/test/grpc_cli.go
+2
-2
prepare.sh
plugin/dapp/exchange/test/prepare.sh
+3
-0
errors.go
plugin/dapp/exchange/types/errors.go
+2
-0
exchange.go
plugin/dapp/exchange/types/exchange.go
+48
-0
exchange.pb.go
plugin/dapp/exchange/types/exchange.pb.go
+133
-69
exchangecfg.go
plugin/dapp/exchange/types/exchangecfg.go
+275
-0
No files found.
go.sum
View file @
c7422357
...
...
@@ -48,8 +48,6 @@ dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBr
dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4=
dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU=
git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
github.com/33cn/chain33 v1.65.6-0.20211020073541-bfe0910b872e h1:VR5RsFF/XXzBTJ+d2SspGyx5jOy47UzZnrNAag+PZh8=
github.com/33cn/chain33 v1.65.6-0.20211020073541-bfe0910b872e/go.mod h1:27Z1b54wJ6EhE1IGA3S5AxSQ/t8dktFVgPnkLNbMFoE=
github.com/33cn/chain33 v1.65.6-0.20211025083411-82c4406c6701 h1:XrlmULs3WrRHCJm/isW5WCiH3WlfeFgZHWDY0ZarVTI=
github.com/33cn/chain33 v1.65.6-0.20211025083411-82c4406c6701/go.mod h1:27Z1b54wJ6EhE1IGA3S5AxSQ/t8dktFVgPnkLNbMFoE=
github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
...
...
@@ -716,7 +714,6 @@ github.com/influxdata/flux v0.131.0/go.mod h1:CKvnYe6FHpTj/E0YGI7TcOZdGiYHoToOPS
github.com/influxdata/httprouter v1.3.1-0.20191122104820-ee83e2772f69/go.mod h1:pwymjR6SrP3gD3pRj9RJwdl1j5s3doEEV8gS4X9qSzA=
github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY=
github.com/influxdata/influxdb v1.8.0/go.mod h1:SIzcnsjaHRFpmlxpJ4S3NT64qtEKYweNTUMb/vh0OMQ=
github.com/influxdata/influxdb v1.8.3 h1:WEypI1BQFTT4teLM+1qkEcvUi0dAvopAI/ir0vAiBg8=
github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI=
github.com/influxdata/influxdb v1.9.5 h1:4O7AC5jOA9RoqtDuD2rysXbumcEwaqWlWXmwuyK+a2s=
github.com/influxdata/influxdb v1.9.5/go.mod h1:4uPVvcry9KWQVWLxyT9641qpkRXUBN+xa0MJFFNNLKo=
...
...
@@ -863,7 +860,6 @@ github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPR
github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk=
github.com/koron/go-ssdp v0.0.2 h1:fL3wAoyT6hXHQlORyXUW4Q23kkQpJRgEAYcZB5BR71o=
...
...
@@ -876,7 +872,6 @@ github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
...
...
@@ -1154,7 +1149,6 @@ github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIG
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
...
...
@@ -1251,7 +1245,6 @@ github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u
github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4fJxp6ggJGteB8HQTI=
github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc=
github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0=
github.com/multiformats/go-multiaddr v0.4.0 h1:hL/K4ZJhJ5PTw3nwylq9lGU5yArzcAroZmex1ghSEkQ=
github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc=
github.com/multiformats/go-multiaddr v0.4.1 h1:Pq37uLx3hsyNlTDir7FZyU8+cFCTqd5y1KiM2IzOutI=
github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM=
...
...
@@ -1516,7 +1509,6 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx
github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I=
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM=
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
...
...
@@ -1561,7 +1553,6 @@ github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3
github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
...
...
@@ -1995,7 +1986,6 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
...
...
@@ -2263,7 +2253,6 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
k8s.io/api v0.17.5/go.mod h1:0zV5/ungglgy2Rlm3QK8fbxkXVs+BSJWpJP/+8gUVLY=
k8s.io/apimachinery v0.0.0-20191123233150-4c4803ed55e3 h1:FErmbNIJruD5GT2oVEjtPn5Ar5+rcWJsC8/PPUkR0s4=
k8s.io/apimachinery v0.0.0-20191123233150-4c4803ed55e3/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg=
k8s.io/apimachinery v0.17.5 h1:QAjfgeTtSGksdkgyaPrIb4lhU16FWMIzxKejYD5S0gc=
k8s.io/apimachinery v0.17.5/go.mod h1:ioIo1G/a+uONV7Tv+ZmCbMG1/a3kVw5YcDdncd8ugQ0=
...
...
plugin/dapp/exchange/README.md
View file @
c7422357
...
...
@@ -22,7 +22,7 @@ QueryOrderList|根据用户地址和订单状态(ordered,completed,revoked),
序号|规则
---|----
1|
买家获利得原则
1|
以市场价成交
2|买单高于市场价,按价格由低往高撮合
3|卖单低于市场价,按价格由高往低进行撮合
4|价格相同按先进先出的原则进行撮合
...
...
plugin/dapp/exchange/client/client.go
0 → 100755
View file @
c7422357
package
client
import
(
"github.com/33cn/chain33/types"
"github.com/golang/protobuf/proto"
)
type
Cli
interface
{
Query
(
fn
string
,
msg
proto
.
Message
)
([]
byte
,
error
)
Send
(
tx
*
types
.
Transaction
,
hexKey
string
)
([]
*
types
.
ReceiptLog
,
error
)
}
plugin/dapp/exchange/client/exchange.go
0 → 100755
View file @
c7422357
package
client
import
(
"github.com/33cn/chain33/types"
et
"github.com/33cn/plugin/plugin/dapp/exchange/types"
"github.com/golang/protobuf/proto"
)
var
cfg
=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
type
ExchangeClient
struct
{
client
Cli
txHeight
int64
}
func
NewExchangCient
(
cli
Cli
)
*
ExchangeClient
{
return
&
ExchangeClient
{
client
:
cli
,
txHeight
:
types
.
LowAllowPackHeight
,
}
}
func
(
c
*
ExchangeClient
)
QueryMarketDepth
(
msg
proto
.
Message
)
(
types
.
Message
,
error
)
{
data
,
err
:=
c
.
client
.
Query
(
et
.
FuncNameQueryMarketDepth
,
msg
)
if
err
!=
nil
{
return
nil
,
err
}
var
resp
et
.
MarketDepthList
err
=
types
.
Decode
(
data
,
&
resp
)
if
err
!=
nil
{
return
nil
,
err
}
return
&
resp
,
nil
}
func
(
c
*
ExchangeClient
)
QueryHistoryOrderList
(
msg
proto
.
Message
)
(
types
.
Message
,
error
)
{
data
,
err
:=
c
.
client
.
Query
(
et
.
FuncNameQueryHistoryOrderList
,
msg
)
if
err
!=
nil
{
return
nil
,
err
}
var
resp
et
.
OrderList
err
=
types
.
Decode
(
data
,
&
resp
)
if
err
!=
nil
{
return
nil
,
err
}
return
&
resp
,
nil
}
func
(
c
*
ExchangeClient
)
QueryOrder
(
msg
proto
.
Message
)
(
types
.
Message
,
error
)
{
data
,
err
:=
c
.
client
.
Query
(
et
.
FuncNameQueryOrder
,
msg
)
if
err
!=
nil
{
return
nil
,
err
}
var
resp
et
.
Order
err
=
types
.
Decode
(
data
,
&
resp
)
if
err
!=
nil
{
return
nil
,
err
}
return
&
resp
,
nil
}
func
(
c
*
ExchangeClient
)
QueryOrderList
(
msg
proto
.
Message
)
(
types
.
Message
,
error
)
{
data
,
err
:=
c
.
client
.
Query
(
et
.
FuncNameQueryOrderList
,
msg
)
if
err
!=
nil
{
return
nil
,
err
}
var
resp
et
.
OrderList
err
=
types
.
Decode
(
data
,
&
resp
)
if
err
!=
nil
{
return
nil
,
err
}
return
&
resp
,
nil
}
func
(
c
*
ExchangeClient
)
LimitOrder
(
msg
proto
.
Message
,
hexKey
string
)
(
*
et
.
ReceiptExchange
,
error
)
{
ety
:=
types
.
LoadExecutorType
(
et
.
ExchangeX
)
tx
,
err
:=
ety
.
Create
(
"LimitOrder"
,
msg
)
if
err
!=
nil
{
return
nil
,
err
}
logs
,
err
:=
c
.
client
.
Send
(
tx
,
hexKey
)
if
err
!=
nil
{
return
nil
,
err
}
var
resp
et
.
ReceiptExchange
for
_
,
l
:=
range
logs
{
if
l
.
Ty
==
et
.
TyLimitOrderLog
{
err
=
types
.
Decode
(
l
.
Log
,
&
resp
)
if
err
!=
nil
{
return
nil
,
err
}
break
}
}
return
&
resp
,
nil
}
//TODO marketOrder
func
(
c
*
ExchangeClient
)
MarketOrder
(
msg
proto
.
Message
,
hexKey
string
)
(
*
et
.
ReceiptExchange
,
error
)
{
ety
:=
types
.
LoadExecutorType
(
et
.
ExchangeX
)
tx
,
err
:=
ety
.
Create
(
"MarketOrder"
,
msg
)
if
err
!=
nil
{
return
nil
,
err
}
logs
,
err
:=
c
.
client
.
Send
(
tx
,
hexKey
)
if
err
!=
nil
{
return
nil
,
err
}
var
resp
et
.
ReceiptExchange
for
_
,
l
:=
range
logs
{
if
l
.
Ty
==
et
.
TyMarketOrderLog
{
err
=
types
.
Decode
(
l
.
Log
,
&
resp
)
if
err
!=
nil
{
return
nil
,
err
}
break
}
}
return
&
resp
,
nil
}
func
(
c
*
ExchangeClient
)
RevokeOrder
(
msg
proto
.
Message
,
hexKey
string
)
(
*
et
.
ReceiptExchange
,
error
)
{
ety
:=
types
.
LoadExecutorType
(
et
.
ExchangeX
)
tx
,
err
:=
ety
.
Create
(
"RevokeOrder"
,
msg
)
if
err
!=
nil
{
return
nil
,
err
}
logs
,
err
:=
c
.
client
.
Send
(
tx
,
hexKey
)
if
err
!=
nil
{
return
nil
,
err
}
var
resp
et
.
ReceiptExchange
for
_
,
l
:=
range
logs
{
if
l
.
Ty
==
et
.
TyRevokeOrderLog
{
err
=
types
.
Decode
(
l
.
Log
,
&
resp
)
if
err
!=
nil
{
return
nil
,
err
}
break
}
}
return
&
resp
,
nil
}
plugin/dapp/exchange/client/exchange_test.go
0 → 100644
View file @
c7422357
package
client_test
import
(
"testing"
"github.com/33cn/chain33/types"
excli
"github.com/33cn/plugin/plugin/dapp/exchange/client"
etypes
"github.com/33cn/plugin/plugin/dapp/exchange/types"
)
var
(
privKey
=
"0x13169cd9ecf0d3e4a78d1a97a9abb506cb12b2f45c127a8a33c84f389a38e674"
//1BsJugqWiF47x2c915YW2TkBKVLU9GmvEn
grpcAddr
=
"127.0.0.1:8802"
execer
=
"token"
)
func
TestQueryMarketDepth
(
t
*
testing
.
T
)
{
cli
:=
excli
.
NewGRPCCli
(
grpcAddr
)
client
:=
excli
.
NewExchangCient
(
cli
)
req
:=
&
etypes
.
QueryMarketDepth
{
LeftAsset
:
&
etypes
.
Asset
{
Symbol
:
"BTY"
,
Execer
:
execer
},
RightAsset
:
&
etypes
.
Asset
{
Symbol
:
"USDT"
,
Execer
:
execer
},
Op
:
2
,
PrimaryKey
:
""
,
Count
:
10
,
}
resp
,
err
:=
client
.
QueryMarketDepth
(
req
)
if
err
!=
nil
{
t
.
Log
(
err
)
return
}
t
.
Log
(
"QueryMarketDepth"
,
resp
.
(
*
etypes
.
MarketDepthList
)
.
List
)
}
func
TestQueryHistoryOrderList
(
t
*
testing
.
T
)
{
cli
:=
excli
.
NewGRPCCli
(
grpcAddr
)
client
:=
excli
.
NewExchangCient
(
cli
)
req
:=
&
etypes
.
QueryHistoryOrderList
{
LeftAsset
:
&
etypes
.
Asset
{
Symbol
:
"BTY"
,
Execer
:
execer
},
RightAsset
:
&
etypes
.
Asset
{
Symbol
:
"USDT"
,
Execer
:
execer
},
PrimaryKey
:
""
,
Count
:
10
,
Direction
:
0
,
}
resp
,
err
:=
client
.
QueryHistoryOrderList
(
req
)
if
err
!=
nil
{
t
.
Log
(
err
)
return
}
t
.
Log
(
"QueryHistory"
,
resp
.
(
*
etypes
.
OrderList
)
.
List
)
}
func
TestQueryOrder
(
t
*
testing
.
T
)
{
cli
:=
excli
.
NewGRPCCli
(
grpcAddr
)
client
:=
excli
.
NewExchangCient
(
cli
)
req
:=
&
etypes
.
QueryOrder
{
OrderID
:
46000000000
,
}
resp
,
err
:=
client
.
QueryOrder
(
req
)
if
err
!=
nil
{
t
.
Log
(
err
)
return
}
t
.
Log
(
"QueryOrder"
,
resp
.
(
*
etypes
.
Order
))
}
func
TestQueryOrderList
(
t
*
testing
.
T
)
{
cli
:=
excli
.
NewGRPCCli
(
grpcAddr
)
client
:=
excli
.
NewExchangCient
(
cli
)
req
:=
&
etypes
.
QueryOrderList
{
Status
:
1
,
Address
:
"1FpPrLgyuR6reqj8LQ3HNVHkjtA7hAcvHo"
,
PrimaryKey
:
""
,
Count
:
10
,
Direction
:
0
,
}
resp
,
err
:=
client
.
QueryOrderList
(
req
)
if
err
!=
nil
{
t
.
Log
(
err
)
return
}
t
.
Log
(
"QueryOrderList"
,
resp
.
(
*
etypes
.
OrderList
)
.
List
)
}
func
TestLimitOrder
(
t
*
testing
.
T
)
{
cli
:=
excli
.
NewGRPCCli
(
grpcAddr
)
client
:=
excli
.
NewExchangCient
(
cli
)
req
:=
&
etypes
.
LimitOrder
{
LeftAsset
:
&
etypes
.
Asset
{
Symbol
:
"BTY"
,
Execer
:
execer
},
RightAsset
:
&
etypes
.
Asset
{
Symbol
:
"USDT"
,
Execer
:
execer
},
Op
:
etypes
.
OpSell
,
Price
:
4
*
types
.
DefaultCoinPrecision
,
Amount
:
4
*
types
.
DefaultCoinPrecision
,
}
resp
,
err
:=
client
.
LimitOrder
(
req
,
privKey
)
if
err
!=
nil
{
t
.
Log
(
err
)
return
}
t
.
Log
(
"LimitOrder"
,
resp
)
}
//TODO marketOrder
//func TestMarketOrder(t *testing.T) {
// cli := excli.NewGRPCCli(grpcAddr)
// client := excli.NewExchangCient(cli)
//
// req := &etypes.MarketOrder{
// LeftAsset: &etypes.Asset{Symbol: "BTY", Execer: execer},
// RightAsset: &etypes.Asset{Symbol: "USDT", Execer: execer},
// Op: etypes.OpSell,
// Amount: 4 * types.DefaultCoinPrecision,
// }
//
// resp, err := client.MarketOrder(req, privKey)
// if err != nil {
// t.Log(err)
// return
// }
// t.Log("MarketOrder", resp)
//}
func
TestRevokeOrder
(
t
*
testing
.
T
)
{
cli
:=
excli
.
NewGRPCCli
(
grpcAddr
)
client
:=
excli
.
NewExchangCient
(
cli
)
req
:=
&
etypes
.
RevokeOrder
{
OrderID
:
88000000000
,
}
resp
,
err
:=
client
.
RevokeOrder
(
req
,
privKey
)
if
err
!=
nil
{
t
.
Log
(
err
)
return
}
t
.
Log
(
"RevokeOrder"
,
resp
)
}
plugin/dapp/exchange/client/grpc_cli.go
0 → 100755
View file @
c7422357
package
client
import
(
"context"
"errors"
"strings"
"sync"
"time"
"github.com/33cn/chain33/common"
"github.com/33cn/chain33/common/crypto"
"github.com/33cn/chain33/types"
et
"github.com/33cn/plugin/plugin/dapp/exchange/types"
"github.com/golang/protobuf/proto"
"google.golang.org/grpc"
)
var
conns
sync
.
Map
type
GRPCCli
struct
{
client
types
.
Chain33Client
}
func
NewGRPCCli
(
grpcAddr
string
)
*
GRPCCli
{
client
,
err
:=
getClient
(
grpcAddr
)
if
err
!=
nil
{
return
nil
}
return
&
GRPCCli
{
client
:
client
}
}
func
getClient
(
target
string
)
(
types
.
Chain33Client
,
error
)
{
val
,
ok
:=
conns
.
Load
(
target
)
if
!
ok
{
conn
,
err
:=
grpc
.
Dial
(
target
,
grpc
.
WithInsecure
())
if
err
!=
nil
{
return
nil
,
err
}
client
:=
types
.
NewChain33Client
(
conn
)
conns
.
Store
(
target
,
client
)
return
client
,
nil
}
else
{
return
val
.
(
types
.
Chain33Client
),
nil
}
}
func
(
c
*
GRPCCli
)
Query
(
fn
string
,
msg
proto
.
Message
)
([]
byte
,
error
)
{
ss
:=
strings
.
Split
(
fn
,
"."
)
var
in
types
.
ChainExecutor
if
len
(
ss
)
==
2
{
in
.
Driver
=
ss
[
0
]
in
.
FuncName
=
ss
[
1
]
}
else
{
in
.
Driver
=
et
.
ExchangeX
in
.
FuncName
=
fn
}
in
.
Param
=
types
.
Encode
(
msg
)
r
,
err
:=
c
.
client
.
QueryChain
(
context
.
Background
(),
&
in
)
if
err
!=
nil
{
return
nil
,
err
}
if
!
r
.
IsOk
{
return
nil
,
errors
.
New
(
string
(
r
.
Msg
))
}
return
r
.
Msg
,
nil
}
func
(
c
*
GRPCCli
)
Send
(
tx
*
types
.
Transaction
,
hexKey
string
)
([]
*
types
.
ReceiptLog
,
error
)
{
logs
,
err
:=
c
.
sendAndWaitReceipt
(
tx
,
hexKey
)
if
err
!=
nil
{
return
nil
,
parseError
(
err
)
}
for
_
,
l
:=
range
logs
{
if
l
.
Ty
==
types
.
TyLogErr
{
return
nil
,
errors
.
New
(
string
(
l
.
Log
))
}
}
return
logs
,
nil
}
// 发送交易并等待执行结果
// 如果交易非法,返回错误信息
// 如果交易执行成功,返回 交易哈希、回报
func
(
c
*
GRPCCli
)
sendAndWaitReceipt
(
tx
*
types
.
Transaction
,
hexKey
string
)
(
logs
[]
*
types
.
ReceiptLog
,
err
error
)
{
r
,
err
:=
c
.
sendTx
(
tx
,
hexKey
)
if
err
!=
nil
{
// rpc error: code = Unknown desc = ErrNotBank
return
nil
,
err
}
if
!
r
.
IsOk
{
return
nil
,
errors
.
New
(
string
(
r
.
Msg
))
}
time
.
Sleep
(
time
.
Second
)
d
,
_
:=
c
.
client
.
QueryTransaction
(
context
.
Background
(),
&
types
.
ReqHash
{
Hash
:
r
.
Msg
})
return
d
.
Receipt
.
Logs
,
nil
}
//SendTx ...s
func
(
c
*
GRPCCli
)
sendTx
(
tx
*
types
.
Transaction
,
hexKey
string
)
(
reply
*
types
.
Reply
,
err
error
)
{
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
tx
,
err
=
types
.
FormatTx
(
cfg
,
et
.
ExchangeX
,
tx
)
if
err
!=
nil
{
return
nil
,
err
}
tx
,
err
=
signTx
(
tx
,
hexKey
)
if
err
!=
nil
{
return
nil
,
err
}
return
c
.
client
.
SendTransaction
(
context
.
Background
(),
tx
)
}
func
signTx
(
tx
*
types
.
Transaction
,
hexPrivKey
string
)
(
*
types
.
Transaction
,
error
)
{
signType
:=
types
.
SECP256K1
c
,
err
:=
crypto
.
Load
(
types
.
GetSignName
(
""
,
signType
),
-
1
)
if
err
!=
nil
{
return
tx
,
err
}
bytes
,
err
:=
common
.
FromHex
(
hexPrivKey
[
:
])
if
err
!=
nil
{
return
tx
,
err
}
privKey
,
err
:=
c
.
PrivKeyFromBytes
(
bytes
)
if
err
!=
nil
{
return
tx
,
err
}
tx
.
Sign
(
int32
(
signType
),
privKey
)
return
tx
,
nil
}
func
parseError
(
err
error
)
error
{
// rpc error: code = Unknown desc = ErrNotBank
str
:=
err
.
Error
()
sep
:=
"desc = "
i
:=
strings
.
Index
(
str
,
sep
)
if
i
!=
-
1
{
return
errors
.
New
(
str
[
i
+
len
(
sep
)
:
])
}
return
err
}
plugin/dapp/exchange/executor/exchange_test.go
View file @
c7422357
...
...
@@ -39,7 +39,7 @@ var (
func
TestExchange
(
t
*
testing
.
T
)
{
//环境准备
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
:=
types
.
NewChain33Config
(
et
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
Init
(
et
.
ExchangeX
,
cfg
,
nil
)
total
:=
100
*
types
.
DefaultCoinPrecision
...
...
@@ -263,9 +263,9 @@ func TestExchange(t *testing.T) {
order
,
err
=
Exec_QueryOrder
(
orderID7
,
stateDB
,
kvdb
)
assert
.
Equal
(
t
,
nil
,
err
)
assert
.
Equal
(
t
,
int32
(
et
.
Ordered
),
order
.
Status
)
//查看账户余额,按
卖方
价格成交
//查看账户余额,按
被动方买单的
价格成交
acc
:=
accD1
.
LoadExecAccount
(
Nodes
[
3
],
execAddr
)
assert
.
Equal
(
t
,
8
5
*
types
.
DefaultCoinPrecision
,
acc
.
Balance
)
assert
.
Equal
(
t
,
8
0
*
types
.
DefaultCoinPrecision
,
acc
.
Balance
)
Exec_LimitOrder
(
t
,
&
et
.
LimitOrder
{
LeftAsset
:
&
et
.
Asset
{
Symbol
:
"bty"
,
Execer
:
"coins"
},
RightAsset
:
&
et
.
Asset
{
Execer
:
"token"
,
Symbol
:
"CCNY"
},
Price
:
400000000
,
Amount
:
5
*
types
.
DefaultCoinPrecision
,
Op
:
et
.
OpSell
},
PrivKeyC
,
stateDB
,
kvdb
,
env
)
...
...
@@ -298,8 +298,8 @@ func TestExchange(t *testing.T) {
assert
.
Equal
(
t
,
5
*
types
.
DefaultCoinPrecision
,
order
.
Balance
)
//余额检查
acc
=
accD1
.
LoadExecAccount
(
Nodes
[
3
],
execAddr
)
//
100-3*10-5*4-4.5*5 = 27
.5
assert
.
Equal
(
t
,
int64
(
2
7
50000000
),
acc
.
Balance
)
//
100-5*4-(10-5)*3-5*4-(15-5-5)*4.5 = 22
.5
assert
.
Equal
(
t
,
int64
(
2
2
50000000
),
acc
.
Balance
)
acc
=
accC
.
LoadExecAccount
(
Nodes
[
2
],
execAddr
)
assert
.
Equal
(
t
,
80
*
types
.
DefaultCoinPrecision
,
acc
.
Balance
)
...
...
@@ -316,8 +316,8 @@ func TestExchange(t *testing.T) {
assert
.
Equal
(
t
,
5
*
types
.
DefaultCoinPrecision
,
orderList
.
List
[
0
]
.
Balance
)
//余额检查
acc
=
accD1
.
LoadExecAccount
(
Nodes
[
3
],
execAddr
)
//
100-3*10-5*4-1*5 = 45
assert
.
Equal
(
t
,
45
*
types
.
DefaultCoinPrecision
,
acc
.
Balance
)
//
Nodes[3]为成交 Nodes[2]冻结10
assert
.
Equal
(
t
,
int64
(
2250000000
)
,
acc
.
Balance
)
acc
=
accC
.
LoadExecAccount
(
Nodes
[
2
],
execAddr
)
assert
.
Equal
(
t
,
70
*
types
.
DefaultCoinPrecision
,
acc
.
Balance
)
//orderID9和order10未成交
...
...
@@ -688,7 +688,7 @@ func CreateLimitOrder(limitOrder *et.LimitOrder, privKey string) (tx *types.Tran
if
err
!=
nil
{
return
nil
,
err
}
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
:=
types
.
NewChain33Config
(
et
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
tx
,
err
=
types
.
FormatTx
(
cfg
,
et
.
ExchangeX
,
tx
)
if
err
!=
nil
{
...
...
@@ -706,7 +706,7 @@ func CreateRevokeOrder(orderID int64, privKey string) (tx *types.Transaction, er
if
err
!=
nil
{
return
nil
,
err
}
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
:=
types
.
NewChain33Config
(
et
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
tx
,
err
=
types
.
FormatTx
(
cfg
,
et
.
ExchangeX
,
tx
)
if
err
!=
nil
{
...
...
@@ -721,7 +721,7 @@ func CreateRevokeOrder(orderID int64, privKey string) (tx *types.Transaction, er
//模拟区块中交易得执行过程
func
Exec_Block
(
t
*
testing
.
T
,
stateDB
db
.
DB
,
kvdb
db
.
KVDB
,
env
*
execEnv
,
txs
...*
types
.
Transaction
)
error
{
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
:=
types
.
NewChain33Config
(
et
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
exec
:=
NewExchange
()
q
:=
queue
.
New
(
"channel"
)
...
...
@@ -786,7 +786,7 @@ func Exec_RevokeOrder(t *testing.T, orderID int64, privKey string, stateDB db.DB
}
func
Exec_QueryOrderList
(
status
int32
,
addr
string
,
primaryKey
string
,
stateDB
db
.
KV
,
kvdb
db
.
KVDB
)
(
*
et
.
OrderList
,
error
)
{
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
:=
types
.
NewChain33Config
(
et
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
exec
:=
NewExchange
()
q
:=
queue
.
New
(
"channel"
)
...
...
@@ -803,7 +803,7 @@ func Exec_QueryOrderList(status int32, addr string, primaryKey string, stateDB d
return
msg
.
(
*
et
.
OrderList
),
nil
}
func
Exec_QueryOrder
(
orderID
int64
,
stateDB
db
.
KV
,
kvdb
db
.
KVDB
)
(
*
et
.
Order
,
error
)
{
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
:=
types
.
NewChain33Config
(
et
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
exec
:=
NewExchange
()
q
:=
queue
.
New
(
"channel"
)
...
...
@@ -821,7 +821,7 @@ func Exec_QueryOrder(orderID int64, stateDB db.KV, kvdb db.KVDB) (*et.Order, err
}
func
Exec_QueryMarketDepth
(
query
*
et
.
QueryMarketDepth
,
stateDB
db
.
KV
,
kvdb
db
.
KVDB
)
(
*
et
.
MarketDepthList
,
error
)
{
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
:=
types
.
NewChain33Config
(
et
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
exec
:=
NewExchange
()
q
:=
queue
.
New
(
"channel"
)
...
...
@@ -839,7 +839,7 @@ func Exec_QueryMarketDepth(query *et.QueryMarketDepth, stateDB db.KV, kvdb db.KV
}
func
Exec_QueryHistoryOrder
(
query
*
et
.
QueryHistoryOrderList
,
stateDB
db
.
KV
,
kvdb
db
.
KVDB
)
(
*
et
.
OrderList
,
error
)
{
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
:=
types
.
NewChain33Config
(
et
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
exec
:=
NewExchange
()
q
:=
queue
.
New
(
"channel"
)
...
...
plugin/dapp/exchange/executor/exchangedb.go
View file @
c7422357
package
executor
import
(
"encoding/hex"
"fmt"
"math/big"
"reflect"
"strings"
"github.com/33cn/chain33/account"
"github.com/33cn/chain33/client"
...
...
@@ -30,8 +33,17 @@ type Action struct {
func
NewAction
(
e
*
exchange
,
tx
*
types
.
Transaction
,
index
int
)
*
Action
{
hash
:=
tx
.
Hash
()
fromaddr
:=
tx
.
From
()
return
&
Action
{
e
.
GetStateDB
(),
hash
,
fromaddr
,
e
.
GetBlockTime
(),
e
.
GetHeight
(),
dapp
.
ExecAddress
(
string
(
tx
.
Execer
)),
e
.
GetLocalDB
(),
index
,
e
.
GetAPI
()}
return
&
Action
{
statedb
:
e
.
GetStateDB
(),
txhash
:
hash
,
fromaddr
:
fromaddr
,
blocktime
:
e
.
GetBlockTime
(),
height
:
e
.
GetHeight
(),
execaddr
:
dapp
.
ExecAddress
(
string
(
tx
.
Execer
)),
localDB
:
e
.
GetLocalDB
(),
index
:
index
,
api
:
e
.
GetAPI
(),
}
}
//GetIndex get index
...
...
@@ -234,6 +246,7 @@ func (a *Action) RevokeOrder(payload *et.RevokeOrder) (*types.Receipt, error) {
//更新order状态
order
.
Status
=
et
.
Revoked
order
.
UpdateTime
=
a
.
blocktime
order
.
RevokeHash
=
hex
.
EncodeToString
(
a
.
txhash
)
kvs
=
append
(
kvs
,
a
.
GetKVSet
(
order
)
...
)
re
:=
&
et
.
ReceiptExchange
{
Order
:
order
,
...
...
@@ -251,7 +264,6 @@ func (a *Action) RevokeOrder(payload *et.RevokeOrder) (*types.Receipt, error) {
//1.买单高于市场价,按价格由低往高撮合。
//2.卖单低于市场价,按价格由高往低进行撮合。
//3.价格相同按先进先出的原则进行撮合
//4.买家获利得原则
func
(
a
*
Action
)
matchLimitOrder
(
payload
*
et
.
LimitOrder
,
leftAccountDB
,
rightAccountDB
*
account
.
DB
)
(
*
types
.
Receipt
,
error
)
{
var
logs
[]
*
types
.
ReceiptLog
var
kvs
[]
*
types
.
KeyValue
...
...
@@ -260,6 +272,11 @@ func (a *Action) matchLimitOrder(payload *et.LimitOrder, leftAccountDB, rightAcc
var
count
int
cfg
:=
a
.
api
.
GetConfig
()
tCfg
,
err
:=
ParseConfig
(
a
.
api
.
GetConfig
(),
a
.
height
)
if
err
!=
nil
{
elog
.
Error
(
"executor/exchangedb matchLimitOrder.ParseConfig"
,
"err"
,
err
)
return
nil
,
err
}
or
:=
&
et
.
Order
{
OrderID
:
a
.
GetIndex
(),
Value
:
&
et
.
Order_LimitOrder
{
LimitOrder
:
payload
},
...
...
@@ -271,6 +288,10 @@ func (a *Action) matchLimitOrder(payload *et.LimitOrder, leftAccountDB, rightAcc
Addr
:
a
.
fromaddr
,
UpdateTime
:
a
.
blocktime
,
Index
:
a
.
GetIndex
(),
Rate
:
tCfg
.
GetRate
(
payload
),
MinFee
:
tCfg
.
GetMinFee
(
payload
),
Hash
:
hex
.
EncodeToString
(
a
.
txhash
),
CreateTime
:
a
.
blocktime
,
}
re
:=
&
et
.
ReceiptExchange
{
Order
:
or
,
...
...
@@ -322,7 +343,7 @@ func (a *Action) matchLimitOrder(payload *et.LimitOrder, leftAccountDB, rightAcc
continue
}
//撮合,指针传递
log
,
kv
,
err
:=
a
.
matchModel
(
leftAccountDB
,
rightAccountDB
,
payload
,
matchorder
,
or
,
re
)
// payload, or redundant
log
,
kv
,
err
:=
a
.
matchModel
(
leftAccountDB
,
rightAccountDB
,
payload
,
matchorder
,
or
,
re
,
tCfg
.
GetFeeAddr
()
)
// payload, or redundant
if
err
!=
nil
{
return
nil
,
err
}
...
...
@@ -359,7 +380,7 @@ func (a *Action) matchLimitOrder(payload *et.LimitOrder, leftAccountDB, rightAcc
amount
:=
CalcActualCost
(
et
.
OpBuy
,
or
.
Balance
,
payload
.
Price
,
cfg
.
GetCoinPrecision
())
receipt
,
err
:=
rightAccountDB
.
ExecFrozen
(
a
.
fromaddr
,
a
.
execaddr
,
amount
)
if
err
!=
nil
{
elog
.
Error
(
"LimitOrder.ExecFrozen"
,
"addr"
,
a
.
fromaddr
,
"amount"
,
amount
,
"err"
,
err
.
Error
())
elog
.
Error
(
"LimitOrder.ExecFrozen
OpBuy
"
,
"addr"
,
a
.
fromaddr
,
"amount"
,
amount
,
"err"
,
err
.
Error
())
return
nil
,
err
}
logs
=
append
(
logs
,
receipt
.
Logs
...
)
...
...
@@ -369,7 +390,7 @@ func (a *Action) matchLimitOrder(payload *et.LimitOrder, leftAccountDB, rightAcc
amount
:=
CalcActualCost
(
et
.
OpSell
,
or
.
Balance
,
payload
.
Price
,
cfg
.
GetCoinPrecision
())
receipt
,
err
:=
leftAccountDB
.
ExecFrozen
(
a
.
fromaddr
,
a
.
execaddr
,
amount
)
if
err
!=
nil
{
elog
.
Error
(
"LimitOrder.ExecFrozen"
,
"addr"
,
a
.
fromaddr
,
"amount"
,
amount
,
"err"
,
err
.
Error
())
elog
.
Error
(
"LimitOrder.ExecFrozen
OpSell
"
,
"addr"
,
a
.
fromaddr
,
"amount"
,
amount
,
"err"
,
err
.
Error
())
return
nil
,
err
}
logs
=
append
(
logs
,
receipt
.
Logs
...
)
...
...
@@ -385,7 +406,7 @@ 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
,
feeAddr
string
)
([]
*
types
.
ReceiptLog
,
[]
*
types
.
KeyValue
,
error
)
{
var
logs
[]
*
types
.
ReceiptLog
var
kvs
[]
*
types
.
KeyValue
var
matched
int64
...
...
@@ -402,7 +423,7 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload *
cfg
:=
a
.
api
.
GetConfig
()
if
payload
.
Op
==
et
.
OpSell
{
//转移冻结资产
amount
:=
CalcActualCost
(
matchorder
.
GetLimitOrder
()
.
Op
,
matched
,
payload
.
Price
,
cfg
.
GetCoinPrecision
())
amount
:=
CalcActualCost
(
matchorder
.
GetLimitOrder
()
.
Op
,
matched
,
matchorder
.
GetLimitOrder
()
.
Price
,
cfg
.
GetCoinPrecision
())
receipt
,
err
:=
rightAccountDB
.
ExecTransferFrozen
(
matchorder
.
Addr
,
a
.
fromaddr
,
a
.
execaddr
,
amount
)
if
err
!=
nil
{
elog
.
Error
(
"matchModel.ExecTransferFrozen"
,
"from"
,
matchorder
.
Addr
,
"to"
,
a
.
fromaddr
,
"amount"
,
amount
,
"err"
,
err
)
...
...
@@ -410,19 +431,23 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload *
}
logs
=
append
(
logs
,
receipt
.
Logs
...
)
kvs
=
append
(
kvs
,
receipt
.
KV
...
)
//解冻多余资金
if
payload
.
Price
<
matchorder
.
GetLimitOrder
()
.
Price
{
amount
:=
CalcActualCost
(
matchorder
.
GetLimitOrder
()
.
Op
,
matched
,
matchorder
.
GetLimitOrder
()
.
Price
-
payload
.
Price
,
cfg
.
GetCoinPrecision
())
receipt
,
err
:=
rightAccountDB
.
ExecActive
(
matchorder
.
Addr
,
a
.
execaddr
,
amount
)
//收取手续费
activeFee
:=
calcMtfFee
(
amount
,
or
.
GetRate
())
//主动成交方的手续费
if
activeFee
!=
0
{
receipt
,
err
=
rightAccountDB
.
ExecTransfer
(
a
.
fromaddr
,
feeAddr
,
a
.
execaddr
,
activeFee
)
if
err
!=
nil
{
elog
.
Error
(
"matchModel.ExecActive"
,
"addr"
,
matchorder
.
Addr
,
"amount"
,
amount
,
"err"
,
err
.
Error
())
elog
.
Error
(
"matchModel.ExecTransfer sell"
,
"from"
,
a
.
fromaddr
,
"to"
,
feeAddr
,
"amount"
,
amount
,
"rate"
,
or
.
GetRate
(),
"activeFee"
,
activeFee
,
"err"
,
err
.
Error
())
return
nil
,
nil
,
err
}
or
.
DigestedFee
+=
activeFee
logs
=
append
(
logs
,
receipt
.
Logs
...
)
kvs
=
append
(
kvs
,
receipt
.
KV
...
)
}
//将达成交易的相应资产结算
amount
=
CalcActualCost
(
payload
.
Op
,
matched
,
payload
.
Price
,
cfg
.
GetCoinPrecision
())
amount
=
CalcActualCost
(
payload
.
Op
,
matched
,
matchorder
.
GetLimitOrder
()
.
Price
,
cfg
.
GetCoinPrecision
())
receipt
,
err
=
leftAccountDB
.
ExecTransfer
(
a
.
fromaddr
,
matchorder
.
Addr
,
a
.
execaddr
,
amount
)
if
err
!=
nil
{
elog
.
Error
(
"matchModel.ExecTransfer"
,
"from"
,
a
.
fromaddr
,
"to"
,
matchorder
.
Addr
,
"amount"
,
amount
,
"err"
,
err
.
Error
())
...
...
@@ -431,10 +456,23 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload *
logs
=
append
(
logs
,
receipt
.
Logs
...
)
kvs
=
append
(
kvs
,
receipt
.
KV
...
)
//卖单成交得平均价格始终与自身挂单价格相同
or
.
AVGPrice
=
payload
.
Price
//收取手续费
passiveFee
:=
calcMtfFee
(
amount
,
matchorder
.
GetRate
())
//被动成交方的手续费
if
passiveFee
!=
0
{
receipt
,
err
=
leftAccountDB
.
ExecTransfer
(
matchorder
.
Addr
,
feeAddr
,
a
.
execaddr
,
passiveFee
)
if
err
!=
nil
{
elog
.
Error
(
"matchModel.ExecTransfer sell"
,
"from"
,
matchorder
.
Addr
,
"to"
,
feeAddr
,
"amount"
,
amount
,
"rate"
,
matchorder
.
GetRate
(),
"passiveFee"
,
passiveFee
,
"err"
,
err
.
Error
())
return
nil
,
nil
,
err
}
matchorder
.
DigestedFee
+=
passiveFee
logs
=
append
(
logs
,
receipt
.
Logs
...
)
kvs
=
append
(
kvs
,
receipt
.
KV
...
)
}
or
.
AVGPrice
=
caclAVGPrice
(
or
,
matchorder
.
GetLimitOrder
()
.
Price
,
matched
)
//计算matchOrder平均成交价格
matchorder
.
AVGPrice
=
caclAVGPrice
(
matchorder
,
payload
.
Price
,
matched
)
//TODO
matchorder
.
AVGPrice
=
caclAVGPrice
(
matchorder
,
matchorder
.
GetLimitOrder
()
.
Price
,
matched
)
}
if
payload
.
Op
==
et
.
OpBuy
{
//转移冻结资产
...
...
@@ -446,6 +484,21 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload *
}
logs
=
append
(
logs
,
receipt
.
Logs
...
)
kvs
=
append
(
kvs
,
receipt
.
KV
...
)
//收取手续费
activeFee
:=
calcMtfFee
(
amount
,
or
.
GetRate
())
//主动成交方的手续费
if
activeFee
!=
0
{
receipt
,
err
=
leftAccountDB
.
ExecTransfer
(
a
.
fromaddr
,
feeAddr
,
a
.
execaddr
,
activeFee
)
if
err
!=
nil
{
elog
.
Error
(
"matchModel.ExecTransfer buy"
,
"from"
,
a
.
fromaddr
,
"to"
,
feeAddr
,
"amount"
,
amount
,
"rate"
,
or
.
GetRate
(),
"activeFee"
,
activeFee
,
"err"
,
err
.
Error
())
return
nil
,
nil
,
err
}
or
.
DigestedFee
+=
activeFee
logs
=
append
(
logs
,
receipt
.
Logs
...
)
kvs
=
append
(
kvs
,
receipt
.
KV
...
)
}
//将达成交易的相应资产结算
amount
=
CalcActualCost
(
payload
.
Op
,
matched
,
matchorder
.
GetLimitOrder
()
.
Price
,
cfg
.
GetCoinPrecision
())
receipt
,
err
=
rightAccountDB
.
ExecTransfer
(
a
.
fromaddr
,
matchorder
.
Addr
,
a
.
execaddr
,
amount
)
...
...
@@ -456,12 +509,27 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload *
logs
=
append
(
logs
,
receipt
.
Logs
...
)
kvs
=
append
(
kvs
,
receipt
.
KV
...
)
//买单得话,价格选取卖单的价格
or
.
AVGPrice
=
matchorder
.
GetLimitOrder
()
.
Price
//收取手续费
passiveFee
:=
calcMtfFee
(
amount
,
matchorder
.
GetRate
())
//被动成交方的手续费
if
passiveFee
!=
0
{
receipt
,
err
=
rightAccountDB
.
ExecTransfer
(
matchorder
.
Addr
,
feeAddr
,
a
.
execaddr
,
passiveFee
)
if
err
!=
nil
{
elog
.
Error
(
"matchModel.ExecTransfer buy"
,
"from"
,
matchorder
.
Addr
,
"to"
,
feeAddr
,
"amount"
,
amount
,
"rate"
,
matchorder
.
GetRate
(),
"passiveFee"
,
passiveFee
,
"err"
,
err
.
Error
())
return
nil
,
nil
,
err
}
matchorder
.
DigestedFee
+=
passiveFee
logs
=
append
(
logs
,
receipt
.
Logs
...
)
kvs
=
append
(
kvs
,
receipt
.
KV
...
)
}
or
.
AVGPrice
=
caclAVGPrice
(
or
,
matchorder
.
GetLimitOrder
()
.
Price
,
matched
)
//计算matchOrder平均成交价格
matchorder
.
AVGPrice
=
caclAVGPrice
(
matchorder
,
matchorder
.
GetLimitOrder
()
.
Price
,
matched
)
//TODO
matchorder
.
AVGPrice
=
caclAVGPrice
(
matchorder
,
matchorder
.
GetLimitOrder
()
.
Price
,
matched
)
}
matchorder
.
UpdateTime
=
a
.
blocktime
if
matched
==
matchorder
.
GetBalance
()
{
matchorder
.
Status
=
et
.
Completed
}
else
{
...
...
@@ -515,10 +583,12 @@ func findOrderByOrderID(statedb dbm.KV, localdb dbm.KV, orderID int64) (*et.Orde
elog
.
Error
(
"findOrderByOrderID.Decode"
,
"orderID"
,
orderID
,
"err"
,
err
.
Error
())
return
nil
,
err
}
order
.
Executed
=
order
.
GetLimitOrder
()
.
Amount
-
order
.
Balance
return
&
order
,
nil
}
return
row
.
Data
.
(
*
et
.
Order
),
nil
order
:=
row
.
Data
.
(
*
et
.
Order
)
order
.
Executed
=
order
.
GetLimitOrder
()
.
Amount
-
order
.
Balance
return
order
,
nil
}
func
findOrderIDListByPrice
(
localdb
dbm
.
KV
,
left
,
right
*
et
.
Asset
,
price
int64
,
op
,
direction
int32
,
primaryKey
string
)
(
*
et
.
OrderList
,
error
)
{
...
...
@@ -698,3 +768,78 @@ func caclAVGPrice(order *et.Order, price int64, amount int64) int64 {
avg
:=
big
.
NewInt
(
0
)
.
Div
(
total
,
div
)
return
avg
.
Int64
()
}
//计算手续费
func
calcMtfFee
(
cost
int64
,
rate
int32
)
int64
{
fee
:=
big
.
NewInt
(
0
)
.
Mul
(
big
.
NewInt
(
cost
),
big
.
NewInt
(
int64
(
rate
)))
fee
=
big
.
NewInt
(
0
)
.
Div
(
fee
,
big
.
NewInt
(
types
.
DefaultCoinPrecision
))
return
fee
.
Int64
()
}
func
ParseConfig
(
cfg
*
types
.
Chain33Config
,
height
int64
)
(
*
et
.
TradeConfig
,
error
)
{
banks
,
err
:=
ParseStrings
(
cfg
,
"banks"
,
height
)
if
err
!=
nil
||
len
(
banks
)
==
0
{
return
nil
,
err
}
coins
,
err
:=
ParseCoins
(
cfg
,
"coins"
,
height
)
if
err
!=
nil
{
return
nil
,
err
}
return
&
et
.
TradeConfig
{
Banks
:
banks
,
Coins
:
coins
,
},
nil
}
func
ParseStrings
(
cfg
*
types
.
Chain33Config
,
tradeKey
string
,
height
int64
)
(
ret
[]
string
,
err
error
)
{
val
,
err
:=
cfg
.
MG
(
et
.
MverPrefix
+
"."
+
tradeKey
,
height
)
if
err
!=
nil
{
return
nil
,
err
}
datas
,
ok
:=
val
.
([]
interface
{})
if
!
ok
{
elog
.
Error
(
"invalid val"
,
"val"
,
val
,
"key"
,
tradeKey
)
return
nil
,
et
.
ErrCfgFmt
}
for
_
,
v
:=
range
datas
{
one
,
ok
:=
v
.
(
string
)
if
!
ok
{
elog
.
Error
(
"invalid one"
,
"one"
,
one
,
"key"
,
tradeKey
)
return
nil
,
et
.
ErrCfgFmt
}
ret
=
append
(
ret
,
one
)
}
return
}
func
ParseCoins
(
cfg
*
types
.
Chain33Config
,
tradeKey
string
,
height
int64
)
(
coins
map
[
string
]
et
.
Coin
,
err
error
)
{
coins
=
make
(
map
[
string
]
et
.
Coin
)
val
,
err
:=
cfg
.
MG
(
et
.
MverPrefix
+
"."
+
tradeKey
,
height
)
if
err
!=
nil
{
return
nil
,
err
}
datas
,
ok
:=
val
.
([]
interface
{})
if
!
ok
{
elog
.
Error
(
"invalid coins"
,
"val"
,
val
,
"type"
,
reflect
.
TypeOf
(
val
))
return
nil
,
et
.
ErrCfgFmt
}
for
_
,
e
:=
range
datas
{
v
,
ok
:=
e
.
(
map
[
string
]
interface
{})
if
!
ok
{
elog
.
Error
(
"invalid one"
,
"one"
,
v
,
"key"
,
tradeKey
)
return
nil
,
et
.
ErrCfgFmt
}
name
:=
strings
.
ToUpper
(
v
[
"name"
]
.
(
string
))
coins
[
name
]
=
et
.
Coin
{
Name
:
name
,
Rate
:
int32
(
v
[
"rate"
]
.
(
int64
)),
MinFee
:
v
[
"minFee"
]
.
(
int64
),
}
}
return
}
plugin/dapp/exchange/proto/exchange.proto
View file @
c7422357
...
...
@@ -72,6 +72,18 @@ message Order {
int64
updateTime
=
10
;
//索引
int64
index
=
11
;
//手续费率
int32
rate
=
12
;
//手续费
int64
digestedFee
=
13
;
//最小手续费
int64
minFee
=
14
;
//挂单hash
string
hash
=
15
;
//撤单hash
string
revokeHash
=
16
;
//创建时间
int64
createTime
=
17
;
}
//查询接口
...
...
plugin/dapp/exchange/test/chain33.toml
View file @
c7422357
...
...
@@ -76,6 +76,7 @@ enableTLS=false
certFile
=
"cert.pem"
# 私钥文件
keyFile
=
"key.pem"
[mempool]
# mempool队列名称,可配,timeline,score,price
name
=
"timeline"
...
...
@@ -86,6 +87,7 @@ minTxFee=100000
# 每个账户在mempool中得最大交易数量,默认100
maxTxNumPerAccount
=
10000
# timeline 是默认的先来先进的按时间排序
[mempool.sub.timeline]
# mempool缓存容量大小,默认10240
poolCacheSize
=
10240
...
...
@@ -94,6 +96,7 @@ minTxFee=100000
# 每个账户在mempool中得最大交易数量,默认100
maxTxNumPerAccount
=
10000
# score是分数队列模式(分数=常量a*手续费/交易字节数-常量b*时间*定量c,按分数排队,高的优先,常量a,b和定量c可配置),按分数来排序
[mempool.sub.score]
# mempool缓存容量大小,默认10240
poolCacheSize
=
10240
...
...
@@ -108,6 +111,7 @@ priceConstant=1544
# 常量比例
pricePower
=
1
# price是价格队列模式(价格=手续费/交易字节数,价格高者优先,同价则时间早优先)
[mempool.sub.price]
# mempool缓存容量大小,默认10240
poolCacheSize
=
10240
...
...
@@ -115,6 +119,7 @@ poolCacheSize=10240
minTxFee
=
100000
# 每个账户在mempool中得最大交易数量,默认100
maxTxNumPerAccount
=
10000
[consensus]
#共识名,可选项有solo,ticket,raft,tendermint,para
name
=
"solo"
...
...
@@ -124,6 +129,7 @@ minerstart=true
genesisBlockTime
=
1514533394
#创世交易地址
genesis
=
"1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs"
[mver.consensus]
#基金账户地址
fundKeyAddr
=
"1BQXS6TxaYYG5mADaWij4AxhZZUTpw95a5"
...
...
@@ -150,6 +156,7 @@ targetTimespan = 2304
#每个区块打包的目标时间
targetTimePerBlock
=
16
# 仅保留这一项,其他consensus相关的配置全部删除
[consensus.sub.solo]
#创世交易地址
genesis
=
"1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs"
...
...
@@ -157,6 +164,7 @@ genesis="1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs"
genesisBlockTime
=
1514533394
#获取交易间隔时长,单位纳秒
waitTxMs
=
10
[store]
# 数据存储格式名称,目前支持mavl,kvdb,kvmvcc,mpt
name
=
"mavl"
...
...
@@ -168,6 +176,7 @@ dbPath="datadir/mavltree"
dbCache
=
128
# 数据库版本
localdbVersion
=
"1.0.0"
[store.sub.mavl]
# 是否使能mavl加前缀
enableMavlPrefix
=
false
...
...
@@ -177,6 +186,7 @@ enableMVCC=false
enableMavlPrune
=
false
# 裁剪高度间隔
pruneHeight
=
10000
[wallet]
# 交易发送最低手续费,单位0.00000001BTY(1e-8),默认100000,即0.001BTY
minFee
=
100000
...
...
@@ -187,12 +197,14 @@ dbPath="wallet"
# walletdb缓存大小
dbCache
=
16
# 钱包发送交易签名方式
signType
=
"secp256k1"
[wallet.sub.ticket]
# 是否关闭ticket自动挖矿,默认false
minerdisable
=
false
# 允许购买ticket挖矿的白名单地址,默认配置“*”,允许所有地址购买
minerwhitelist
=
["*"]
[exec]
#执行器执行是否免费
isFree
=
false
...
...
@@ -203,6 +215,7 @@ enableStat=false
#是否开启MVCC插件
enableMVCC
=
false
alias
=
["token1:token","token2:token","token3:token"]
[exec.sub.token]
#是否保存token交易信息
saveTokenTxList
=
true
...
...
@@ -215,6 +228,7 @@ tokenApprs = [
"1JYB8sxi4He5pZWHCd3Zi2nypQ4JMB6AxN"
,
"12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
,
]
[exec.sub.cert]
# 是否启用证书验证和签名
enable
=
false
...
...
@@ -222,9 +236,11 @@ enable=false
cryptoPath
=
"authdir/crypto"
# 带证书签名类型,支持"auth_ecdsa", "auth_sm2"
signType
=
"auth_ecdsa"
[exec.sub.relay]
#relay执行器保存BTC头执行权限地址
genesis
=
"1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs"
[exec.sub.manage]
#manage执行器超级管理员地址
superManager
=[
...
...
@@ -233,3 +249,42 @@ superManager=[
"1Q8hGLfoGe63efeWa8fJ4Pnukhkngt6poK"
]
[metrics]
#是否使能发送metrics数据的发送
enableMetrics
=
false
#数据保存模式
dataEmitMode
=
"influxdb"
[metrics.sub.influxdb]
#以纳秒为单位的发送间隔
duration
=
1000000000
url
=
"http://influxdb:8086"
database
=
"chain33metrics"
username
=
""
password
=
""
namespace
=
""
[mver.exec.sub.exchange]
banks
=
[
"1PTGVR7TUm1MJUH7M1UNcKBGMvfJ7nCrnN"
]
coins
=
[
{name
=
"BTY"
,
rate
=
100000
,
minFee
=
1000000
}
,
{name
=
"USDT"
,
rate
=
100000
,
minFee
=
1000000
}
,
{name
=
"bty"
,
rate
=
100000
,
minFee
=
1000000
}
,
{name
=
"CCNY"
,
rate
=
100000
,
minFee
=
1000000
}
,
]
#[mver.exec.sub.exchange.ForkParamV1]
#banks = [
# "1PTGVR7TUm1MJUH7M1UNcKBGMvfJ7nCrnN"
#]
#coins = [
# {name = "BTY", rate = 100000, minFee = 1000000},
# {name = "USDT", rate = 100000, minFee = 1000000},
#]
[fork.sub.exchange]
Enable
=
0
#ForkParamV1=1
\ No newline at end of file
plugin/dapp/exchange/test/cmd/main.go
View file @
c7422357
...
...
@@ -18,10 +18,35 @@ var (
// 批量测试前,先确保测试账户有足够的币和钱
func
main
()
{
cli
=
test
.
NewGRPCCli
(
"localhost:8802"
)
onesell
()
go
buy
()
go
sell
()
select
{}
}
func
onesell
()
{
req
:=
&
et
.
LimitOrder
{
LeftAsset
:
&
et
.
Asset
{
Symbol
:
"bty"
,
Execer
:
"coins"
},
RightAsset
:
&
et
.
Asset
{
Execer
:
"token"
,
Symbol
:
"CCNY"
},
Price
:
1
,
Amount
:
types
.
DefaultCoinPrecision
,
Op
:
et
.
OpSell
,
}
ety
:=
types
.
LoadExecutorType
(
et
.
ExchangeX
)
// 卖 2000 次,需 2000*1=2000 个 bty
fmt
.
Println
(
"one sell "
)
tx
,
err
:=
ety
.
Create
(
"LimitOrder"
,
req
)
if
err
!=
nil
{
panic
(
err
)
}
reply
,
err
:=
cli
.
SendTx
(
tx
,
PrivKeyA
)
if
err
!=
nil
{
fmt
.
Println
(
"send err:"
,
err
)
return
}
fmt
.
Println
(
"reply"
,
reply
.
IsOk
)
fmt
.
Println
(
"reply"
,
string
(
reply
.
GetMsg
()))
}
func
sell
()
{
req
:=
&
et
.
LimitOrder
{
...
...
plugin/dapp/exchange/test/exchange_test.go
View file @
c7422357
...
...
@@ -17,6 +17,7 @@ var (
PrivKeyB
=
"0x19c069234f9d3e61135fefbeb7791b149cdf6af536f26bebb310d4cd22c3fee4"
// 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR
PrivKeyC
=
"0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115"
// 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k
PrivKeyD
=
"0xcacb1f5d51700aea07fca2246ab43b0917d70405c65edea9b5063d72eb5c6b71"
// 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs
PrivKeyFee
=
"0xa691ceceadb1f6878c39702a057b09077971d2995b29f18ccba1e09cd9619b7f"
// 1PTGVR7TUm1MJUH7M1UNcKBGMvfJ7nCrnN
coin
=
"bty"
token
=
"CCNY"
leftAsset
=
&
et
.
Asset
{
Symbol
:
coin
,
Execer
:
"coins"
}
...
...
plugin/dapp/exchange/test/exec_cli.go
View file @
c7422357
...
...
@@ -40,6 +40,8 @@ type ExecCli struct {
accC1
*
account
.
DB
accD
*
account
.
DB
accD1
*
account
.
DB
accF
*
account
.
DB
accF1
*
account
.
DB
}
//Nodes ...
...
...
@@ -49,6 +51,7 @@ var (
"1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR"
,
"1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k"
,
"1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs"
,
"1PTGVR7TUm1MJUH7M1UNcKBGMvfJ7nCrnN"
,
}
)
...
...
@@ -57,7 +60,7 @@ func NewExecCli() *ExecCli {
dir
,
sdb
,
ldb
:=
util
.
CreateTestDB
()
log
.
Println
(
dir
)
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
:=
types
.
NewChain33Config
(
et
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
executor
.
Init
(
et
.
ExchangeX
,
cfg
,
nil
)
...
...
@@ -72,7 +75,6 @@ func NewExecCli() *ExecCli {
Frozen
:
0
,
Addr
:
Nodes
[
1
],
}
accountC
:=
&
types
.
Account
{
Balance
:
total
,
Frozen
:
0
,
...
...
@@ -83,6 +85,11 @@ func NewExecCli() *ExecCli {
Frozen
:
0
,
Addr
:
Nodes
[
3
],
}
accountFee
:=
&
types
.
Account
{
Balance
:
0
,
Frozen
:
0
,
Addr
:
Nodes
[
4
],
}
execAddr
:=
address
.
ExecAddress
(
et
.
ExchangeX
)
...
...
@@ -98,6 +105,9 @@ func NewExecCli() *ExecCli {
accD
,
_
:=
account
.
NewAccountDB
(
cfg
,
"coins"
,
"bty"
,
sdb
)
accD
.
SaveExecAccount
(
execAddr
,
accountD
)
accF
,
_
:=
account
.
NewAccountDB
(
cfg
,
"coins"
,
"bty"
,
sdb
)
accF
.
SaveExecAccount
(
execAddr
,
accountFee
)
accA1
,
_
:=
account
.
NewAccountDB
(
cfg
,
"token"
,
"CCNY"
,
sdb
)
accA1
.
SaveExecAccount
(
execAddr
,
accountA
)
...
...
@@ -110,6 +120,9 @@ func NewExecCli() *ExecCli {
accD1
,
_
:=
account
.
NewAccountDB
(
cfg
,
"token"
,
"CCNY"
,
sdb
)
accD1
.
SaveExecAccount
(
execAddr
,
accountD
)
accF1
,
_
:=
account
.
NewAccountDB
(
cfg
,
"token"
,
"CCNY"
,
sdb
)
accF1
.
SaveExecAccount
(
execAddr
,
accountFee
)
q
:=
queue
.
New
(
"channel"
)
q
.
SetConfig
(
cfg
)
...
...
@@ -131,6 +144,8 @@ func NewExecCli() *ExecCli {
accC1
:
accC1
,
accD
:
accD
,
accD1
:
accD1
,
accF
:
accF
,
accF1
:
accF1
,
}
}
...
...
plugin/dapp/exchange/test/grpc_cli.go
View file @
c7422357
...
...
@@ -28,7 +28,7 @@ func NewGRPCCli(grpcAddr string) *GRPCCli {
panic
(
err
)
}
client
:=
types
.
NewChain33Client
(
conn
)
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
:=
types
.
NewChain33Config
(
et
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
executor
.
Init
(
et
.
ExchangeX
,
cfg
,
nil
)
return
&
GRPCCli
{
...
...
@@ -138,7 +138,7 @@ func (c *GRPCCli) sendAndWaitReceipt(tx *types.Transaction, hexKey string) (txHa
//SendTx ...
func
(
c
*
GRPCCli
)
SendTx
(
tx
*
types
.
Transaction
,
hexKey
string
)
(
reply
*
types
.
Reply
,
err
error
)
{
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
:=
types
.
NewChain33Config
(
et
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
tx
,
err
=
types
.
FormatTx
(
cfg
,
et
.
ExchangeX
,
tx
)
if
err
!=
nil
{
...
...
plugin/dapp/exchange/test/prepare.sh
View file @
c7422357
...
...
@@ -30,6 +30,9 @@ sleep 1
#D -- 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs
./chain33-cli account import_key
-k
0xcacb1f5d51700aea07fca2246ab43b0917d70405c65edea9b5063d72eb5c6b71
-l
D
#Fee -- 1PTGVR7TUm1MJUH7M1UNcKBGMvfJ7nCrnN
./chain33-cli account import_key
-k
0xa691ceceadb1f6878c39702a057b09077971d2995b29f18ccba1e09cd9619b7f
-l
Fee
## config token
./chain33-cli send config config_tx
-c
token-finisher
-o
add
-v
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
sleep
1
...
...
plugin/dapp/exchange/types/errors.go
View file @
c7422357
...
...
@@ -15,4 +15,6 @@ var (
ErrDirection
=
fmt
.
Errorf
(
"%s"
,
"The direction only 0 or 1!"
)
ErrStatus
=
fmt
.
Errorf
(
"%s"
,
"The status only in 0 , 1, 2!"
)
ErrOrderID
=
fmt
.
Errorf
(
"%s"
,
"Wrong OrderID!"
)
ErrCfgFmt
=
fmt
.
Errorf
(
"%s"
,
"ErrCfgFmt"
)
)
plugin/dapp/exchange/types/exchange.go
View file @
c7422357
...
...
@@ -127,3 +127,51 @@ func (e *ExchangeType) GetTypeMap() map[string]int32 {
func
(
e
*
ExchangeType
)
GetLogMap
()
map
[
int64
]
*
types
.
LogInfo
{
return
logMap
}
var
MverPrefix
=
"mver.exec.sub."
+
ExchangeX
// [mver.exec.sub.exchange]
type
TradeConfig
struct
{
Banks
[]
string
Coins
map
[
string
]
Coin
}
// 交易对配置
type
Coin
struct
{
Name
string
Rate
int32
MinFee
int64
}
func
(
f
*
TradeConfig
)
GetFeeAddr
()
string
{
return
f
.
Banks
[
0
]
}
func
(
f
*
TradeConfig
)
GetRate
(
or
*
LimitOrder
)
int32
{
var
symbol
=
or
.
GetRightAsset
()
.
GetSymbol
()
if
or
.
GetOp
()
==
OpBuy
{
symbol
=
or
.
GetLeftAsset
()
.
GetSymbol
()
}
c
,
ok
:=
f
.
Coins
[
symbol
]
if
!
ok
{
return
0
}
return
c
.
Rate
}
func
(
f
*
TradeConfig
)
GetMinFee
(
or
*
LimitOrder
)
int64
{
var
symbol
=
or
.
GetRightAsset
()
.
GetSymbol
()
if
or
.
GetOp
()
==
OpBuy
{
symbol
=
or
.
GetLeftAsset
()
.
GetSymbol
()
}
c
,
ok
:=
f
.
Coins
[
symbol
]
if
!
ok
{
return
0
}
return
c
.
MinFee
}
plugin/dapp/exchange/types/exchange.pb.go
View file @
c7422357
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.26.0
// protoc v3.
9.1
// protoc v3.
17.3
// source: exchange.proto
package
types
...
...
@@ -456,6 +456,18 @@ type Order struct {
UpdateTime
int64
`protobuf:"varint,10,opt,name=updateTime,proto3" json:"updateTime,omitempty"`
//索引
Index
int64
`protobuf:"varint,11,opt,name=index,proto3" json:"index,omitempty"`
//手续费率
Rate
int32
`protobuf:"varint,12,opt,name=rate,proto3" json:"rate,omitempty"`
//手续费
DigestedFee
int64
`protobuf:"varint,13,opt,name=digestedFee,proto3" json:"digestedFee,omitempty"`
//最小手续费
MinFee
int64
`protobuf:"varint,14,opt,name=minFee,proto3" json:"minFee,omitempty"`
//挂单hash
Hash
string
`protobuf:"bytes,15,opt,name=hash,proto3" json:"hash,omitempty"`
//撤单hash
RevokeHash
string
`protobuf:"bytes,16,opt,name=revokeHash,proto3" json:"revokeHash,omitempty"`
//创建时间
CreateTime
int64
`protobuf:"varint,17,opt,name=createTime,proto3" json:"createTime,omitempty"`
}
func
(
x
*
Order
)
Reset
()
{
...
...
@@ -574,6 +586,48 @@ func (x *Order) GetIndex() int64 {
return
0
}
func
(
x
*
Order
)
GetRate
()
int32
{
if
x
!=
nil
{
return
x
.
Rate
}
return
0
}
func
(
x
*
Order
)
GetDigestedFee
()
int64
{
if
x
!=
nil
{
return
x
.
DigestedFee
}
return
0
}
func
(
x
*
Order
)
GetMinFee
()
int64
{
if
x
!=
nil
{
return
x
.
MinFee
}
return
0
}
func
(
x
*
Order
)
GetHash
()
string
{
if
x
!=
nil
{
return
x
.
Hash
}
return
""
}
func
(
x
*
Order
)
GetRevokeHash
()
string
{
if
x
!=
nil
{
return
x
.
RevokeHash
}
return
""
}
func
(
x
*
Order
)
GetCreateTime
()
int64
{
if
x
!=
nil
{
return
x
.
CreateTime
}
return
0
}
type
isOrder_Value
interface
{
isOrder_Value
()
}
...
...
@@ -1198,7 +1252,7 @@ var file_exchange_proto_rawDesc = []byte{
0x16
,
0x0a
,
0x06
,
0x65
,
0x78
,
0x65
,
0x63
,
0x65
,
0x72
,
0x18
,
0x01
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x06
,
0x65
,
0x78
,
0x65
,
0x63
,
0x65
,
0x72
,
0x12
,
0x16
,
0x0a
,
0x06
,
0x73
,
0x79
,
0x6d
,
0x62
,
0x6f
,
0x6c
,
0x18
,
0x02
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x06
,
0x73
,
0x79
,
0x6d
,
0x62
,
0x6f
,
0x6c
,
0x22
,
0x
dc
,
0x02
,
0x0a
,
0x05
,
0x4f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x12
,
0x18
,
0x0a
,
0x07
,
0x6f
,
0x72
,
0x64
,
0x
fe
,
0x03
,
0x0a
,
0x05
,
0x4f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x12
,
0x18
,
0x0a
,
0x07
,
0x6f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x49
,
0x44
,
0x18
,
0x01
,
0x20
,
0x01
,
0x28
,
0x03
,
0x52
,
0x07
,
0x6f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x49
,
0x44
,
0x12
,
0x33
,
0x0a
,
0x0a
,
0x6c
,
0x69
,
0x6d
,
0x69
,
0x74
,
0x4f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x18
,
0x02
,
0x20
,
0x01
,
0x28
,
0x0b
,
0x32
,
0x11
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
...
...
@@ -1219,74 +1273,84 @@ var file_exchange_proto_rawDesc = []byte{
0x1e
,
0x0a
,
0x0a
,
0x75
,
0x70
,
0x64
,
0x61
,
0x74
,
0x65
,
0x54
,
0x69
,
0x6d
,
0x65
,
0x18
,
0x0a
,
0x20
,
0x01
,
0x28
,
0x03
,
0x52
,
0x0a
,
0x75
,
0x70
,
0x64
,
0x61
,
0x74
,
0x65
,
0x54
,
0x69
,
0x6d
,
0x65
,
0x12
,
0x14
,
0x0a
,
0x05
,
0x69
,
0x6e
,
0x64
,
0x65
,
0x78
,
0x18
,
0x0b
,
0x20
,
0x01
,
0x28
,
0x03
,
0x52
,
0x05
,
0x69
,
0x6e
,
0x64
,
0x65
,
0x78
,
0x42
,
0x07
,
0x0a
,
0x05
,
0x76
,
0x61
,
0x6c
,
0x75
,
0x65
,
0x22
,
0xb2
,
0x01
,
0x0a
,
0x10
,
0x51
,
0x75
,
0x65
,
0x72
,
0x79
,
0x4d
,
0x61
,
0x72
,
0x6b
,
0x65
,
0x74
,
0x44
,
0x65
,
0x70
,
0x74
,
0x68
,
0x12
,
0x2a
,
0x0a
,
0x09
,
0x6c
,
0x65
,
0x66
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x18
,
0x01
,
0x20
,
0x01
,
0x28
,
0x0b
,
0x32
,
0x0c
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x61
,
0x73
,
0x73
,
0x65
,
0x74
,
0x52
,
0x09
,
0x6c
,
0x65
,
0x66
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x12
,
0x2c
,
0x0a
,
0x0a
,
0x72
,
0x69
,
0x67
,
0x68
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x18
,
0x02
,
0x20
,
0x01
,
0x28
,
0x0b
,
0x32
,
0x0c
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x61
,
0x73
,
0x73
,
0x65
,
0x74
,
0x52
,
0x0a
,
0x72
,
0x69
,
0x67
,
0x68
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x12
,
0x0e
,
0x0a
,
0x02
,
0x6f
,
0x70
,
0x18
,
0x03
,
0x20
,
0x01
,
0x28
,
0x05
,
0x52
,
0x02
,
0x6f
,
0x70
,
0x12
,
0x1e
,
0x0a
,
0x0a
,
0x70
,
0x72
,
0x69
,
0x6d
,
0x61
,
0x72
,
0x79
,
0x4b
,
0x65
,
0x79
,
0x18
,
0x04
,
0x20
,
0x01
,
0x28
,
0x69
,
0x6e
,
0x64
,
0x65
,
0x78
,
0x12
,
0x12
,
0x0a
,
0x04
,
0x72
,
0x61
,
0x74
,
0x65
,
0x18
,
0x0c
,
0x20
,
0x01
,
0x28
,
0x05
,
0x52
,
0x04
,
0x72
,
0x61
,
0x74
,
0x65
,
0x12
,
0x20
,
0x0a
,
0x0b
,
0x64
,
0x69
,
0x67
,
0x65
,
0x73
,
0x74
,
0x65
,
0x64
,
0x46
,
0x65
,
0x65
,
0x18
,
0x0d
,
0x20
,
0x01
,
0x28
,
0x03
,
0x52
,
0x0b
,
0x64
,
0x69
,
0x67
,
0x65
,
0x73
,
0x74
,
0x65
,
0x64
,
0x46
,
0x65
,
0x65
,
0x12
,
0x16
,
0x0a
,
0x06
,
0x6d
,
0x69
,
0x6e
,
0x46
,
0x65
,
0x65
,
0x18
,
0x0e
,
0x20
,
0x01
,
0x28
,
0x03
,
0x52
,
0x06
,
0x6d
,
0x69
,
0x6e
,
0x46
,
0x65
,
0x65
,
0x12
,
0x12
,
0x0a
,
0x04
,
0x68
,
0x61
,
0x73
,
0x68
,
0x18
,
0x0f
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x04
,
0x68
,
0x61
,
0x73
,
0x68
,
0x12
,
0x1e
,
0x0a
,
0x0a
,
0x72
,
0x65
,
0x76
,
0x6f
,
0x6b
,
0x65
,
0x48
,
0x61
,
0x73
,
0x68
,
0x18
,
0x10
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x0a
,
0x72
,
0x65
,
0x76
,
0x6f
,
0x6b
,
0x65
,
0x48
,
0x61
,
0x73
,
0x68
,
0x12
,
0x1e
,
0x0a
,
0x0a
,
0x63
,
0x72
,
0x65
,
0x61
,
0x74
,
0x65
,
0x54
,
0x69
,
0x6d
,
0x65
,
0x18
,
0x11
,
0x20
,
0x01
,
0x28
,
0x03
,
0x52
,
0x0a
,
0x63
,
0x72
,
0x65
,
0x61
,
0x74
,
0x65
,
0x54
,
0x69
,
0x6d
,
0x65
,
0x42
,
0x07
,
0x0a
,
0x05
,
0x76
,
0x61
,
0x6c
,
0x75
,
0x65
,
0x22
,
0xb2
,
0x01
,
0x0a
,
0x10
,
0x51
,
0x75
,
0x65
,
0x72
,
0x79
,
0x4d
,
0x61
,
0x72
,
0x6b
,
0x65
,
0x74
,
0x44
,
0x65
,
0x70
,
0x74
,
0x68
,
0x12
,
0x2a
,
0x0a
,
0x09
,
0x6c
,
0x65
,
0x66
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x18
,
0x01
,
0x20
,
0x01
,
0x28
,
0x0b
,
0x32
,
0x0c
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x61
,
0x73
,
0x73
,
0x65
,
0x74
,
0x52
,
0x09
,
0x6c
,
0x65
,
0x66
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x12
,
0x2c
,
0x0a
,
0x0a
,
0x72
,
0x69
,
0x67
,
0x68
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x18
,
0x02
,
0x20
,
0x01
,
0x28
,
0x0b
,
0x32
,
0x0c
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x61
,
0x73
,
0x73
,
0x65
,
0x74
,
0x52
,
0x0a
,
0x72
,
0x69
,
0x67
,
0x68
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x12
,
0x0e
,
0x0a
,
0x02
,
0x6f
,
0x70
,
0x18
,
0x03
,
0x20
,
0x01
,
0x28
,
0x05
,
0x52
,
0x02
,
0x6f
,
0x70
,
0x12
,
0x1e
,
0x0a
,
0x0a
,
0x70
,
0x72
,
0x69
,
0x6d
,
0x61
,
0x72
,
0x79
,
0x4b
,
0x65
,
0x79
,
0x18
,
0x04
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x0a
,
0x70
,
0x72
,
0x69
,
0x6d
,
0x61
,
0x72
,
0x79
,
0x4b
,
0x65
,
0x79
,
0x12
,
0x14
,
0x0a
,
0x05
,
0x63
,
0x6f
,
0x75
,
0x6e
,
0x74
,
0x18
,
0x05
,
0x20
,
0x01
,
0x28
,
0x05
,
0x52
,
0x05
,
0x63
,
0x6f
,
0x75
,
0x6e
,
0x74
,
0x22
,
0xa5
,
0x01
,
0x0a
,
0x0b
,
0x4d
,
0x61
,
0x72
,
0x6b
,
0x65
,
0x74
,
0x44
,
0x65
,
0x70
,
0x74
,
0x68
,
0x12
,
0x2a
,
0x0a
,
0x09
,
0x6c
,
0x65
,
0x66
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x18
,
0x01
,
0x20
,
0x01
,
0x28
,
0x0b
,
0x32
,
0x0c
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x61
,
0x73
,
0x73
,
0x65
,
0x74
,
0x52
,
0x09
,
0x6c
,
0x65
,
0x66
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x12
,
0x2c
,
0x0a
,
0x0a
,
0x72
,
0x69
,
0x67
,
0x68
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x18
,
0x02
,
0x20
,
0x01
,
0x28
,
0x0b
,
0x32
,
0x0c
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x61
,
0x73
,
0x73
,
0x65
,
0x74
,
0x52
,
0x0a
,
0x72
,
0x69
,
0x67
,
0x68
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x12
,
0x14
,
0x0a
,
0x05
,
0x70
,
0x72
,
0x69
,
0x63
,
0x65
,
0x18
,
0x03
,
0x20
,
0x01
,
0x28
,
0x03
,
0x52
,
0x05
,
0x70
,
0x72
,
0x69
,
0x63
,
0x65
,
0x12
,
0x16
,
0x0a
,
0x06
,
0x61
,
0x6d
,
0x6f
,
0x75
,
0x6e
,
0x74
,
0x18
,
0x04
,
0x20
,
0x01
,
0x28
,
0x03
,
0x52
,
0x06
,
0x61
,
0x6d
,
0x6f
,
0x75
,
0x6e
,
0x74
,
0x12
,
0x0e
,
0x0a
,
0x02
,
0x6f
,
0x70
,
0x18
,
0x05
,
0x20
,
0x01
,
0x28
,
0x05
,
0x52
,
0x02
,
0x6f
,
0x70
,
0x22
,
0x59
,
0x0a
,
0x0f
,
0x4d
,
0x61
,
0x72
,
0x6b
,
0x65
,
0x74
,
0x44
,
0x65
,
0x70
,
0x74
,
0x68
,
0x4c
,
0x69
,
0x73
,
0x74
,
0x12
,
0x26
,
0x0a
,
0x04
,
0x6c
,
0x69
,
0x73
,
0x74
,
0x18
,
0x01
,
0x20
,
0x03
,
0x28
,
0x0b
,
0x32
,
0x12
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x4d
,
0x61
,
0x72
,
0x6b
,
0x65
,
0x74
,
0x44
,
0x65
,
0x70
,
0x74
,
0x68
,
0x52
,
0x04
,
0x6c
,
0x69
,
0x73
,
0x74
,
0x12
,
0x1e
,
0x0a
,
0x0a
,
0x70
,
0x72
,
0x69
,
0x6d
,
0x61
,
0x72
,
0x79
,
0x4b
,
0x65
,
0x79
,
0x18
,
0x02
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x0a
,
0x70
,
0x72
,
0x69
,
0x6d
,
0x61
,
0x72
,
0x79
,
0x4b
,
0x65
,
0x79
,
0x22
,
0xc5
,
0x01
,
0x0a
,
0x15
,
0x51
,
0x75
,
0x65
,
0x72
,
0x79
,
0x48
,
0x69
,
0x73
,
0x74
,
0x6f
,
0x72
,
0x79
,
0x4f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x4c
,
0x69
,
0x73
,
0x74
,
0x12
,
0x2a
,
0x0a
,
0x09
,
0x6c
,
0x65
,
0x66
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x18
,
0x01
,
0x20
,
0x01
,
0x28
,
0x0b
,
0x32
,
0x0c
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x61
,
0x73
,
0x73
,
0x65
,
0x74
,
0x52
,
0x09
,
0x6c
,
0x65
,
0x66
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x12
,
0x2c
,
0x0a
,
0x0a
,
0x72
,
0x69
,
0x67
,
0x68
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x18
,
0x02
,
0x20
,
0x01
,
0x28
,
0x0b
,
0x32
,
0x0c
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x61
,
0x73
,
0x73
,
0x65
,
0x74
,
0x52
,
0x0a
,
0x72
,
0x69
,
0x67
,
0x68
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x12
,
0x1e
,
0x0a
,
0x0a
,
0x70
,
0x72
,
0x69
,
0x6d
,
0x61
,
0x72
,
0x79
,
0x4b
,
0x65
,
0x79
,
0x18
,
0x03
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x0a
,
0x70
,
0x72
,
0x69
,
0x6d
,
0x61
,
0x72
,
0x79
,
0x4b
,
0x65
,
0x79
,
0x12
,
0x14
,
0x0a
,
0x05
,
0x63
,
0x6f
,
0x75
,
0x6e
,
0x74
,
0x18
,
0x04
,
0x20
,
0x01
,
0x28
,
0x05
,
0x52
,
0x05
,
0x63
,
0x6f
,
0x75
,
0x6e
,
0x74
,
0x12
,
0x1c
,
0x0a
,
0x09
,
0x64
,
0x69
,
0x72
,
0x65
,
0x63
,
0x74
,
0x69
,
0x6f
,
0x6e
,
0x18
,
0x05
,
0x20
,
0x01
,
0x28
,
0x05
,
0x52
,
0x09
,
0x64
,
0x69
,
0x72
,
0x65
,
0x63
,
0x74
,
0x69
,
0x6f
,
0x6e
,
0x22
,
0x26
,
0x0a
,
0x0a
,
0x51
,
0x75
,
0x65
,
0x72
,
0x79
,
0x4f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x12
,
0x18
,
0x0a
,
0x07
,
0x6f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x49
,
0x44
,
0x18
,
0x01
,
0x20
,
0x01
,
0x28
,
0x03
,
0x52
,
0x07
,
0x6f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x49
,
0x44
,
0x22
,
0x96
,
0x01
,
0x0a
,
0x0e
,
0x51
,
0x75
,
0x65
,
0x72
,
0x79
,
0x4f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x4c
,
0x69
,
0x73
,
0x74
,
0x12
,
0x16
,
0x0a
,
0x06
,
0x73
,
0x74
,
0x61
,
0x74
,
0x75
,
0x73
,
0x18
,
0x01
,
0x20
,
0x01
,
0x28
,
0x05
,
0x52
,
0x06
,
0x73
,
0x74
,
0x61
,
0x74
,
0x75
,
0x73
,
0x12
,
0x18
,
0x0a
,
0x07
,
0x61
,
0x64
,
0x64
,
0x72
,
0x65
,
0x73
,
0x73
,
0x18
,
0x02
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x07
,
0x61
,
0x64
,
0x64
,
0x72
,
0x65
,
0x73
,
0x73
,
0x12
,
0x1e
,
0x0a
,
0x0a
,
0x70
,
0x72
,
0x69
,
0x6d
,
0x61
,
0x72
,
0x79
,
0x4b
,
0x65
,
0x79
,
0x18
,
0x03
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x0a
,
0x70
,
0x72
,
0x69
,
0x6d
,
0x61
,
0x72
,
0x79
,
0x4b
,
0x65
,
0x79
,
0x12
,
0x14
,
0x0a
,
0x05
,
0x63
,
0x6f
,
0x75
,
0x6e
,
0x74
,
0x18
,
0x05
,
0x20
,
0x01
,
0x28
,
0x05
,
0x52
,
0x05
,
0x63
,
0x6f
,
0x75
,
0x6e
,
0x74
,
0x22
,
0xa5
,
0x01
,
0x0a
,
0x0b
,
0x4d
,
0x61
,
0x72
,
0x6b
,
0x65
,
0x74
,
0x44
,
0x65
,
0x70
,
0x74
,
0x68
,
0x12
,
0x2a
,
0x0a
,
0x09
,
0x6c
,
0x65
,
0x66
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x18
,
0x01
,
0x20
,
0x01
,
0x28
,
0x0b
,
0x32
,
0x0c
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x61
,
0x73
,
0x73
,
0x65
,
0x74
,
0x52
,
0x09
,
0x6c
,
0x65
,
0x66
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x12
,
0x2c
,
0x0a
,
0x0a
,
0x72
,
0x69
,
0x67
,
0x68
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x18
,
0x02
,
0x20
,
0x01
,
0x28
,
0x0b
,
0x32
,
0x0c
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x61
,
0x73
,
0x73
,
0x65
,
0x74
,
0x52
,
0x0a
,
0x72
,
0x69
,
0x67
,
0x68
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x12
,
0x14
,
0x0a
,
0x05
,
0x70
,
0x72
,
0x69
,
0x63
,
0x65
,
0x18
,
0x03
,
0x20
,
0x01
,
0x28
,
0x03
,
0x52
,
0x05
,
0x70
,
0x72
,
0x69
,
0x63
,
0x65
,
0x12
,
0x16
,
0x0a
,
0x06
,
0x61
,
0x6d
,
0x6f
,
0x75
,
0x6e
,
0x74
,
0x18
,
0x04
,
0x20
,
0x01
,
0x28
,
0x03
,
0x52
,
0x06
,
0x61
,
0x6d
,
0x6f
,
0x75
,
0x6e
,
0x74
,
0x12
,
0x0e
,
0x0a
,
0x02
,
0x6f
,
0x70
,
0x18
,
0x05
,
0x20
,
0x01
,
0x28
,
0x05
,
0x52
,
0x02
,
0x6f
,
0x70
,
0x22
,
0x59
,
0x0a
,
0x0f
,
0x4d
,
0x61
,
0x72
,
0x6b
,
0x65
,
0x74
,
0x44
,
0x65
,
0x70
,
0x74
,
0x68
,
0x4c
,
0x69
,
0x73
,
0x74
,
0x12
,
0x26
,
0x0a
,
0x04
,
0x6c
,
0x69
,
0x73
,
0x74
,
0x18
,
0x01
,
0x20
,
0x03
,
0x28
,
0x0b
,
0x32
,
0x12
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x4d
,
0x61
,
0x72
,
0x6b
,
0x65
,
0x74
,
0x44
,
0x65
,
0x70
,
0x74
,
0x68
,
0x52
,
0x04
,
0x6c
,
0x69
,
0x73
,
0x74
,
0x12
,
0x1e
,
0x0a
,
0x0a
,
0x70
,
0x72
,
0x69
,
0x6d
,
0x61
,
0x72
,
0x79
,
0x4b
,
0x65
,
0x79
,
0x18
,
0x02
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x0a
,
0x70
,
0x72
,
0x69
,
0x6d
,
0x61
,
0x72
,
0x79
,
0x4b
,
0x65
,
0x79
,
0x22
,
0xc5
,
0x01
,
0x0a
,
0x15
,
0x51
,
0x75
,
0x65
,
0x72
,
0x79
,
0x48
,
0x69
,
0x73
,
0x74
,
0x6f
,
0x72
,
0x79
,
0x4f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x4c
,
0x69
,
0x73
,
0x74
,
0x12
,
0x2a
,
0x0a
,
0x09
,
0x6c
,
0x65
,
0x66
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x18
,
0x01
,
0x20
,
0x01
,
0x28
,
0x0b
,
0x32
,
0x0c
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x61
,
0x73
,
0x73
,
0x65
,
0x74
,
0x52
,
0x09
,
0x6c
,
0x65
,
0x66
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x12
,
0x2c
,
0x0a
,
0x0a
,
0x72
,
0x69
,
0x67
,
0x68
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x18
,
0x02
,
0x20
,
0x01
,
0x28
,
0x0b
,
0x32
,
0x0c
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x61
,
0x73
,
0x73
,
0x65
,
0x74
,
0x52
,
0x0a
,
0x72
,
0x69
,
0x67
,
0x68
,
0x74
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x12
,
0x1e
,
0x0a
,
0x0a
,
0x70
,
0x72
,
0x69
,
0x6d
,
0x61
,
0x72
,
0x79
,
0x4b
,
0x65
,
0x79
,
0x18
,
0x03
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x0a
,
0x70
,
0x72
,
0x69
,
0x6d
,
0x61
,
0x72
,
0x79
,
0x4b
,
0x65
,
0x79
,
0x12
,
0x14
,
0x0a
,
0x05
,
0x63
,
0x6f
,
0x75
,
0x6e
,
0x74
,
0x18
,
0x04
,
0x20
,
0x01
,
0x28
,
0x05
,
0x52
,
0x05
,
0x63
,
0x6f
,
0x75
,
0x6e
,
0x74
,
0x12
,
0x1c
,
0x0a
,
0x09
,
0x64
,
0x69
,
0x72
,
0x65
,
0x63
,
0x74
,
0x69
,
0x6f
,
0x6e
,
0x18
,
0x05
,
0x20
,
0x01
,
0x28
,
0x05
,
0x52
,
0x09
,
0x64
,
0x69
,
0x72
,
0x65
,
0x63
,
0x74
,
0x69
,
0x6f
,
0x6e
,
0x22
,
0x26
,
0x0a
,
0x0a
,
0x51
,
0x75
,
0x65
,
0x72
,
0x79
,
0x4f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x12
,
0x18
,
0x0a
,
0x07
,
0x6f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x49
,
0x44
,
0x18
,
0x01
,
0x20
,
0x01
,
0x28
,
0x03
,
0x52
,
0x07
,
0x6f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x49
,
0x44
,
0x22
,
0x96
,
0x01
,
0x0a
,
0x0e
,
0x51
,
0x75
,
0x65
,
0x72
,
0x79
,
0x4f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x4c
,
0x69
,
0x73
,
0x74
,
0x12
,
0x16
,
0x0a
,
0x06
,
0x73
,
0x74
,
0x61
,
0x74
,
0x75
,
0x73
,
0x18
,
0x01
,
0x20
,
0x01
,
0x28
,
0x05
,
0x52
,
0x06
,
0x73
,
0x74
,
0x61
,
0x74
,
0x75
,
0x73
,
0x12
,
0x18
,
0x0a
,
0x07
,
0x61
,
0x64
,
0x64
,
0x72
,
0x65
,
0x73
,
0x73
,
0x18
,
0x02
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x07
,
0x61
,
0x64
,
0x64
,
0x72
,
0x65
,
0x73
,
0x73
,
0x12
,
0x1e
,
0x0a
,
0x0a
,
0x70
,
0x72
,
0x69
,
0x6d
,
0x61
,
0x72
,
0x79
,
0x4b
,
0x65
,
0x79
,
0x18
,
0x03
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x0a
,
0x70
,
0x72
,
0x69
,
0x6d
,
0x61
,
0x72
,
0x79
,
0x4b
,
0x65
,
0x79
,
0x12
,
0x14
,
0x0a
,
0x05
,
0x63
,
0x6f
,
0x75
,
0x6e
,
0x74
,
0x18
,
0x04
,
0x20
,
0x01
,
0x28
,
0x05
,
0x52
,
0x05
,
0x63
,
0x6f
,
0x75
,
0x6e
,
0x74
,
0x12
,
0x1c
,
0x0a
,
0x09
,
0x64
,
0x69
,
0x72
,
0x65
,
0x63
,
0x74
,
0x69
,
0x6f
,
0x6e
,
0x18
,
0x05
,
0x20
,
0x01
,
0x28
,
0x05
,
0x52
,
0x09
,
0x64
,
0x69
,
0x72
,
0x65
,
0x63
,
0x74
,
0x69
,
0x6f
,
0x6e
,
0x22
,
0x4d
,
0x0a
,
0x09
,
0x4f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x4c
,
0x69
,
0x73
,
0x74
,
0x12
,
0x20
,
0x0a
,
0x04
,
0x6c
,
0x69
,
0x73
,
0x74
,
0x18
,
0x01
,
0x20
,
0x03
,
0x28
,
0x0b
,
0x32
,
0x0c
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x4f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x52
,
0x04
,
0x6c
,
0x69
,
0x73
,
0x74
,
0x12
,
0x1e
,
0x0a
,
0x0a
,
0x70
,
0x72
,
0x69
,
0x6d
,
0x61
,
0x72
,
0x79
,
0x4b
,
0x65
,
0x79
,
0x18
,
0x02
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x0a
,
0x70
,
0x72
,
0x69
,
0x6d
,
0x61
,
0x72
,
0x79
,
0x4b
,
0x65
,
0x79
,
0x22
,
0x7b
,
0x0a
,
0x0f
,
0x52
,
0x65
,
0x63
,
0x65
,
0x69
,
0x70
,
0x74
,
0x45
,
0x78
,
0x63
,
0x68
,
0x61
,
0x6e
,
0x67
,
0x65
,
0x12
,
0x22
,
0x0a
,
0x05
,
0x6f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x18
,
0x01
,
0x20
,
0x01
,
0x28
,
0x0b
,
0x32
,
0x0c
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x4f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x52
,
0x05
,
0x6f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x12
,
0x2e
,
0x0a
,
0x0b
,
0x6d
,
0x61
,
0x74
,
0x63
,
0x68
,
0x4f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x73
,
0x18
,
0x02
,
0x20
,
0x03
,
0x28
,
0x0b
,
0x32
,
0x0c
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x4f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x52
,
0x0b
,
0x6d
,
0x61
,
0x74
,
0x63
,
0x68
,
0x4f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x73
,
0x12
,
0x14
,
0x0a
,
0x05
,
0x69
,
0x6e
,
0x64
,
0x65
,
0x78
,
0x18
,
0x03
,
0x20
,
0x01
,
0x28
,
0x03
,
0x52
,
0x05
,
0x69
,
0x6e
,
0x64
,
0x65
,
0x78
,
0x32
,
0x0a
,
0x0a
,
0x08
,
0x65
,
0x78
,
0x63
,
0x68
,
0x61
,
0x6e
,
0x67
,
0x65
,
0x42
,
0x0a
,
0x5a
,
0x08
,
0x2e
,
0x2e
,
0x2f
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x62
,
0x06
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x33
,
0x05
,
0x63
,
0x6f
,
0x75
,
0x6e
,
0x74
,
0x18
,
0x04
,
0x20
,
0x01
,
0x28
,
0x05
,
0x52
,
0x05
,
0x63
,
0x6f
,
0x75
,
0x6e
,
0x74
,
0x12
,
0x1c
,
0x0a
,
0x09
,
0x64
,
0x69
,
0x72
,
0x65
,
0x63
,
0x74
,
0x69
,
0x6f
,
0x6e
,
0x18
,
0x05
,
0x20
,
0x01
,
0x28
,
0x05
,
0x52
,
0x09
,
0x64
,
0x69
,
0x72
,
0x65
,
0x63
,
0x74
,
0x69
,
0x6f
,
0x6e
,
0x22
,
0x4d
,
0x0a
,
0x09
,
0x4f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x4c
,
0x69
,
0x73
,
0x74
,
0x12
,
0x20
,
0x0a
,
0x04
,
0x6c
,
0x69
,
0x73
,
0x74
,
0x18
,
0x01
,
0x20
,
0x03
,
0x28
,
0x0b
,
0x32
,
0x0c
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x4f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x52
,
0x04
,
0x6c
,
0x69
,
0x73
,
0x74
,
0x12
,
0x1e
,
0x0a
,
0x0a
,
0x70
,
0x72
,
0x69
,
0x6d
,
0x61
,
0x72
,
0x79
,
0x4b
,
0x65
,
0x79
,
0x18
,
0x02
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x0a
,
0x70
,
0x72
,
0x69
,
0x6d
,
0x61
,
0x72
,
0x79
,
0x4b
,
0x65
,
0x79
,
0x22
,
0x7b
,
0x0a
,
0x0f
,
0x52
,
0x65
,
0x63
,
0x65
,
0x69
,
0x70
,
0x74
,
0x45
,
0x78
,
0x63
,
0x68
,
0x61
,
0x6e
,
0x67
,
0x65
,
0x12
,
0x22
,
0x0a
,
0x05
,
0x6f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x18
,
0x01
,
0x20
,
0x01
,
0x28
,
0x0b
,
0x32
,
0x0c
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x4f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x52
,
0x05
,
0x6f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x12
,
0x2e
,
0x0a
,
0x0b
,
0x6d
,
0x61
,
0x74
,
0x63
,
0x68
,
0x4f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x73
,
0x18
,
0x02
,
0x20
,
0x03
,
0x28
,
0x0b
,
0x32
,
0x0c
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x4f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x52
,
0x0b
,
0x6d
,
0x61
,
0x74
,
0x63
,
0x68
,
0x4f
,
0x72
,
0x64
,
0x65
,
0x72
,
0x73
,
0x12
,
0x14
,
0x0a
,
0x05
,
0x69
,
0x6e
,
0x64
,
0x65
,
0x78
,
0x18
,
0x03
,
0x20
,
0x01
,
0x28
,
0x03
,
0x52
,
0x05
,
0x69
,
0x6e
,
0x64
,
0x65
,
0x78
,
0x32
,
0x0a
,
0x0a
,
0x08
,
0x65
,
0x78
,
0x63
,
0x68
,
0x61
,
0x6e
,
0x67
,
0x65
,
0x42
,
0x0a
,
0x5a
,
0x08
,
0x2e
,
0x2e
,
0x2f
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x62
,
0x06
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x33
,
}
var
(
...
...
plugin/dapp/exchange/types/exchangecfg.go
0 → 100644
View file @
c7422357
package
types
var
cfgstring
=
`
# Title为local,表示此配置文件为本地单节点的配置。此时本地节点所在的链上只有这一个节点,共识模块一般采用solo模式。
Title="local"
TestNet=true
FixTime=false
[crypto]
[log]
# 日志级别,支持debug(dbug)/info/warn/error(eror)/crit
loglevel = "info"
logConsoleLevel = "info"
# 日志文件名,可带目录,所有生成的日志文件都放到此目录下
logFile = "logs/chain33.log"
# 单个日志文件的最大值(单位:兆)
maxFileSize = 300
# 最多保存的历史日志文件个数
maxBackups = 100
# 最多保存的历史日志消息(单位:天)
maxAge = 28
# 日志文件名是否使用本地时间(否则使用UTC时间)
localTime = true
# 历史日志文件是否压缩(压缩格式为gz)
compress = true
# 是否打印调用源文件和行号
callerFile = false
# 是否打印调用方法
callerFunction = false
[blockchain]
# 缓存区块的个数
defCacheSize=128
# 同步区块时一次最多申请获取的区块个数
maxFetchBlockNum=128
# 向对端节点请求同步区块的时间间隔
timeoutSeconds=5
# 使用的数据库类型
driver="leveldb"
# 数据库文件目录
dbPath="datadir"
# 数据库缓存大小
dbCache=64
# 是否为单节点
singleMode=true
# 同步区块批量写数据库时,是否需要立即写磁盘,非固态硬盘的电脑可以设置为false,以提高性能
batchsync=false
# 是否记录添加或者删除区块的序列,若节点作为主链节点,为平行链节点提供服务,需要设置为true
isRecordBlockSequence=true
# 是否为平行链节点
isParaChain=false
# 是否开启交易快速查询索引
enableTxQuickIndex=false
[p2p]
types=["dht"]
msgCacheSize=10240
driver="leveldb"
dbPath="datadir/addrbook"
dbCache=4
grpcLogFile="grpc33.log"
[rpc]
# jrpc绑定地址
jrpcBindAddr="localhost:8801"
# grpc绑定地址
grpcBindAddr="localhost:8802"
# 白名单列表,允许访问的IP地址,默认是“*”,允许所有IP访问
whitelist=["127.0.0.1"]
# jrpc方法请求白名单,默认是“*”,允许访问所有RPC方法
jrpcFuncWhitelist=["*"]
# jrpc方法请求黑名单,禁止调用黑名单里配置的rpc方法,一般和白名单配合使用,默认是空
# jrpcFuncBlacklist=["xxxx"]
# grpc方法请求白名单,默认是“*”,允许访问所有RPC方法
grpcFuncWhitelist=["*"]
# grpc方法请求黑名单,禁止调用黑名单里配置的rpc方法,一般和白名单配合使用,默认是空
# grpcFuncBlacklist=["xxx"]
# 是否开启https
enableTLS=false
# 证书文件,证书和私钥文件可以用cli工具生成
certFile="cert.pem"
# 私钥文件
keyFile="key.pem"
[mempool]
# mempool队列名称,可配,timeline,score,price
name="timeline"
# mempool缓存容量大小,默认10240
poolCacheSize=10240
# 最小得交易手续费用,这个没有默认值,必填,一般是100000
minTxFee=100000
# 每个账户在mempool中得最大交易数量,默认100
maxTxNumPerAccount=10000
# timeline 是默认的先来先进的按时间排序
[mempool.sub.timeline]
# mempool缓存容量大小,默认10240
poolCacheSize=10240
# 最小得交易手续费用,这个没有默认值,必填,一般是100000
minTxFee=100000
# 每个账户在mempool中得最大交易数量,默认100
maxTxNumPerAccount=10000
# score是分数队列模式(分数=常量a*手续费/交易字节数-常量b*时间*定量c,按分数排队,高的优先,常量a,b和定量c可配置),按分数来排序
[mempool.sub.score]
# mempool缓存容量大小,默认10240
poolCacheSize=10240
# 最小得交易手续费用,这个没有默认值,必填,一般是100000
minTxFee=100000
# 每个账户在mempool中得最大交易数量,默认100
maxTxNumPerAccount=10000
# 时间占价格比例
timeParam=1
# 手续费相对于时间的一个合适的常量,取当前unix时间戳前四位数,排队时手续费高1e-5的分数~=快1s的分数
priceConstant=1544
# 常量比例
pricePower=1
# price是价格队列模式(价格=手续费/交易字节数,价格高者优先,同价则时间早优先)
[mempool.sub.price]
# mempool缓存容量大小,默认10240
poolCacheSize=10240
# 最小得交易手续费用,这个没有默认值,必填,一般是100000
minTxFee=100000
# 每个账户在mempool中得最大交易数量,默认100
maxTxNumPerAccount=10000
[consensus]
#共识名,可选项有solo,ticket,raft,tendermint,para
name="solo"
#是否开启挖矿,开启挖矿才能创建区块
minerstart=true
#创世区块时间(UTC时间)
genesisBlockTime=1514533394
#创世交易地址
genesis="1McRuWgLN7daKTFfZyibb5eK769NVgNH22"
[mver.consensus]
#基金账户地址
fundKeyAddr = "1BQXS6TxaYYG5mADaWij4AxhZZUTpw95a5"
#用户回报
coinReward = 18
#发展基金回报
coinDevFund = 12
#ticket价格
ticketPrice = 10000
#挖矿难度
powLimitBits = "0x1f00ffff"
#每次调整难度的最大的范围,如果设置成 4 的话,范围是 (1/4 - 4),一次不能增加 4倍以上的难度,或者难度减少为 原来的 1/4 ,这个参数,是为了难度不会突然爆增加或者减少
retargetAdjustmentFactor = 4
#表示如果区块时间大于当前时间 16s ,那么区块就会判定为无效区块。
futureBlockTime = 16
#ticket冻结时长
ticketFrozenTime = 5 #5s only for test
ticketWithdrawTime = 10 #10s only for test
ticketMinerWaitTime = 2 #2s only for test
#区块包含最多交易数
maxTxNumber = 1600 #160
#调整挖矿难度的间隔,(ps:难度不是每个区块都调整的,而是每隔 targetTimespan / targetTimePerBlock 块调整一次)
targetTimespan = 2304
#每个区块打包的目标时间
targetTimePerBlock = 16
# 仅保留这一项,其他consensus相关的配置全部删除
[consensus.sub.solo]
#创世交易地址
genesis="1McRuWgLN7daKTFfZyibb5eK769NVgNH22"
#创世区块时间(UTC时间)
genesisBlockTime=1514533394
#获取交易间隔时长,单位纳秒
waitTxMs=10
[store]
# 数据存储格式名称,目前支持mavl,kvdb,kvmvcc,mpt
name="mavl"
# 数据存储驱动类别,目前支持leveldb,goleveldb,memdb,gobadgerdb,ssdb,pegasus
driver="leveldb"
# 数据文件存储路径
dbPath="datadir/mavltree"
# Cache大小
dbCache=128
# 数据库版本
localdbVersion="1.0.0"
[store.sub.mavl]
# 是否使能mavl加前缀
enableMavlPrefix=false
# 是否使能MVCC,如果mavl中enableMVCC为true此处必须为true
enableMVCC=false
# 是否使能mavl数据裁剪
enableMavlPrune=false
# 裁剪高度间隔
pruneHeight=10000
[wallet]
# 交易发送最低手续费,单位0.00000001BTY(1e-8),默认100000,即0.001BTY
minFee=100000
# walletdb驱动名,支持leveldb/memdb/gobadgerdb/ssdb/pegasus
driver="leveldb"
# walletdb路径
dbPath="wallet"
# walletdb缓存大小
dbCache=16
# 钱包发送交易签名方式
signType="secp256k1"
[wallet.sub.ticket]
# 是否关闭ticket自动挖矿,默认false
minerdisable=false
# 允许购买ticket挖矿的白名单地址,默认配置“*”,允许所有地址购买
minerwhitelist=["*"]
[exec]
#执行器执行是否免费
isFree=false
#执行器执行所需最小费用,低于Mempool和Wallet设置的MinFee,在minExecFee = 0 的情况下,isFree = true才会生效
minExecFee=100000
#是否开启stat插件
enableStat=false
#是否开启MVCC插件
enableMVCC=false
alias=["token1:token","token2:token","token3:token"]
[exec.sub.token]
#是否保存token交易信息
saveTokenTxList=true
#token审批人地址
tokenApprs = [
"1McRuWgLN7daKTFfZyibb5eK769NVgNH22",
"1Q8hGLfoGe63efeWa8fJ4Pnukhkngt6poK",
"1LY8GFia5EiyoTodMLfkB5PHNNpXRqxhyB",
"1GCzJDS6HbgTQ2emade7mEJGGWFfA15pS9",
"1JYB8sxi4He5pZWHCd3Zi2nypQ4JMB6AxN",
"12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv",
]
[exec.sub.cert]
# 是否启用证书验证和签名
enable=false
# 加密文件路径
cryptoPath="authdir/crypto"
# 带证书签名类型,支持"auth_ecdsa", "auth_sm2"
signType="auth_ecdsa"
[exec.sub.relay]
#relay执行器保存BTC头执行权限地址
genesis="1McRuWgLN7daKTFfZyibb5eK769NVgNH22"
[exec.sub.manage]
#manage执行器超级管理员地址
superManager=[
"1McRuWgLN7daKTFfZyibb5eK769NVgNH22",
"12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv",
"1Q8hGLfoGe63efeWa8fJ4Pnukhkngt6poK"
]
[metrics]
#是否使能发送metrics数据的发送
enableMetrics=false
#数据保存模式
dataEmitMode="influxdb"
[metrics.sub.influxdb]
#以纳秒为单位的发送间隔
duration=1000000000
url="http://influxdb:8086"
database="chain33metrics"
username=""
password=""
namespace=""
[mver.exec.sub.exchange]
banks = [
"1PTGVR7TUm1MJUH7M1UNcKBGMvfJ7nCrnN"
]
coins = [
{name = "BTY", rate = 100000, minFee = 1000000},
{name = "USDT", rate = 100000, minFee = 1000000},
{name = "bty", rate = 100000, minFee = 1000000},
{name = "CCNY", rate = 100000, minFee = 1000000},
]
#[mver.exec.sub.exchange.ForkParamV1]
#banks = [
# "1PTGVR7TUm1MJUH7M1UNcKBGMvfJ7nCrnN"
#]
#coins = [
# {name = "BTY", rate = 100000, minFee = 1000000},
# {name = "USDT", rate = 100000, minFee = 1000000},
#]
[fork.sub.exchange]
Enable=0
#ForkParamV1=1
`
//GetDefaultCfgstring ...
func
GetDefaultCfgstring
()
string
{
return
cfgstring
}
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