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 ...@@ -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/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= 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= 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 h1:XrlmULs3WrRHCJm/isW5WCiH3WlfeFgZHWDY0ZarVTI=
github.com/33cn/chain33 v1.65.6-0.20211025083411-82c4406c6701/go.mod h1:27Z1b54wJ6EhE1IGA3S5AxSQ/t8dktFVgPnkLNbMFoE= 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= 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 ...@@ -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/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.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.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.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI=
github.com/influxdata/influxdb v1.9.5 h1:4O7AC5jOA9RoqtDuD2rysXbumcEwaqWlWXmwuyK+a2s= github.com/influxdata/influxdb v1.9.5 h1:4O7AC5jOA9RoqtDuD2rysXbumcEwaqWlWXmwuyK+a2s=
github.com/influxdata/influxdb v1.9.5/go.mod h1:4uPVvcry9KWQVWLxyT9641qpkRXUBN+xa0MJFFNNLKo= 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 ...@@ -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/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.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.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/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.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk=
github.com/koron/go-ssdp v0.0.2 h1:fL3wAoyT6hXHQlORyXUW4Q23kkQpJRgEAYcZB5BR71o= 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 ...@@ -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.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/pty v1.1.3/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/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.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 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 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 ...@@ -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.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.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.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.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.4/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= 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 ...@@ -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.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.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.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.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 h1:Pq37uLx3hsyNlTDir7FZyU8+cFCTqd5y1KiM2IzOutI=
github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= 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 ...@@ -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.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.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= 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.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM=
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= 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 ...@@ -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/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/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.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.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= 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= ...@@ -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-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-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-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-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-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/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 ...@@ -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.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4/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/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.0.0-20191123233150-4c4803ed55e3/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg=
k8s.io/apimachinery v0.17.5 h1:QAjfgeTtSGksdkgyaPrIb4lhU16FWMIzxKejYD5S0gc= k8s.io/apimachinery v0.17.5 h1:QAjfgeTtSGksdkgyaPrIb4lhU16FWMIzxKejYD5S0gc=
k8s.io/apimachinery v0.17.5/go.mod h1:ioIo1G/a+uONV7Tv+ZmCbMG1/a3kVw5YcDdncd8ugQ0= k8s.io/apimachinery v0.17.5/go.mod h1:ioIo1G/a+uONV7Tv+ZmCbMG1/a3kVw5YcDdncd8ugQ0=
......
...@@ -22,7 +22,7 @@ QueryOrderList|根据用户地址和订单状态(ordered,completed,revoked), ...@@ -22,7 +22,7 @@ QueryOrderList|根据用户地址和订单状态(ordered,completed,revoked),
序号|规则 序号|规则
---|---- ---|----
1|买家获利得原则 1|以市场价成交
2|买单高于市场价,按价格由低往高撮合 2|买单高于市场价,按价格由低往高撮合
3|卖单低于市场价,按价格由高往低进行撮合 3|卖单低于市场价,按价格由高往低进行撮合
4|价格相同按先进先出的原则进行撮合 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 ( ...@@ -39,7 +39,7 @@ var (
func TestExchange(t *testing.T) { func TestExchange(t *testing.T) {
//环境准备 //环境准备
cfg := types.NewChain33Config(types.GetDefaultCfgstring()) cfg := types.NewChain33Config(et.GetDefaultCfgstring())
cfg.SetTitleOnlyForTest("chain33") cfg.SetTitleOnlyForTest("chain33")
Init(et.ExchangeX, cfg, nil) Init(et.ExchangeX, cfg, nil)
total := 100 * types.DefaultCoinPrecision total := 100 * types.DefaultCoinPrecision
...@@ -263,9 +263,9 @@ func TestExchange(t *testing.T) { ...@@ -263,9 +263,9 @@ func TestExchange(t *testing.T) {
order, err = Exec_QueryOrder(orderID7, stateDB, kvdb) order, err = Exec_QueryOrder(orderID7, stateDB, kvdb)
assert.Equal(t, nil, err) assert.Equal(t, nil, err)
assert.Equal(t, int32(et.Ordered), order.Status) assert.Equal(t, int32(et.Ordered), order.Status)
//查看账户余额,按卖方价格成交 //查看账户余额,按被动方买单的价格成交
acc := accD1.LoadExecAccount(Nodes[3], execAddr) 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"}, 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) 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) { ...@@ -298,8 +298,8 @@ func TestExchange(t *testing.T) {
assert.Equal(t, 5*types.DefaultCoinPrecision, order.Balance) assert.Equal(t, 5*types.DefaultCoinPrecision, order.Balance)
//余额检查 //余额检查
acc = accD1.LoadExecAccount(Nodes[3], execAddr) acc = accD1.LoadExecAccount(Nodes[3], execAddr)
// 100-3*10-5*4-4.5*5 = 27.5 //100-5*4-(10-5)*3-5*4-(15-5-5)*4.5 = 22.5
assert.Equal(t, int64(2750000000), acc.Balance) assert.Equal(t, int64(2250000000), acc.Balance)
acc = accC.LoadExecAccount(Nodes[2], execAddr) acc = accC.LoadExecAccount(Nodes[2], execAddr)
assert.Equal(t, 80*types.DefaultCoinPrecision, acc.Balance) assert.Equal(t, 80*types.DefaultCoinPrecision, acc.Balance)
...@@ -316,8 +316,8 @@ func TestExchange(t *testing.T) { ...@@ -316,8 +316,8 @@ func TestExchange(t *testing.T) {
assert.Equal(t, 5*types.DefaultCoinPrecision, orderList.List[0].Balance) assert.Equal(t, 5*types.DefaultCoinPrecision, orderList.List[0].Balance)
//余额检查 //余额检查
acc = accD1.LoadExecAccount(Nodes[3], execAddr) acc = accD1.LoadExecAccount(Nodes[3], execAddr)
// 100-3*10-5*4-1*5 = 45 // Nodes[3]为成交 Nodes[2]冻结10
assert.Equal(t, 45*types.DefaultCoinPrecision, acc.Balance) assert.Equal(t, int64(2250000000), acc.Balance)
acc = accC.LoadExecAccount(Nodes[2], execAddr) acc = accC.LoadExecAccount(Nodes[2], execAddr)
assert.Equal(t, 70*types.DefaultCoinPrecision, acc.Balance) assert.Equal(t, 70*types.DefaultCoinPrecision, acc.Balance)
//orderID9和order10未成交 //orderID9和order10未成交
...@@ -688,7 +688,7 @@ func CreateLimitOrder(limitOrder *et.LimitOrder, privKey string) (tx *types.Tran ...@@ -688,7 +688,7 @@ func CreateLimitOrder(limitOrder *et.LimitOrder, privKey string) (tx *types.Tran
if err != nil { if err != nil {
return nil, err return nil, err
} }
cfg := types.NewChain33Config(types.GetDefaultCfgstring()) cfg := types.NewChain33Config(et.GetDefaultCfgstring())
cfg.SetTitleOnlyForTest("chain33") cfg.SetTitleOnlyForTest("chain33")
tx, err = types.FormatTx(cfg, et.ExchangeX, tx) tx, err = types.FormatTx(cfg, et.ExchangeX, tx)
if err != nil { if err != nil {
...@@ -706,7 +706,7 @@ func CreateRevokeOrder(orderID int64, privKey string) (tx *types.Transaction, er ...@@ -706,7 +706,7 @@ func CreateRevokeOrder(orderID int64, privKey string) (tx *types.Transaction, er
if err != nil { if err != nil {
return nil, err return nil, err
} }
cfg := types.NewChain33Config(types.GetDefaultCfgstring()) cfg := types.NewChain33Config(et.GetDefaultCfgstring())
cfg.SetTitleOnlyForTest("chain33") cfg.SetTitleOnlyForTest("chain33")
tx, err = types.FormatTx(cfg, et.ExchangeX, tx) tx, err = types.FormatTx(cfg, et.ExchangeX, tx)
if err != nil { if err != nil {
...@@ -721,7 +721,7 @@ func CreateRevokeOrder(orderID int64, privKey string) (tx *types.Transaction, er ...@@ -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 { 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") cfg.SetTitleOnlyForTest("chain33")
exec := NewExchange() exec := NewExchange()
q := queue.New("channel") q := queue.New("channel")
...@@ -786,7 +786,7 @@ func Exec_RevokeOrder(t *testing.T, orderID int64, privKey string, stateDB db.DB ...@@ -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) { 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") cfg.SetTitleOnlyForTest("chain33")
exec := NewExchange() exec := NewExchange()
q := queue.New("channel") q := queue.New("channel")
...@@ -803,7 +803,7 @@ func Exec_QueryOrderList(status int32, addr string, primaryKey string, stateDB d ...@@ -803,7 +803,7 @@ func Exec_QueryOrderList(status int32, addr string, primaryKey string, stateDB d
return msg.(*et.OrderList), nil return msg.(*et.OrderList), nil
} }
func Exec_QueryOrder(orderID int64, stateDB db.KV, kvdb db.KVDB) (*et.Order, error) { 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") cfg.SetTitleOnlyForTest("chain33")
exec := NewExchange() exec := NewExchange()
q := queue.New("channel") q := queue.New("channel")
...@@ -821,7 +821,7 @@ func Exec_QueryOrder(orderID int64, stateDB db.KV, kvdb db.KVDB) (*et.Order, err ...@@ -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) { 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") cfg.SetTitleOnlyForTest("chain33")
exec := NewExchange() exec := NewExchange()
q := queue.New("channel") q := queue.New("channel")
...@@ -839,7 +839,7 @@ func Exec_QueryMarketDepth(query *et.QueryMarketDepth, stateDB db.KV, kvdb db.KV ...@@ -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) { 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") cfg.SetTitleOnlyForTest("chain33")
exec := NewExchange() exec := NewExchange()
q := queue.New("channel") q := queue.New("channel")
......
package executor package executor
import ( import (
"encoding/hex"
"fmt" "fmt"
"math/big" "math/big"
"reflect"
"strings"
"github.com/33cn/chain33/account" "github.com/33cn/chain33/account"
"github.com/33cn/chain33/client" "github.com/33cn/chain33/client"
...@@ -30,8 +33,17 @@ type Action struct { ...@@ -30,8 +33,17 @@ type Action struct {
func NewAction(e *exchange, tx *types.Transaction, index int) *Action { func NewAction(e *exchange, tx *types.Transaction, index int) *Action {
hash := tx.Hash() hash := tx.Hash()
fromaddr := tx.From() fromaddr := tx.From()
return &Action{e.GetStateDB(), hash, fromaddr, return &Action{
e.GetBlockTime(), e.GetHeight(), dapp.ExecAddress(string(tx.Execer)), e.GetLocalDB(), index, e.GetAPI()} 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 //GetIndex get index
...@@ -234,6 +246,7 @@ func (a *Action) RevokeOrder(payload *et.RevokeOrder) (*types.Receipt, error) { ...@@ -234,6 +246,7 @@ func (a *Action) RevokeOrder(payload *et.RevokeOrder) (*types.Receipt, error) {
//更新order状态 //更新order状态
order.Status = et.Revoked order.Status = et.Revoked
order.UpdateTime = a.blocktime order.UpdateTime = a.blocktime
order.RevokeHash = hex.EncodeToString(a.txhash)
kvs = append(kvs, a.GetKVSet(order)...) kvs = append(kvs, a.GetKVSet(order)...)
re := &et.ReceiptExchange{ re := &et.ReceiptExchange{
Order: order, Order: order,
...@@ -251,7 +264,6 @@ func (a *Action) RevokeOrder(payload *et.RevokeOrder) (*types.Receipt, error) { ...@@ -251,7 +264,6 @@ func (a *Action) RevokeOrder(payload *et.RevokeOrder) (*types.Receipt, error) {
//1.买单高于市场价,按价格由低往高撮合。 //1.买单高于市场价,按价格由低往高撮合。
//2.卖单低于市场价,按价格由高往低进行撮合。 //2.卖单低于市场价,按价格由高往低进行撮合。
//3.价格相同按先进先出的原则进行撮合 //3.价格相同按先进先出的原则进行撮合
//4.买家获利得原则
func (a *Action) matchLimitOrder(payload *et.LimitOrder, leftAccountDB, rightAccountDB *account.DB) (*types.Receipt, error) { func (a *Action) matchLimitOrder(payload *et.LimitOrder, leftAccountDB, rightAccountDB *account.DB) (*types.Receipt, error) {
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
var kvs []*types.KeyValue var kvs []*types.KeyValue
...@@ -260,6 +272,11 @@ func (a *Action) matchLimitOrder(payload *et.LimitOrder, leftAccountDB, rightAcc ...@@ -260,6 +272,11 @@ func (a *Action) matchLimitOrder(payload *et.LimitOrder, leftAccountDB, rightAcc
var count int var count int
cfg := a.api.GetConfig() 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{ or := &et.Order{
OrderID: a.GetIndex(), OrderID: a.GetIndex(),
Value: &et.Order_LimitOrder{LimitOrder: payload}, Value: &et.Order_LimitOrder{LimitOrder: payload},
...@@ -271,6 +288,10 @@ func (a *Action) matchLimitOrder(payload *et.LimitOrder, leftAccountDB, rightAcc ...@@ -271,6 +288,10 @@ func (a *Action) matchLimitOrder(payload *et.LimitOrder, leftAccountDB, rightAcc
Addr: a.fromaddr, Addr: a.fromaddr,
UpdateTime: a.blocktime, UpdateTime: a.blocktime,
Index: a.GetIndex(), Index: a.GetIndex(),
Rate: tCfg.GetRate(payload),
MinFee: tCfg.GetMinFee(payload),
Hash: hex.EncodeToString(a.txhash),
CreateTime: a.blocktime,
} }
re := &et.ReceiptExchange{ re := &et.ReceiptExchange{
Order: or, Order: or,
...@@ -322,7 +343,7 @@ func (a *Action) matchLimitOrder(payload *et.LimitOrder, leftAccountDB, rightAcc ...@@ -322,7 +343,7 @@ func (a *Action) matchLimitOrder(payload *et.LimitOrder, leftAccountDB, rightAcc
continue 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 { if err != nil {
return nil, err return nil, err
} }
...@@ -359,7 +380,7 @@ func (a *Action) matchLimitOrder(payload *et.LimitOrder, leftAccountDB, rightAcc ...@@ -359,7 +380,7 @@ func (a *Action) matchLimitOrder(payload *et.LimitOrder, leftAccountDB, rightAcc
amount := CalcActualCost(et.OpBuy, or.Balance, payload.Price, cfg.GetCoinPrecision()) amount := CalcActualCost(et.OpBuy, or.Balance, payload.Price, cfg.GetCoinPrecision())
receipt, err := rightAccountDB.ExecFrozen(a.fromaddr, a.execaddr, amount) receipt, err := rightAccountDB.ExecFrozen(a.fromaddr, a.execaddr, amount)
if err != nil { 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 return nil, err
} }
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
...@@ -369,7 +390,7 @@ func (a *Action) matchLimitOrder(payload *et.LimitOrder, leftAccountDB, rightAcc ...@@ -369,7 +390,7 @@ func (a *Action) matchLimitOrder(payload *et.LimitOrder, leftAccountDB, rightAcc
amount := CalcActualCost(et.OpSell, or.Balance, payload.Price, cfg.GetCoinPrecision()) amount := CalcActualCost(et.OpSell, or.Balance, payload.Price, cfg.GetCoinPrecision())
receipt, err := leftAccountDB.ExecFrozen(a.fromaddr, a.execaddr, amount) receipt, err := leftAccountDB.ExecFrozen(a.fromaddr, a.execaddr, amount)
if err != nil { 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 return nil, err
} }
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
...@@ -385,7 +406,7 @@ func (a *Action) matchLimitOrder(payload *et.LimitOrder, leftAccountDB, rightAcc ...@@ -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 logs []*types.ReceiptLog
var kvs []*types.KeyValue var kvs []*types.KeyValue
var matched int64 var matched int64
...@@ -402,7 +423,7 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload * ...@@ -402,7 +423,7 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload *
cfg := a.api.GetConfig() cfg := a.api.GetConfig()
if payload.Op == et.OpSell { 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) receipt, err := rightAccountDB.ExecTransferFrozen(matchorder.Addr, a.fromaddr, a.execaddr, amount)
if err != nil { if err != nil {
elog.Error("matchModel.ExecTransferFrozen", "from", matchorder.Addr, "to", a.fromaddr, "amount", amount, "err", err) 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 * ...@@ -410,19 +431,23 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload *
} }
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
kvs = append(kvs, receipt.KV...) kvs = append(kvs, receipt.KV...)
//解冻多余资金
if payload.Price < matchorder.GetLimitOrder().Price { //收取手续费
amount := CalcActualCost(matchorder.GetLimitOrder().Op, matched, matchorder.GetLimitOrder().Price-payload.Price, cfg.GetCoinPrecision()) activeFee := calcMtfFee(amount, or.GetRate()) //主动成交方的手续费
receipt, err := rightAccountDB.ExecActive(matchorder.Addr, a.execaddr, amount) if activeFee != 0 {
receipt, err = rightAccountDB.ExecTransfer(a.fromaddr, feeAddr, a.execaddr, activeFee)
if err != nil { 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 return nil, nil, err
} }
or.DigestedFee += activeFee
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
kvs = append(kvs, receipt.KV...) 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) receipt, err = leftAccountDB.ExecTransfer(a.fromaddr, matchorder.Addr, a.execaddr, amount)
if err != nil { if err != nil {
elog.Error("matchModel.ExecTransfer", "from", a.fromaddr, "to", matchorder.Addr, "amount", amount, "err", err.Error()) 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 * ...@@ -431,10 +456,23 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload *
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
kvs = append(kvs, receipt.KV...) kvs = append(kvs, receipt.KV...)
//卖单成交得平均价格始终与自身挂单价格相同 //收取手续费
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平均成交价格
matchorder.AVGPrice = caclAVGPrice(matchorder, payload.Price, matched) //TODO matchorder.AVGPrice = caclAVGPrice(matchorder, matchorder.GetLimitOrder().Price, matched)
} }
if payload.Op == et.OpBuy { if payload.Op == et.OpBuy {
//转移冻结资产 //转移冻结资产
...@@ -446,6 +484,21 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload * ...@@ -446,6 +484,21 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload *
} }
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
kvs = append(kvs, receipt.KV...) kvs = append(kvs, receipt.KV...)
//收取手续费
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()) amount = CalcActualCost(payload.Op, matched, matchorder.GetLimitOrder().Price, cfg.GetCoinPrecision())
receipt, err = rightAccountDB.ExecTransfer(a.fromaddr, matchorder.Addr, a.execaddr, amount) receipt, err = rightAccountDB.ExecTransfer(a.fromaddr, matchorder.Addr, a.execaddr, amount)
...@@ -456,12 +509,27 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload * ...@@ -456,12 +509,27 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload *
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
kvs = append(kvs, receipt.KV...) kvs = append(kvs, receipt.KV...)
//买单得话,价格选取卖单的价格 //收取手续费
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平均成交价格
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() { if matched == matchorder.GetBalance() {
matchorder.Status = et.Completed matchorder.Status = et.Completed
} else { } else {
...@@ -515,10 +583,12 @@ func findOrderByOrderID(statedb dbm.KV, localdb dbm.KV, orderID int64) (*et.Orde ...@@ -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()) elog.Error("findOrderByOrderID.Decode", "orderID", orderID, "err", err.Error())
return nil, err return nil, err
} }
order.Executed = order.GetLimitOrder().Amount - order.Balance
return &order, nil 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) { 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 { ...@@ -698,3 +768,78 @@ func caclAVGPrice(order *et.Order, price int64, amount int64) int64 {
avg := big.NewInt(0).Div(total, div) avg := big.NewInt(0).Div(total, div)
return avg.Int64() 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
}
...@@ -5,148 +5,160 @@ option go_package = "../types"; ...@@ -5,148 +5,160 @@ option go_package = "../types";
message Exchange {} message Exchange {}
message ExchangeAction { message ExchangeAction {
oneof value { oneof value {
LimitOrder limitOrder = 1; LimitOrder limitOrder = 1;
MarketOrder marketOrder = 2; MarketOrder marketOrder = 2;
RevokeOrder revokeOrder = 3; RevokeOrder revokeOrder = 3;
} }
int32 ty = 6; int32 ty = 6;
} }
//限价订单 //限价订单
message LimitOrder { message LimitOrder {
//交易对 //交易对
asset leftAsset = 1; asset leftAsset = 1;
//交易对 //交易对
asset rightAsset = 2; asset rightAsset = 2;
//价格 //价格
int64 price = 3; int64 price = 3;
//总量 //总量
int64 amount = 4; int64 amount = 4;
//操作, 1为买,2为卖 //操作, 1为买,2为卖
int32 op = 5; int32 op = 5;
} }
//市价委托 //市价委托
message MarketOrder { message MarketOrder {
//资产1 //资产1
asset leftAsset = 1; asset leftAsset = 1;
//资产2 //资产2
asset rightAsset = 2; asset rightAsset = 2;
//总量 //总量
int64 amount = 3; int64 amount = 3;
//操作, 1为买,2为卖 //操作, 1为买,2为卖
int32 op = 4; int32 op = 4;
} }
//撤回订单 //撤回订单
message RevokeOrder { message RevokeOrder {
//订单号 //订单号
int64 orderID = 1; int64 orderID = 1;
} }
//资产类型 //资产类型
message asset { message asset {
string execer = 1; string execer = 1;
string symbol = 2; string symbol = 2;
} }
//订单信息 //订单信息
message Order { message Order {
int64 orderID = 1; int64 orderID = 1;
oneof value { oneof value {
LimitOrder limitOrder = 2; LimitOrder limitOrder = 2;
MarketOrder marketOrder = 3; MarketOrder marketOrder = 3;
} }
//挂单类型 //挂单类型
int32 ty = 4; int32 ty = 4;
//已经成交的数量 //已经成交的数量
int64 executed = 5; int64 executed = 5;
//成交均价 //成交均价
int64 AVG_price = 6; int64 AVG_price = 6;
//余额 //余额
int64 balance = 7; int64 balance = 7;
//状态,0 挂单中ordered, 1 完成completed, 2撤回 revoked //状态,0 挂单中ordered, 1 完成completed, 2撤回 revoked
int32 status = 8; int32 status = 8;
//用户地址 //用户地址
string addr = 9; string addr = 9;
//更新时间 //更新时间
int64 updateTime = 10; int64 updateTime = 10;
//索引 //索引
int64 index = 11; 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 { message QueryMarketDepth {
//资产1 //资产1
asset leftAsset = 1; asset leftAsset = 1;
//资产2 //资产2
asset rightAsset = 2; asset rightAsset = 2;
//操作, 1为买,2为卖 //操作, 1为买,2为卖
int32 op = 3; int32 op = 3;
// 这里用价格作为索引值 // 这里用价格作为索引值
string primaryKey = 4; string primaryKey = 4;
//单页返回多少条记录,默认返回10条,为了系统安全最多单次只能返回20条 //单页返回多少条记录,默认返回10条,为了系统安全最多单次只能返回20条
int32 count = 5; int32 count = 5;
} }
//市场深度 //市场深度
message MarketDepth { message MarketDepth {
//资产1 //资产1
asset leftAsset = 1; asset leftAsset = 1;
//资产2 //资产2
asset rightAsset = 2; asset rightAsset = 2;
//价格 //价格
int64 price = 3; int64 price = 3;
//总量 //总量
int64 amount = 4; int64 amount = 4;
//操作, 1为买,2为卖 //操作, 1为买,2为卖
int32 op = 5; int32 op = 5;
} }
//查询接口返回的市场深度列表 //查询接口返回的市场深度列表
message MarketDepthList { message MarketDepthList {
repeated MarketDepth list = 1; repeated MarketDepth list = 1;
string primaryKey = 2; string primaryKey = 2;
} }
//查询最新得成交信息,外部接口 //查询最新得成交信息,外部接口
message QueryHistoryOrderList { message QueryHistoryOrderList {
//资产1 //资产1
asset leftAsset = 1; asset leftAsset = 1;
//资产2 //资产2
asset rightAsset = 2; asset rightAsset = 2;
// 索引值 // 索引值
string primaryKey = 3; string primaryKey = 3;
//单页返回多少条记录,默认返回10条,为了系统安全最多单次只能返回20条 //单页返回多少条记录,默认返回10条,为了系统安全最多单次只能返回20条
int32 count = 4; int32 count = 4;
// 0降序,1升序,默认降序 // 0降序,1升序,默认降序
int32 direction = 5; int32 direction = 5;
} }
//根据orderID去查询订单信息 //根据orderID去查询订单信息
message QueryOrder { message QueryOrder {
int64 orderID = 1; int64 orderID = 1;
} }
//根据地址,状态查询用户自己的挂单信息 //根据地址,状态查询用户自己的挂单信息
message QueryOrderList { message QueryOrderList {
//挂单状态必填(默认是0,只查询ordered挂单中的) //挂单状态必填(默认是0,只查询ordered挂单中的)
int32 status = 1; int32 status = 1;
//用户地址信息,必填 //用户地址信息,必填
string address = 2; string address = 2;
// 主键索引 // 主键索引
string primaryKey = 3; string primaryKey = 3;
//单页返回多少条记录,默认返回10条,为了系统安全最多单次只能返回20条 //单页返回多少条记录,默认返回10条,为了系统安全最多单次只能返回20条
int32 count = 4; int32 count = 4;
// 0降序,1升序,默认降序 // 0降序,1升序,默认降序
int32 direction = 5; int32 direction = 5;
} }
//订单列表 //订单列表
message OrderList { message OrderList {
repeated Order list = 1; repeated Order list = 1;
string primaryKey = 2; string primaryKey = 2;
} }
// exchange执行票据日志 // exchange执行票据日志
message ReceiptExchange { message ReceiptExchange {
Order order = 1; Order order = 1;
repeated Order matchOrders = 2; repeated Order matchOrders = 2;
int64 index = 3; int64 index = 3;
} }
service exchange {} service exchange {}
...@@ -76,6 +76,7 @@ enableTLS=false ...@@ -76,6 +76,7 @@ enableTLS=false
certFile="cert.pem" certFile="cert.pem"
# 私钥文件 # 私钥文件
keyFile="key.pem" keyFile="key.pem"
[mempool] [mempool]
# mempool队列名称,可配,timeline,score,price # mempool队列名称,可配,timeline,score,price
name="timeline" name="timeline"
...@@ -86,6 +87,7 @@ minTxFee=100000 ...@@ -86,6 +87,7 @@ minTxFee=100000
# 每个账户在mempool中得最大交易数量,默认100 # 每个账户在mempool中得最大交易数量,默认100
maxTxNumPerAccount=10000 maxTxNumPerAccount=10000
# timeline 是默认的先来先进的按时间排序 # timeline 是默认的先来先进的按时间排序
[mempool.sub.timeline] [mempool.sub.timeline]
# mempool缓存容量大小,默认10240 # mempool缓存容量大小,默认10240
poolCacheSize=10240 poolCacheSize=10240
...@@ -94,6 +96,7 @@ minTxFee=100000 ...@@ -94,6 +96,7 @@ minTxFee=100000
# 每个账户在mempool中得最大交易数量,默认100 # 每个账户在mempool中得最大交易数量,默认100
maxTxNumPerAccount=10000 maxTxNumPerAccount=10000
# score是分数队列模式(分数=常量a*手续费/交易字节数-常量b*时间*定量c,按分数排队,高的优先,常量a,b和定量c可配置),按分数来排序 # score是分数队列模式(分数=常量a*手续费/交易字节数-常量b*时间*定量c,按分数排队,高的优先,常量a,b和定量c可配置),按分数来排序
[mempool.sub.score] [mempool.sub.score]
# mempool缓存容量大小,默认10240 # mempool缓存容量大小,默认10240
poolCacheSize=10240 poolCacheSize=10240
...@@ -108,6 +111,7 @@ priceConstant=1544 ...@@ -108,6 +111,7 @@ priceConstant=1544
# 常量比例 # 常量比例
pricePower=1 pricePower=1
# price是价格队列模式(价格=手续费/交易字节数,价格高者优先,同价则时间早优先) # price是价格队列模式(价格=手续费/交易字节数,价格高者优先,同价则时间早优先)
[mempool.sub.price] [mempool.sub.price]
# mempool缓存容量大小,默认10240 # mempool缓存容量大小,默认10240
poolCacheSize=10240 poolCacheSize=10240
...@@ -115,6 +119,7 @@ poolCacheSize=10240 ...@@ -115,6 +119,7 @@ poolCacheSize=10240
minTxFee=100000 minTxFee=100000
# 每个账户在mempool中得最大交易数量,默认100 # 每个账户在mempool中得最大交易数量,默认100
maxTxNumPerAccount=10000 maxTxNumPerAccount=10000
[consensus] [consensus]
#共识名,可选项有solo,ticket,raft,tendermint,para #共识名,可选项有solo,ticket,raft,tendermint,para
name="solo" name="solo"
...@@ -124,6 +129,7 @@ minerstart=true ...@@ -124,6 +129,7 @@ minerstart=true
genesisBlockTime=1514533394 genesisBlockTime=1514533394
#创世交易地址 #创世交易地址
genesis="1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs" genesis="1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs"
[mver.consensus] [mver.consensus]
#基金账户地址 #基金账户地址
fundKeyAddr = "1BQXS6TxaYYG5mADaWij4AxhZZUTpw95a5" fundKeyAddr = "1BQXS6TxaYYG5mADaWij4AxhZZUTpw95a5"
...@@ -150,6 +156,7 @@ targetTimespan = 2304 ...@@ -150,6 +156,7 @@ targetTimespan = 2304
#每个区块打包的目标时间 #每个区块打包的目标时间
targetTimePerBlock = 16 targetTimePerBlock = 16
# 仅保留这一项,其他consensus相关的配置全部删除 # 仅保留这一项,其他consensus相关的配置全部删除
[consensus.sub.solo] [consensus.sub.solo]
#创世交易地址 #创世交易地址
genesis="1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs" genesis="1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs"
...@@ -157,6 +164,7 @@ genesis="1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs" ...@@ -157,6 +164,7 @@ genesis="1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs"
genesisBlockTime=1514533394 genesisBlockTime=1514533394
#获取交易间隔时长,单位纳秒 #获取交易间隔时长,单位纳秒
waitTxMs=10 waitTxMs=10
[store] [store]
# 数据存储格式名称,目前支持mavl,kvdb,kvmvcc,mpt # 数据存储格式名称,目前支持mavl,kvdb,kvmvcc,mpt
name="mavl" name="mavl"
...@@ -168,6 +176,7 @@ dbPath="datadir/mavltree" ...@@ -168,6 +176,7 @@ dbPath="datadir/mavltree"
dbCache=128 dbCache=128
# 数据库版本 # 数据库版本
localdbVersion="1.0.0" localdbVersion="1.0.0"
[store.sub.mavl] [store.sub.mavl]
# 是否使能mavl加前缀 # 是否使能mavl加前缀
enableMavlPrefix=false enableMavlPrefix=false
...@@ -177,6 +186,7 @@ enableMVCC=false ...@@ -177,6 +186,7 @@ enableMVCC=false
enableMavlPrune=false enableMavlPrune=false
# 裁剪高度间隔 # 裁剪高度间隔
pruneHeight=10000 pruneHeight=10000
[wallet] [wallet]
# 交易发送最低手续费,单位0.00000001BTY(1e-8),默认100000,即0.001BTY # 交易发送最低手续费,单位0.00000001BTY(1e-8),默认100000,即0.001BTY
minFee=100000 minFee=100000
...@@ -187,12 +197,14 @@ dbPath="wallet" ...@@ -187,12 +197,14 @@ dbPath="wallet"
# walletdb缓存大小 # walletdb缓存大小
dbCache=16 dbCache=16
# 钱包发送交易签名方式 # 钱包发送交易签名方式
signType="secp256k1" signType="secp256k1"
[wallet.sub.ticket] [wallet.sub.ticket]
# 是否关闭ticket自动挖矿,默认false # 是否关闭ticket自动挖矿,默认false
minerdisable=false minerdisable=false
# 允许购买ticket挖矿的白名单地址,默认配置“*”,允许所有地址购买 # 允许购买ticket挖矿的白名单地址,默认配置“*”,允许所有地址购买
minerwhitelist=["*"] minerwhitelist=["*"]
[exec] [exec]
#执行器执行是否免费 #执行器执行是否免费
isFree=false isFree=false
...@@ -203,6 +215,7 @@ enableStat=false ...@@ -203,6 +215,7 @@ enableStat=false
#是否开启MVCC插件 #是否开启MVCC插件
enableMVCC=false enableMVCC=false
alias=["token1:token","token2:token","token3:token"] alias=["token1:token","token2:token","token3:token"]
[exec.sub.token] [exec.sub.token]
#是否保存token交易信息 #是否保存token交易信息
saveTokenTxList=true saveTokenTxList=true
...@@ -215,6 +228,7 @@ tokenApprs = [ ...@@ -215,6 +228,7 @@ tokenApprs = [
"1JYB8sxi4He5pZWHCd3Zi2nypQ4JMB6AxN", "1JYB8sxi4He5pZWHCd3Zi2nypQ4JMB6AxN",
"12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv", "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv",
] ]
[exec.sub.cert] [exec.sub.cert]
# 是否启用证书验证和签名 # 是否启用证书验证和签名
enable=false enable=false
...@@ -222,9 +236,11 @@ enable=false ...@@ -222,9 +236,11 @@ enable=false
cryptoPath="authdir/crypto" cryptoPath="authdir/crypto"
# 带证书签名类型,支持"auth_ecdsa", "auth_sm2" # 带证书签名类型,支持"auth_ecdsa", "auth_sm2"
signType="auth_ecdsa" signType="auth_ecdsa"
[exec.sub.relay] [exec.sub.relay]
#relay执行器保存BTC头执行权限地址 #relay执行器保存BTC头执行权限地址
genesis="1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs" genesis="1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs"
[exec.sub.manage] [exec.sub.manage]
#manage执行器超级管理员地址 #manage执行器超级管理员地址
superManager=[ superManager=[
...@@ -233,3 +249,42 @@ superManager=[ ...@@ -233,3 +249,42 @@ superManager=[
"1Q8hGLfoGe63efeWa8fJ4Pnukhkngt6poK" "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 ( ...@@ -18,10 +18,35 @@ var (
// 批量测试前,先确保测试账户有足够的币和钱 // 批量测试前,先确保测试账户有足够的币和钱
func main() { func main() {
cli = test.NewGRPCCli("localhost:8802") cli = test.NewGRPCCli("localhost:8802")
onesell()
go buy() go buy()
go sell() go sell()
select {} 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() { func sell() {
req := &et.LimitOrder{ req := &et.LimitOrder{
......
...@@ -17,6 +17,7 @@ var ( ...@@ -17,6 +17,7 @@ var (
PrivKeyB = "0x19c069234f9d3e61135fefbeb7791b149cdf6af536f26bebb310d4cd22c3fee4" // 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR PrivKeyB = "0x19c069234f9d3e61135fefbeb7791b149cdf6af536f26bebb310d4cd22c3fee4" // 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR
PrivKeyC = "0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115" // 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k PrivKeyC = "0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115" // 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k
PrivKeyD = "0xcacb1f5d51700aea07fca2246ab43b0917d70405c65edea9b5063d72eb5c6b71" // 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs PrivKeyD = "0xcacb1f5d51700aea07fca2246ab43b0917d70405c65edea9b5063d72eb5c6b71" // 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs
PrivKeyFee = "0xa691ceceadb1f6878c39702a057b09077971d2995b29f18ccba1e09cd9619b7f" // 1PTGVR7TUm1MJUH7M1UNcKBGMvfJ7nCrnN
coin = "bty" coin = "bty"
token = "CCNY" token = "CCNY"
leftAsset = &et.Asset{Symbol: coin, Execer: "coins"} leftAsset = &et.Asset{Symbol: coin, Execer: "coins"}
......
...@@ -40,6 +40,8 @@ type ExecCli struct { ...@@ -40,6 +40,8 @@ type ExecCli struct {
accC1 *account.DB accC1 *account.DB
accD *account.DB accD *account.DB
accD1 *account.DB accD1 *account.DB
accF *account.DB
accF1 *account.DB
} }
//Nodes ... //Nodes ...
...@@ -49,6 +51,7 @@ var ( ...@@ -49,6 +51,7 @@ var (
"1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR", "1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR",
"1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k", "1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k",
"1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs", "1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs",
"1PTGVR7TUm1MJUH7M1UNcKBGMvfJ7nCrnN",
} }
) )
...@@ -57,7 +60,7 @@ func NewExecCli() *ExecCli { ...@@ -57,7 +60,7 @@ func NewExecCli() *ExecCli {
dir, sdb, ldb := util.CreateTestDB() dir, sdb, ldb := util.CreateTestDB()
log.Println(dir) log.Println(dir)
cfg := types.NewChain33Config(types.GetDefaultCfgstring()) cfg := types.NewChain33Config(et.GetDefaultCfgstring())
cfg.SetTitleOnlyForTest("chain33") cfg.SetTitleOnlyForTest("chain33")
executor.Init(et.ExchangeX, cfg, nil) executor.Init(et.ExchangeX, cfg, nil)
...@@ -72,7 +75,6 @@ func NewExecCli() *ExecCli { ...@@ -72,7 +75,6 @@ func NewExecCli() *ExecCli {
Frozen: 0, Frozen: 0,
Addr: Nodes[1], Addr: Nodes[1],
} }
accountC := &types.Account{ accountC := &types.Account{
Balance: total, Balance: total,
Frozen: 0, Frozen: 0,
...@@ -83,6 +85,11 @@ func NewExecCli() *ExecCli { ...@@ -83,6 +85,11 @@ func NewExecCli() *ExecCli {
Frozen: 0, Frozen: 0,
Addr: Nodes[3], Addr: Nodes[3],
} }
accountFee := &types.Account{
Balance: 0,
Frozen: 0,
Addr: Nodes[4],
}
execAddr := address.ExecAddress(et.ExchangeX) execAddr := address.ExecAddress(et.ExchangeX)
...@@ -98,6 +105,9 @@ func NewExecCli() *ExecCli { ...@@ -98,6 +105,9 @@ func NewExecCli() *ExecCli {
accD, _ := account.NewAccountDB(cfg, "coins", "bty", sdb) accD, _ := account.NewAccountDB(cfg, "coins", "bty", sdb)
accD.SaveExecAccount(execAddr, accountD) accD.SaveExecAccount(execAddr, accountD)
accF, _ := account.NewAccountDB(cfg, "coins", "bty", sdb)
accF.SaveExecAccount(execAddr, accountFee)
accA1, _ := account.NewAccountDB(cfg, "token", "CCNY", sdb) accA1, _ := account.NewAccountDB(cfg, "token", "CCNY", sdb)
accA1.SaveExecAccount(execAddr, accountA) accA1.SaveExecAccount(execAddr, accountA)
...@@ -110,6 +120,9 @@ func NewExecCli() *ExecCli { ...@@ -110,6 +120,9 @@ func NewExecCli() *ExecCli {
accD1, _ := account.NewAccountDB(cfg, "token", "CCNY", sdb) accD1, _ := account.NewAccountDB(cfg, "token", "CCNY", sdb)
accD1.SaveExecAccount(execAddr, accountD) accD1.SaveExecAccount(execAddr, accountD)
accF1, _ := account.NewAccountDB(cfg, "token", "CCNY", sdb)
accF1.SaveExecAccount(execAddr, accountFee)
q := queue.New("channel") q := queue.New("channel")
q.SetConfig(cfg) q.SetConfig(cfg)
...@@ -131,6 +144,8 @@ func NewExecCli() *ExecCli { ...@@ -131,6 +144,8 @@ func NewExecCli() *ExecCli {
accC1: accC1, accC1: accC1,
accD: accD, accD: accD,
accD1: accD1, accD1: accD1,
accF: accF,
accF1: accF1,
} }
} }
......
...@@ -28,7 +28,7 @@ func NewGRPCCli(grpcAddr string) *GRPCCli { ...@@ -28,7 +28,7 @@ func NewGRPCCli(grpcAddr string) *GRPCCli {
panic(err) panic(err)
} }
client := types.NewChain33Client(conn) client := types.NewChain33Client(conn)
cfg := types.NewChain33Config(types.GetDefaultCfgstring()) cfg := types.NewChain33Config(et.GetDefaultCfgstring())
cfg.SetTitleOnlyForTest("chain33") cfg.SetTitleOnlyForTest("chain33")
executor.Init(et.ExchangeX, cfg, nil) executor.Init(et.ExchangeX, cfg, nil)
return &GRPCCli{ return &GRPCCli{
...@@ -138,7 +138,7 @@ func (c *GRPCCli) sendAndWaitReceipt(tx *types.Transaction, hexKey string) (txHa ...@@ -138,7 +138,7 @@ func (c *GRPCCli) sendAndWaitReceipt(tx *types.Transaction, hexKey string) (txHa
//SendTx ... //SendTx ...
func (c *GRPCCli) SendTx(tx *types.Transaction, hexKey string) (reply *types.Reply, err error) { 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") cfg.SetTitleOnlyForTest("chain33")
tx, err = types.FormatTx(cfg, et.ExchangeX, tx) tx, err = types.FormatTx(cfg, et.ExchangeX, tx)
if err != nil { if err != nil {
......
...@@ -30,6 +30,9 @@ sleep 1 ...@@ -30,6 +30,9 @@ sleep 1
#D -- 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs #D -- 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs
./chain33-cli account import_key -k 0xcacb1f5d51700aea07fca2246ab43b0917d70405c65edea9b5063d72eb5c6b71 -l D ./chain33-cli account import_key -k 0xcacb1f5d51700aea07fca2246ab43b0917d70405c65edea9b5063d72eb5c6b71 -l D
#Fee -- 1PTGVR7TUm1MJUH7M1UNcKBGMvfJ7nCrnN
./chain33-cli account import_key -k 0xa691ceceadb1f6878c39702a057b09077971d2995b29f18ccba1e09cd9619b7f -l Fee
## config token ## config token
./chain33-cli send config config_tx -c token-finisher -o add -v 1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs -k 1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs ./chain33-cli send config config_tx -c token-finisher -o add -v 1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs -k 1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
sleep 1 sleep 1
......
...@@ -15,4 +15,6 @@ var ( ...@@ -15,4 +15,6 @@ var (
ErrDirection = fmt.Errorf("%s", "The direction only 0 or 1!") ErrDirection = fmt.Errorf("%s", "The direction only 0 or 1!")
ErrStatus = fmt.Errorf("%s", "The status only in 0 , 1, 2!") ErrStatus = fmt.Errorf("%s", "The status only in 0 , 1, 2!")
ErrOrderID = fmt.Errorf("%s", "Wrong OrderID!") ErrOrderID = fmt.Errorf("%s", "Wrong OrderID!")
ErrCfgFmt = fmt.Errorf("%s", "ErrCfgFmt")
) )
...@@ -127,3 +127,51 @@ func (e *ExchangeType) GetTypeMap() map[string]int32 { ...@@ -127,3 +127,51 @@ func (e *ExchangeType) GetTypeMap() map[string]int32 {
func (e *ExchangeType) GetLogMap() map[int64]*types.LogInfo { func (e *ExchangeType) GetLogMap() map[int64]*types.LogInfo {
return logMap 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
}
// Code generated by protoc-gen-go. DO NOT EDIT. // Code generated by protoc-gen-go. DO NOT EDIT.
// versions: // versions:
// protoc-gen-go v1.26.0 // protoc-gen-go v1.26.0
// protoc v3.9.1 // protoc v3.17.3
// source: exchange.proto // source: exchange.proto
package types package types
...@@ -456,6 +456,18 @@ type Order struct { ...@@ -456,6 +456,18 @@ type Order struct {
UpdateTime int64 `protobuf:"varint,10,opt,name=updateTime,proto3" json:"updateTime,omitempty"` UpdateTime int64 `protobuf:"varint,10,opt,name=updateTime,proto3" json:"updateTime,omitempty"`
//索引 //索引
Index int64 `protobuf:"varint,11,opt,name=index,proto3" json:"index,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() { func (x *Order) Reset() {
...@@ -574,6 +586,48 @@ func (x *Order) GetIndex() int64 { ...@@ -574,6 +586,48 @@ func (x *Order) GetIndex() int64 {
return 0 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 { type isOrder_Value interface {
isOrder_Value() isOrder_Value()
} }
...@@ -1198,7 +1252,7 @@ var file_exchange_proto_rawDesc = []byte{ ...@@ -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, 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, 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, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x22,
0xdc, 0x02, 0x0a, 0x05, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0xfe, 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, 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, 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, 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{ ...@@ -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, 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, 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, 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, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x74, 0x65, 0x18, 0x0c, 0x20,
0x01, 0x0a, 0x10, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x65, 0x01, 0x28, 0x05, 0x52, 0x04, 0x72, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x69, 0x67,
0x70, 0x74, 0x68, 0x12, 0x2a, 0x0a, 0x09, 0x6c, 0x65, 0x66, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x65, 0x73, 0x74, 0x65, 0x64, 0x46, 0x65, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b,
0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x61, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x46, 0x65, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d,
0x73, 0x73, 0x65, 0x74, 0x52, 0x09, 0x6c, 0x65, 0x66, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x69, 0x6e, 0x46, 0x65, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x69, 0x6e,
0x2c, 0x0a, 0x0a, 0x72, 0x69, 0x67, 0x68, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x46, 0x65, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x0f, 0x20, 0x01, 0x28,
0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x76, 0x6f, 0x6b,
0x74, 0x52, 0x0a, 0x72, 0x69, 0x67, 0x68, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x0e, 0x0a, 0x65, 0x48, 0x61, 0x73, 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x76,
0x02, 0x6f, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x6f, 0x70, 0x12, 0x1e, 0x0a, 0x6f, 0x6b, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74,
0x0a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 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, 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, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f,
0x75, 0x6e, 0x74, 0x22, 0xa5, 0x01, 0x0a, 0x0b, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x65, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x70, 0x74, 0x68, 0x12, 0x2a, 0x0a, 0x09, 0x6c, 0x65, 0x66, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f,
0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x61, 0x6e, 0x22, 0x4d, 0x0a, 0x09, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x20,
0x73, 0x73, 0x65, 0x74, 0x52, 0x09, 0x6c, 0x65, 0x66, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74,
0x2c, 0x0a, 0x0a, 0x72, 0x69, 0x67, 0x68, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x04, 0x6c, 0x69, 0x73, 0x74,
0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x18, 0x02,
0x74, 0x52, 0x0a, 0x72, 0x69, 0x67, 0x68, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79,
0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x70, 0x72, 0x22, 0x7b, 0x0a, 0x0f, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x45, 0x78, 0x63, 0x68, 0x61,
0x69, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x6e, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01,
0x01, 0x28, 0x03, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72,
0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x6f, 0x70, 0x22, 0x59, 0x0a, 0x0f, 0x4d, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x2e, 0x0a, 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68,
0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x26, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74,
0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x63,
0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x68, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78,
0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x32, 0x0a, 0x0a,
0x79, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6d, 0x08, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x0a, 0x5a, 0x08, 0x2e, 0x2e, 0x2f,
0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x22, 0xc5, 0x01, 0x0a, 0x15, 0x51, 0x75, 0x65, 0x72, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
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,
} }
var ( var (
......
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