Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
plugin
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
link33
plugin
Commits
060e1ba6
Commit
060e1ba6
authored
Jan 05, 2020
by
harrylee
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add some test
parent
e4160511
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
746 additions
and
3 deletions
+746
-3
README.md
plugin/dapp/exchange/README.md
+0
-0
exchange.go
plugin/dapp/exchange/executor/exchange.go
+3
-3
exchange_test.go
plugin/dapp/exchange/executor/exchange_test.go
+0
-0
exchangedb.go
plugin/dapp/exchange/executor/exchangedb.go
+0
-0
chain33.toml
plugin/dapp/exchange/test/chain33.toml
+254
-0
client.go
plugin/dapp/exchange/test/client.go
+11
-0
main
plugin/dapp/exchange/test/cmd/main
+0
-0
main.go
plugin/dapp/exchange/test/cmd/main.go
+84
-0
exec_cli.go
plugin/dapp/exchange/test/exec_cli.go
+195
-0
grpc_cli.go
plugin/dapp/exchange/test/grpc_cli.go
+115
-0
prepare.sh
plugin/dapp/exchange/test/prepare.sh
+84
-0
No files found.
plugin/dapp/exchange/
executor/
README.md
→
plugin/dapp/exchange/README.md
View file @
060e1ba6
File moved
plugin/dapp/exchange/executor/exchange.go
View file @
060e1ba6
...
@@ -21,7 +21,7 @@ var driverName = exchangetypes.ExchangeX
...
@@ -21,7 +21,7 @@ var driverName = exchangetypes.ExchangeX
// Init register dapp
// Init register dapp
func
Init
(
name
string
,
cfg
*
types
.
Chain33Config
,
sub
[]
byte
)
{
func
Init
(
name
string
,
cfg
*
types
.
Chain33Config
,
sub
[]
byte
)
{
drivers
.
Register
(
cfg
,
GetName
(),
n
ewExchange
,
cfg
.
GetDappFork
(
driverName
,
"Enable"
))
drivers
.
Register
(
cfg
,
GetName
(),
N
ewExchange
,
cfg
.
GetDappFork
(
driverName
,
"Enable"
))
InitExecType
()
InitExecType
()
}
}
...
@@ -35,7 +35,7 @@ type exchange struct {
...
@@ -35,7 +35,7 @@ type exchange struct {
drivers
.
DriverBase
drivers
.
DriverBase
}
}
func
n
ewExchange
()
drivers
.
Driver
{
func
N
ewExchange
()
drivers
.
Driver
{
t
:=
&
exchange
{}
t
:=
&
exchange
{}
t
.
SetChild
(
t
)
t
.
SetChild
(
t
)
t
.
SetExecutorType
(
types
.
LoadExecutorType
(
driverName
))
t
.
SetExecutorType
(
types
.
LoadExecutorType
(
driverName
))
...
@@ -44,7 +44,7 @@ func newExchange() drivers.Driver {
...
@@ -44,7 +44,7 @@ func newExchange() drivers.Driver {
// GetName get driver name
// GetName get driver name
func
GetName
()
string
{
func
GetName
()
string
{
return
n
ewExchange
()
.
GetName
()
return
N
ewExchange
()
.
GetName
()
}
}
func
(
e
*
exchange
)
GetDriverName
()
string
{
func
(
e
*
exchange
)
GetDriverName
()
string
{
...
...
plugin/dapp/exchange/executor/exchange_test.go
View file @
060e1ba6
This diff is collapsed.
Click to expand it.
plugin/dapp/exchange/executor/exchangedb.go
View file @
060e1ba6
This diff is collapsed.
Click to expand it.
plugin/dapp/exchange/test/chain33.toml
0 → 100644
View file @
060e1ba6
# Title为local,表示此配置文件为本地单节点的配置。此时本地节点所在的链上只有这一个节点,共识模块一般采用solo模式。
Title
=
"local"
TestNet
=
true
FixTime
=
false
[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]
# P2P服务监听端口号
port
=
13802
# 种子节点,格式为ip:port,多个节点以逗号分隔,如seeds=["10.0.0.1:13802","10.0.0.2:13802","10.0.0.3:13802"]
seeds
=[]
# 是否启动P2P服务
enable
=
true
# 是否为种子节点
isSeed
=
false
# 是否作为服务端,对外提供服务
serverStart
=
true
# 是否使用内置的种子节点
innerSeedEnable
=
false
# 是否使用Github获取种子节点
useGithub
=
false
# 最多的接入节点个数
innerBounds
=
300
# 使用的数据库类型
driver
=
"leveldb"
# 数据库文件目录
dbPath
=
"datadir/addrbook"
# 数据库缓存大小
dbCache
=
4
# GRPC请求日志文件
grpcLogFile
=
"grpc33.log"
# p2p版本号,不同的测试网络选用不同的version
version
=
200
verMix
=
200
verMax
=
200
[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
=
"1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs"
[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
=
"1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs"
#创世区块时间(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
=
[
"1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs"
,
"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
=
"1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs"
[exec.sub.manage]
#manage执行器超级管理员地址
superManager
=[
"1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs"
,
"12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
,
"1Q8hGLfoGe63efeWa8fJ4Pnukhkngt6poK"
]
plugin/dapp/exchange/test/client.go
0 → 100644
View file @
060e1ba6
package
test
import
(
"github.com/33cn/chain33/types"
"github.com/gogo/protobuf/proto"
)
type
Cli
interface
{
Send
(
tx
*
types
.
Transaction
,
hexKey
string
)
([]
*
types
.
ReceiptLog
,
error
)
Query
(
fn
string
,
msg
proto
.
Message
)
([]
byte
,
error
)
}
plugin/dapp/exchange/test/cmd/main
0 → 100755
View file @
060e1ba6
File added
plugin/dapp/exchange/test/cmd/main.go
0 → 100644
View file @
060e1ba6
package
main
import
(
"fmt"
"sync"
"github.com/33cn/chain33/types"
"github.com/33cn/plugin/plugin/dapp/exchange/test"
et
"github.com/33cn/plugin/plugin/dapp/exchange/types"
)
var
(
cli
*
test
.
GRPCCli
Genesis
=
"0x3990969DF92A5914F7B71EEB9A4E58D6E255F32BF042FEA5318FC8B3D50EE6E8"
// 1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
PrivKeyA
=
"0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b"
// 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4
PrivKeyB
=
"0x19c069234f9d3e61135fefbeb7791b149cdf6af536f26bebb310d4cd22c3fee4"
// 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR
PrivKeyC
=
"0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115"
// 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k
PrivKeyD
=
"0xcacb1f5d51700aea07fca2246ab43b0917d70405c65edea9b5063d72eb5c6b71"
// 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs
Nodes
=
[]
string
{
"1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4"
,
"1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR"
,
"1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k"
,
"1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs"
,
}
)
// 批量测试前,先确保测试账户有足够的币和钱
func
main
()
{
cli
=
test
.
NewGRPCCli
(
"localhost:8802"
)
var
group
sync
.
WaitGroup
group
.
Add
(
2000
)
for
i
:=
0
;
i
<
1000
;
i
++
{
go
buy
(
&
group
)
go
sell
(
&
group
)
}
group
.
Wait
()
}
func
sell
(
group
*
sync
.
WaitGroup
)
{
req
:=
&
et
.
LimitOrder
{
LeftAsset
:
&
et
.
Asset
{
Symbol
:
"bty"
,
Execer
:
"coins"
},
RightAsset
:
&
et
.
Asset
{
Execer
:
"token"
,
Symbol
:
"CCNY"
},
Price
:
1
*
types
.
Coin
,
Amount
:
types
.
Coin
,
Op
:
et
.
OpSell
,
}
ety
:=
types
.
LoadExecutorType
(
et
.
ExchangeX
)
// 卖 2000 次,需 2000*1=2000 个 bty
for
i
:=
0
;
i
<
2
;
i
++
{
fmt
.
Println
(
"sell "
,
i
)
tx
,
err
:=
ety
.
Create
(
"LimitOrder"
,
req
)
if
err
!=
nil
{
panic
(
err
)
}
//go cli.SendTx(tx, PrivKeyA)
cli
.
SendTx
(
tx
,
PrivKeyA
)
}
group
.
Done
()
}
func
buy
(
group
*
sync
.
WaitGroup
)
{
req
:=
&
et
.
LimitOrder
{
LeftAsset
:
&
et
.
Asset
{
Symbol
:
"bty"
,
Execer
:
"coins"
},
RightAsset
:
&
et
.
Asset
{
Execer
:
"token"
,
Symbol
:
"CCNY"
},
Price
:
1
*
types
.
Coin
,
Amount
:
types
.
Coin
,
Op
:
et
.
OpBuy
,
}
ety
:=
types
.
LoadExecutorType
(
et
.
ExchangeX
)
// 买 2000 次,需 2000*1=2000 个 ccny
for
i
:=
0
;
i
<
2
;
i
++
{
fmt
.
Println
(
"buy "
,
i
)
tx
,
err
:=
ety
.
Create
(
"LimitOrder"
,
req
)
if
err
!=
nil
{
panic
(
err
)
}
//go cli.SendTx(tx, PrivKeyB)
cli
.
SendTx
(
tx
,
PrivKeyB
)
}
group
.
Done
()
}
plugin/dapp/exchange/test/exec_cli.go
0 → 100644
View file @
060e1ba6
package
test
import
(
"log"
"time"
"github.com/33cn/chain33/common/db"
"github.com/33cn/plugin/plugin/dapp/exchange/executor"
"github.com/gogo/protobuf/proto"
"github.com/33cn/chain33/account"
"github.com/33cn/chain33/common/address"
"github.com/33cn/chain33/types"
"github.com/33cn/chain33/util"
"github.com/33cn/chain33/client"
"github.com/33cn/chain33/common"
"github.com/33cn/chain33/common/crypto"
"github.com/33cn/chain33/queue"
et
"github.com/33cn/plugin/plugin/dapp/exchange/types"
)
type
ExecCli
struct
{
ldb
db
.
KVDB
sdb
db
.
DB
height
int64
blockTime
int64
difficulty
uint64
}
var
(
Nodes
=
[]
string
{
"1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4"
,
"1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR"
,
"1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k"
,
"1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs"
,
}
)
func
NewExecCli
()
*
ExecCli
{
dir
,
sdb
,
ldb
:=
util
.
CreateTestDB
()
log
.
Println
(
dir
)
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
executor
.
Init
(
et
.
ExchangeX
,
cfg
,
nil
)
total
:=
100
*
types
.
Coin
accountA
:=
types
.
Account
{
Balance
:
total
,
Frozen
:
0
,
Addr
:
Nodes
[
0
],
}
accountB
:=
types
.
Account
{
Balance
:
total
,
Frozen
:
0
,
Addr
:
Nodes
[
1
],
}
accountC
:=
types
.
Account
{
Balance
:
total
,
Frozen
:
0
,
Addr
:
Nodes
[
2
],
}
accountD
:=
types
.
Account
{
Balance
:
total
,
Frozen
:
0
,
Addr
:
Nodes
[
3
],
}
execAddr
:=
address
.
ExecAddress
(
et
.
ExchangeX
)
accA
,
_
:=
account
.
NewAccountDB
(
cfg
,
"coins"
,
"bty"
,
sdb
)
accA
.
SaveExecAccount
(
execAddr
,
&
accountA
)
accB
,
_
:=
account
.
NewAccountDB
(
cfg
,
"coins"
,
"bty"
,
sdb
)
accB
.
SaveExecAccount
(
execAddr
,
&
accountB
)
accC
,
_
:=
account
.
NewAccountDB
(
cfg
,
"coins"
,
"bty"
,
sdb
)
accC
.
SaveExecAccount
(
execAddr
,
&
accountC
)
accD
,
_
:=
account
.
NewAccountDB
(
cfg
,
"coins"
,
"bty"
,
sdb
)
accD
.
SaveExecAccount
(
execAddr
,
&
accountD
)
accA1
,
_
:=
account
.
NewAccountDB
(
cfg
,
"token"
,
"CCNY"
,
sdb
)
accA1
.
SaveExecAccount
(
execAddr
,
&
accountA
)
accB1
,
_
:=
account
.
NewAccountDB
(
cfg
,
"paracross"
,
"coins.bty"
,
sdb
)
accB1
.
SaveExecAccount
(
execAddr
,
&
accountB
)
accC1
,
_
:=
account
.
NewAccountDB
(
cfg
,
"paracross"
,
"token.CCNY"
,
sdb
)
accC1
.
SaveExecAccount
(
execAddr
,
&
accountC
)
accD1
,
_
:=
account
.
NewAccountDB
(
cfg
,
"token"
,
"CCNY"
,
sdb
)
accD1
.
SaveExecAccount
(
execAddr
,
&
accountD
)
return
&
ExecCli
{
ldb
:
ldb
,
sdb
:
sdb
,
height
:
1
,
blockTime
:
time
.
Now
()
.
Unix
(),
difficulty
:
1539918074
,
}
}
func
(
c
*
ExecCli
)
Send
(
tx
*
types
.
Transaction
,
hexKey
string
)
([]
*
types
.
ReceiptLog
,
error
)
{
var
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
}
exec
:=
executor
.
NewExchange
()
if
err
:=
exec
.
CheckTx
(
tx
,
int
(
1
));
err
!=
nil
{
return
nil
,
err
}
c
.
height
++
c
.
blockTime
+=
10
c
.
difficulty
++
q
:=
queue
.
New
(
"channel"
)
q
.
SetConfig
(
cfg
)
api
,
_
:=
client
.
New
(
q
.
Client
(),
nil
)
exec
.
SetAPI
(
api
)
exec
.
SetStateDB
(
c
.
sdb
)
exec
.
SetLocalDB
(
c
.
ldb
)
exec
.
SetEnv
(
c
.
height
,
c
.
blockTime
,
c
.
difficulty
)
receipt
,
err
:=
exec
.
Exec
(
tx
,
int
(
1
))
if
err
!=
nil
{
return
nil
,
err
}
for
_
,
kv
:=
range
receipt
.
KV
{
c
.
sdb
.
Set
(
kv
.
Key
,
kv
.
Value
)
}
receiptDate
:=
&
types
.
ReceiptData
{
Ty
:
receipt
.
Ty
,
Logs
:
receipt
.
Logs
}
set
,
err
:=
exec
.
ExecLocal
(
tx
,
receiptDate
,
int
(
1
))
if
err
!=
nil
{
return
nil
,
err
}
for
_
,
kv
:=
range
set
.
KV
{
c
.
ldb
.
Set
(
kv
.
Key
,
kv
.
Value
)
}
//save to database
util
.
SaveKVList
(
c
.
sdb
,
set
.
KV
)
return
receipt
.
Logs
,
nil
}
func
(
c
*
ExecCli
)
Query
(
fn
string
,
msg
proto
.
Message
)
([]
byte
,
error
)
{
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
q
:=
queue
.
New
(
"channel"
)
q
.
SetConfig
(
cfg
)
api
,
_
:=
client
.
New
(
q
.
Client
(),
nil
)
exec
:=
executor
.
NewExchange
()
exec
.
SetAPI
(
api
)
exec
.
SetStateDB
(
c
.
sdb
)
exec
.
SetLocalDB
(
c
.
ldb
)
exec
.
SetEnv
(
c
.
height
,
c
.
blockTime
,
c
.
difficulty
)
r
,
err
:=
exec
.
Query
(
fn
,
types
.
Encode
(
msg
))
if
err
!=
nil
{
return
nil
,
err
}
return
types
.
Encode
(
r
),
nil
}
func
signTx
(
tx
*
types
.
Transaction
,
hexPrivKey
string
)
(
*
types
.
Transaction
,
error
)
{
signType
:=
types
.
SECP256K1
c
,
err
:=
crypto
.
New
(
types
.
GetSignName
(
""
,
signType
))
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
}
plugin/dapp/exchange/test/grpc_cli.go
0 → 100644
View file @
060e1ba6
package
test
import
(
"context"
"errors"
"fmt"
"strings"
"time"
"github.com/33cn/chain33/common"
"github.com/33cn/chain33/types"
"github.com/33cn/plugin/plugin/dapp/exchange/executor"
et
"github.com/33cn/plugin/plugin/dapp/exchange/types"
"github.com/gogo/protobuf/proto"
"google.golang.org/grpc"
)
type
GRPCCli
struct
{
client
types
.
Chain33Client
}
func
NewGRPCCli
(
grpcAddr
string
)
*
GRPCCli
{
conn
,
err
:=
grpc
.
Dial
(
grpcAddr
,
grpc
.
WithInsecure
())
if
err
!=
nil
{
panic
(
err
)
}
client
:=
types
.
NewChain33Client
(
conn
)
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
executor
.
Init
(
et
.
ExchangeX
,
cfg
,
nil
)
return
&
GRPCCli
{
client
:
client
,
}
}
func
(
c
*
GRPCCli
)
Send
(
tx
*
types
.
Transaction
,
hexKey
string
)
([]
*
types
.
ReceiptLog
,
error
)
{
txHash
,
logs
,
err
:=
c
.
sendAndWaitReceipt
(
tx
,
hexKey
)
if
txHash
!=
nil
{
fmt
.
Println
(
"txHash: "
,
common
.
ToHex
(
txHash
))
}
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
)
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
)
sendAndWaitReceipt
(
tx
*
types
.
Transaction
,
hexKey
string
)
(
txHash
[]
byte
,
logs
[]
*
types
.
ReceiptLog
,
err
error
)
{
r
,
err
:=
c
.
SendTx
(
tx
,
hexKey
)
if
err
!=
nil
{
// rpc error: code = Unknown desc = ErrNotBank
return
nil
,
nil
,
err
}
if
!
r
.
IsOk
{
return
nil
,
nil
,
errors
.
New
(
string
(
r
.
Msg
))
}
time
.
Sleep
(
time
.
Second
)
d
,
_
:=
c
.
client
.
QueryTransaction
(
context
.
Background
(),
&
types
.
ReqHash
{
Hash
:
r
.
Msg
})
return
r
.
Msg
,
d
.
Receipt
.
Logs
,
nil
}
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
parseError
(
err
error
)
error
{
// rpc error: code = Unknown desc = ErrNotBank
str
:=
err
.
Error
()
sep
:=
"desc = "
i
:=
strings
.
Index
(
str
,
sep
)
if
i
!=
-
1
{
return
errors
.
New
(
str
[
i
+
len
(
sep
)
:
])
}
return
err
}
plugin/dapp/exchange/test/prepare.sh
0 → 100755
View file @
060e1ba6
#!/usr/bin/env bash
BUILD
=
$(
cd
`
dirname
$0
`
&&
cd
../../../../build
&&
pwd
)
echo
"
$BUILD
"
cd
$BUILD
seed
=
$(
./chain33-cli seed generate
-l
0
)
echo
$seed
./chain33-cli seed save
-p
bty123456
-s
"
$seed
"
sleep
1
./chain33-cli wallet unlock
-p
bty123456
sleep
1
./chain33-cli account list
## account
#genesis -- 1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
./chain33-cli account import_key
-k
3990969DF92A5914F7B71EEB9A4E58D6E255F32BF042FEA5318FC8B3D50EE6E8
-l
genesis
#A -- 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4
./chain33-cli account import_key
-k
0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b
-l
A
#B -- 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR
./chain33-cli account import_key
-k
0x19c069234f9d3e61135fefbeb7791b149cdf6af536f26bebb310d4cd22c3fee4
-l
B
#C -- 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k
./chain33-cli account import_key
-k
0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115
-l
C
#D -- 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs
./chain33-cli account import_key
-k
0xcacb1f5d51700aea07fca2246ab43b0917d70405c65edea9b5063d72eb5c6b71
-l
D
## config token
./chain33-cli send config config_tx
-c
token-finisher
-o
add
-v
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
sleep
1
./chain33-cli config query_config
-k
token-finisher
./chain33-cli send config config_tx
-c
token-blacklist
-o
add
-v
BTY
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
sleep
1
./chain33-cli config query_config
-k
token-blacklist
## 10亿
./chain33-cli send token precreate
-f
0.001
-i
"test ccny"
-n
"ccny"
-a
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
-p
0
-s
CCNY
-t
1000000000
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
sleep
1
./chain33-cli token get_precreated
./chain33-cli send token finish
-s
CCNY
-f
0.001
-a
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
sleep
1
./chain33-cli token get_finish_created
./chain33-cli token token_balance
-a
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
-s
CCNY
-e
token
## transfer bty
./chain33-cli send coins transfer
-a
20000
-t
1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
./chain33-cli send coins transfer
-a
20000
-t
1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
./chain33-cli send coins transfer
-a
20000
-t
1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
./chain33-cli send coins transfer
-a
20000
-t
1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
./chain33-cli account list
## send bty to execer, 每人10000 bty
./chain33-cli send coins send_exec
-e
exchange
-a
10000
-k
1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4
./chain33-cli send coins send_exec
-e
exchange
-a
10000
-k
1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR
./chain33-cli send coins send_exec
-e
exchange
-a
10000
-k
1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k
./chain33-cli send coins send_exec
-e
exchange
-a
10000
-k
1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs
echo
"account balance in execer"
./chain33-cli account balance
-e
exchange
-a
1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4
./chain33-cli account balance
-e
exchange
-a
1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR
./chain33-cli account balance
-e
exchange
-a
1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k
./chain33-cli account balance
-e
exchange
-a
1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs
##transfer token,每人2亿 ccny
./chain33-cli send token transfer
-a
200000000
-s
CCNY
-t
1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
./chain33-cli send token transfer
-a
200000000
-s
CCNY
-t
1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
./chain33-cli send token transfer
-a
200000000
-s
CCNY
-t
1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
./chain33-cli send token transfer
-a
200000000
-s
CCNY
-t
1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
## send token to excer
./chain33-cli send token send_exec
-a
200000000
-e
exchange
-s
CCNY
-k
1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4
./chain33-cli send token send_exec
-a
200000000
-e
exchange
-s
CCNY
-k
1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR
./chain33-cli send token send_exec
-a
200000000
-e
exchange
-s
CCNY
-k
1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k
./chain33-cli send token send_exec
-a
200000000
-e
exchange
-s
CCNY
-k
1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs
echo
"token balance in execer"
./chain33-cli token token_balance
-e
exchange
-s
CCNY
-a
"1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs"
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment