Commit c7422357 authored by cxb's avatar cxb

update exchange

parent 7fe229ce
......@@ -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=
......
......@@ -22,7 +22,7 @@ QueryOrderList|根据用户地址和订单状态(ordered,completed,revoked),
序号|规则
---|----
1|买家获利得原则
1|以市场价成交
2|买单高于市场价,按价格由低往高撮合
3|卖单低于市场价,按价格由高往低进行撮合
4|价格相同按先进先出的原则进行撮合
......
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)
}
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
}
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)
}
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
}
......@@ -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, 85*types.DefaultCoinPrecision, acc.Balance)
assert.Equal(t, 80*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(2750000000), acc.Balance)
//100-5*4-(10-5)*3-5*4-(15-5-5)*4.5 = 22.5
assert.Equal(t, int64(2250000000), 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")
......
This diff is collapsed.
......@@ -5,148 +5,160 @@ option go_package = "../types";
message Exchange {}
message ExchangeAction {
oneof value {
LimitOrder limitOrder = 1;
MarketOrder marketOrder = 2;
RevokeOrder revokeOrder = 3;
}
int32 ty = 6;
oneof value {
LimitOrder limitOrder = 1;
MarketOrder marketOrder = 2;
RevokeOrder revokeOrder = 3;
}
int32 ty = 6;
}
//限价订单
message LimitOrder {
//交易对
asset leftAsset = 1;
//交易对
asset rightAsset = 2;
//价格
int64 price = 3;
//总量
int64 amount = 4;
//操作, 1为买,2为卖
int32 op = 5;
//交易对
asset leftAsset = 1;
//交易对
asset rightAsset = 2;
//价格
int64 price = 3;
//总量
int64 amount = 4;
//操作, 1为买,2为卖
int32 op = 5;
}
//市价委托
message MarketOrder {
//资产1
asset leftAsset = 1;
//资产2
asset rightAsset = 2;
//总量
int64 amount = 3;
//操作, 1为买,2为卖
int32 op = 4;
//资产1
asset leftAsset = 1;
//资产2
asset rightAsset = 2;
//总量
int64 amount = 3;
//操作, 1为买,2为卖
int32 op = 4;
}
//撤回订单
message RevokeOrder {
//订单号
int64 orderID = 1;
//订单号
int64 orderID = 1;
}
//资产类型
message asset {
string execer = 1;
string symbol = 2;
string execer = 1;
string symbol = 2;
}
//订单信息
message Order {
int64 orderID = 1;
oneof value {
LimitOrder limitOrder = 2;
MarketOrder marketOrder = 3;
}
//挂单类型
int32 ty = 4;
//已经成交的数量
int64 executed = 5;
//成交均价
int64 AVG_price = 6;
//余额
int64 balance = 7;
//状态,0 挂单中ordered, 1 完成completed, 2撤回 revoked
int32 status = 8;
//用户地址
string addr = 9;
//更新时间
int64 updateTime = 10;
//索引
int64 index = 11;
int64 orderID = 1;
oneof value {
LimitOrder limitOrder = 2;
MarketOrder marketOrder = 3;
}
//挂单类型
int32 ty = 4;
//已经成交的数量
int64 executed = 5;
//成交均价
int64 AVG_price = 6;
//余额
int64 balance = 7;
//状态,0 挂单中ordered, 1 完成completed, 2撤回 revoked
int32 status = 8;
//用户地址
string addr = 9;
//更新时间
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;
}
//查询接口
message QueryMarketDepth {
//资产1
asset leftAsset = 1;
//资产2
asset rightAsset = 2;
//操作, 1为买,2为卖
int32 op = 3;
// 这里用价格作为索引值
string primaryKey = 4;
//单页返回多少条记录,默认返回10条,为了系统安全最多单次只能返回20条
int32 count = 5;
//资产1
asset leftAsset = 1;
//资产2
asset rightAsset = 2;
//操作, 1为买,2为卖
int32 op = 3;
// 这里用价格作为索引值
string primaryKey = 4;
//单页返回多少条记录,默认返回10条,为了系统安全最多单次只能返回20条
int32 count = 5;
}
//市场深度
message MarketDepth {
//资产1
asset leftAsset = 1;
//资产2
asset rightAsset = 2;
//价格
int64 price = 3;
//总量
int64 amount = 4;
//操作, 1为买,2为卖
int32 op = 5;
//资产1
asset leftAsset = 1;
//资产2
asset rightAsset = 2;
//价格
int64 price = 3;
//总量
int64 amount = 4;
//操作, 1为买,2为卖
int32 op = 5;
}
//查询接口返回的市场深度列表
message MarketDepthList {
repeated MarketDepth list = 1;
string primaryKey = 2;
repeated MarketDepth list = 1;
string primaryKey = 2;
}
//查询最新得成交信息,外部接口
message QueryHistoryOrderList {
//资产1
asset leftAsset = 1;
//资产2
asset rightAsset = 2;
// 索引值
string primaryKey = 3;
//单页返回多少条记录,默认返回10条,为了系统安全最多单次只能返回20条
int32 count = 4;
// 0降序,1升序,默认降序
int32 direction = 5;
//资产1
asset leftAsset = 1;
//资产2
asset rightAsset = 2;
// 索引值
string primaryKey = 3;
//单页返回多少条记录,默认返回10条,为了系统安全最多单次只能返回20条
int32 count = 4;
// 0降序,1升序,默认降序
int32 direction = 5;
}
//根据orderID去查询订单信息
message QueryOrder {
int64 orderID = 1;
int64 orderID = 1;
}
//根据地址,状态查询用户自己的挂单信息
message QueryOrderList {
//挂单状态必填(默认是0,只查询ordered挂单中的)
int32 status = 1;
//用户地址信息,必填
string address = 2;
// 主键索引
string primaryKey = 3;
//单页返回多少条记录,默认返回10条,为了系统安全最多单次只能返回20条
int32 count = 4;
// 0降序,1升序,默认降序
int32 direction = 5;
//挂单状态必填(默认是0,只查询ordered挂单中的)
int32 status = 1;
//用户地址信息,必填
string address = 2;
// 主键索引
string primaryKey = 3;
//单页返回多少条记录,默认返回10条,为了系统安全最多单次只能返回20条
int32 count = 4;
// 0降序,1升序,默认降序
int32 direction = 5;
}
//订单列表
message OrderList {
repeated Order list = 1;
string primaryKey = 2;
repeated Order list = 1;
string primaryKey = 2;
}
// exchange执行票据日志
message ReceiptExchange {
Order order = 1;
repeated Order matchOrders = 2;
int64 index = 3;
Order order = 1;
repeated Order matchOrders = 2;
int64 index = 3;
}
service exchange {}
......@@ -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
......@@ -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{
......
......@@ -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"}
......
......@@ -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,
}
}
......
......@@ -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 {
......
......@@ -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
......
......@@ -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")
)
......@@ -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
}
This diff is collapsed.
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
}
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