Commit 756e7aed authored by QM's avatar QM

Merge remote-tracking branch 'upstream/master' into bridgevmxgo_bsc_1201

parents e467beba 866292e2
...@@ -49,3 +49,4 @@ build/sendstock.toml ...@@ -49,3 +49,4 @@ build/sendstock.toml
build/*.csv build/*.csv
build/CHANGELOG.md build/CHANGELOG.md
plugin/dapp/dex/boss/build/ plugin/dapp/dex/boss/build/
plugin/dapp/bridgevmxgo/cmd/build/addrTestConfig.toml
[fork.system]
ForkChainParamV1=110000
ForkChainParamV2=1692674
ForkCheckTxDup=75260
ForkBlockHash=209186
ForkMinerTime=350000
ForkTransferExec=408400
ForkExecKey=408400
ForkWithdraw=480000
ForkTxGroup=408400
ForkResetTx0=453400
ForkExecRollback=706531
ForkTxHeight=806578
ForkCheckBlockTime=1200000
ForkMultiSignAddress=1298600
ForkStateDBSet=1572391
ForkBlockCheck=1560000
ForkLocalDBAccess=1572391
ForkTxGroupPara=1687250
ForkBase58AddressCheck=1800000
# 这个fork只影响平行链,注册类似user.p.x.exec的driver,新开的平行链设为0即可,老的平行链要设置新的高度
ForkEnableParaRegExec=0
ForkCacheDriver=2580000
ForkTicketFundAddrV1=3350000
ForkRootHash=4500000
[fork.sub.coins]
Enable=0
[fork.sub.manage]
Enable=120000
ForkManageExec=400000
ForkManageAutonomyEnable=10000000
[fork.sub.accountmanager]
Enable=0
[fork.sub.autonomy]
Enable=7200000
ForkAutonomyDelRule=9500000
ForkAutonomyEnableItem=10000000
[fork.sub.blackwhite]
Enable=850000
ForkBlackWhiteV2=900000
[fork.sub.cert]
Enable=0
[fork.sub.coinsx]
Enable=0
[fork.sub.collateralize]
Enable=0
ForkCollateralizeTableUpdate=0
[fork.sub.dpos]
Enable=0
[fork.sub.echo]
Enable=0
[fork.sub.evm]
Enable=500000
# EVM合约中的数据分散存储,支持大数据量
ForkEVMState=650000
# EVM合约状态数据生成哈希,保存在主链的StateDB中
ForkEVMKVHash=1000000
# EVM合约支持ABI绑定和调用
ForkEVMABI=1250000
# EVM合约用户金额冻结
ForkEVMFrozen=1300000
# EEVM 黄皮v1分叉高度
ForkEVMYoloV1=9500000
# EVM合约支持交易组
ForkEVMTxGroup=0
[fork.sub.evmxgo]
Enable=0
[fork.sub.exchange]
Enable=0
[fork.sub.game]
Enable=0
[fork.sub.guess]
Enable=0
[fork.sub.hashlock]
Enable=0
ForkBadRepeatSecret=2715575
[fork.sub.issuance]
Enable=0
ForkIssuanceTableUpdate=0
[fork.sub.jsvm]
Enable=0
[fork.sub.lottery]
Enable=0
[fork.sub.mix]
Enable=0
[fork.sub.multisig]
Enable=0
[fork.sub.NormX]
Enable=0
[fork.sub.oracle]
Enable=0
[fork.sub.paracross]
Enable=1600000
ForkParacrossWithdrawFromParachain=1298600
ForkParacrossCommitTx=1850000
ForkLoopCheckCommitTxDone=3230000
ForkParaAssetTransferRbk=4500000
ForkParaSupervision=6000000
#以下仅平行链适用
ForkParaSelfConsStages=-1
ForkParaFullMinerHeight=-1
ForkParaRootHash=-1
[fork.sub.pokerbull]
Enable=0
[fork.sub.privacy]
Enable=980000
[fork.sub.qbftNode]
Enable=0
[fork.sub.relay]
Enable=570000
[fork.sub.retrieve]
Enable=0
ForkRetrive=180000
ForkRetriveAsset=3150000
[fork.sub.storage]
Enable=0
ForkStorageLocalDB=0
[fork.sub.ticket]
Enable=0
ForkTicketId=1062000
ForkTicketVrf=1770000
[fork.sub.token]
Enable=100899
ForkTokenBlackList=190000
ForkBadTokenSymbol=184000
ForkTokenPrice=560000
ForkTokenSymbolWithNumber=1298600
ForkTokenCheck=1600000
[fork.sub.trade]
Enable=100899
ForkTradeBuyLimit=301000
ForkTradeAsset=1010000
ForkTradeID=1450000
ForkTradeFixAssetDB=2500000
ForkTradePrice=3150000
[fork.sub.unfreeze]
Enable=0
ForkTerminatePart=1298600
ForkUnfreezeIDX=1450000
[fork.sub.valnode]
Enable=0
[fork.sub.vote]
Enable=0
[fork.sub.wasm]
Enable=0
[fork.sub.x2ethereum]
Enable=0
[fork.sub.store-kvmvccmavl]
ForkKvmvccmavl=1870000
...@@ -393,10 +393,12 @@ Enable=0 ...@@ -393,10 +393,12 @@ Enable=0
[fork.sub.issuance] [fork.sub.issuance]
Enable=0 Enable=0
ForkIssuanceTableUpdate=0 ForkIssuanceTableUpdate=0
ForkIssuancePrecision=0
[fork.sub.collateralize] [fork.sub.collateralize]
Enable=0 Enable=0
ForkCollateralizeTableUpdate=0 ForkCollateralizeTableUpdate=0
ForkCollateralizePrecision=0
#对已有的平行链如果不是从0开始同步数据,需要设置这个kvmvccmavl的对应平行链高度的fork,如果从0开始同步,statehash会跟以前mavl的不同 #对已有的平行链如果不是从0开始同步数据,需要设置这个kvmvccmavl的对应平行链高度的fork,如果从0开始同步,statehash会跟以前mavl的不同
[fork.sub.store-kvmvccmavl] [fork.sub.store-kvmvccmavl]
...@@ -429,6 +431,7 @@ banks = ["1PTGVR7TUm1MJUH7M1UNcKBGMvfJ7nCrnN"]#Fee ...@@ -429,6 +431,7 @@ banks = ["1PTGVR7TUm1MJUH7M1UNcKBGMvfJ7nCrnN"]#Fee
#minFee最小手续费,配置时需*1e8(如:最小手续费收取1个,minFee=100000000) #minFee最小手续费,配置时需*1e8(如:最小手续费收取1个,minFee=100000000)
coins = [ coins = [
{ name = "bty", rate = 100000, minFee = 0 }, { name = "bty", rate = 100000, minFee = 0 },
{ name = "coins.bty", rate = 100000, minFee = 0 },
{ name = "ETH", rate = 100000, minFee = 0 }, { name = "ETH", rate = 100000, minFee = 0 },
{ name = "USDT", rate = 100000, minFee = 0 }, { name = "USDT", rate = 100000, minFee = 0 },
] ]
......
...@@ -394,10 +394,12 @@ Enable=0 ...@@ -394,10 +394,12 @@ Enable=0
[fork.sub.issuance] [fork.sub.issuance]
Enable=0 Enable=0
ForkIssuanceTableUpdate=0 ForkIssuanceTableUpdate=0
ForkIssuancePrecision=0
[fork.sub.collateralize] [fork.sub.collateralize]
Enable=0 Enable=0
ForkCollateralizeTableUpdate=0 ForkCollateralizeTableUpdate=0
ForkCollateralizePrecision=0
#对已有的平行链如果不是从0开始同步数据,需要设置这个kvmvccmavl的对应平行链高度的fork,如果从0开始同步,statehash会跟以前mavl的不同 #对已有的平行链如果不是从0开始同步数据,需要设置这个kvmvccmavl的对应平行链高度的fork,如果从0开始同步,statehash会跟以前mavl的不同
[fork.sub.store-kvmvccmavl] [fork.sub.store-kvmvccmavl]
...@@ -430,6 +432,7 @@ banks = ["1PTGVR7TUm1MJUH7M1UNcKBGMvfJ7nCrnN"]#Fee ...@@ -430,6 +432,7 @@ banks = ["1PTGVR7TUm1MJUH7M1UNcKBGMvfJ7nCrnN"]#Fee
#minFee最小手续费,配置时需*1e8(如:最小手续费收取1个,minFee=100000000) #minFee最小手续费,配置时需*1e8(如:最小手续费收取1个,minFee=100000000)
coins = [ coins = [
{ name = "bty", rate = 100000, minFee = 0 }, { name = "bty", rate = 100000, minFee = 0 },
{ name = "coins.bty", rate = 100000, minFee = 0 },
{ name = "ETH", rate = 100000, minFee = 0 }, { name = "ETH", rate = 100000, minFee = 0 },
{ name = "USDT", rate = 100000, minFee = 0 }, { name = "USDT", rate = 100000, minFee = 0 },
] ]
......
...@@ -95,6 +95,8 @@ maxConnectNum=100 ...@@ -95,6 +95,8 @@ maxConnectNum=100
disableFindLANPeers=false disableFindLANPeers=false
# 配置为全节点模式,全节点保存所有分片数据 # 配置为全节点模式,全节点保存所有分片数据
isFullNode=false isFullNode=false
# 分片数据默认保存比例,最低可配置为10
percentage=30
[rpc] [rpc]
jrpcBindAddr="localhost:8801" jrpcBindAddr="localhost:8801"
...@@ -214,13 +216,16 @@ enableMemVal=true ...@@ -214,13 +216,16 @@ enableMemVal=true
tkCloseCacheLen=100000 tkCloseCacheLen=100000
[store.sub.kvmvccmavl] [store.sub.kvmvccmavl]
# 开启该配置可以方便遍历最新的状态数据,节省磁盘空间可以关闭该配置项
enableMVCCIter=true enableMVCCIter=true
enableMavlPrefix=false enableMavlPrefix=false
enableMVCC=false enableMVCC=false
enableMavlPrune=false enableMavlPrune=false
pruneMavlHeight=10000 pruneMavlHeight=10000
# 开启该配置项会精简mvcc历史高度的数据,默认不精简
enableMVCCPrune=false enableMVCCPrune=false
pruneMVCCHeight=10000 # 每次精简mvcc的间隔高度,默认每100w高度精简一次
pruneMVCCHeight=1000000
# 是否使能mavl数据载入内存 # 是否使能mavl数据载入内存
enableMemTree=true enableMemTree=true
# 是否使能mavl叶子节点数据载入内存 # 是否使能mavl叶子节点数据载入内存
...@@ -248,6 +253,12 @@ rescanMultisigAddr=false ...@@ -248,6 +253,12 @@ rescanMultisigAddr=false
enableStat=false enableStat=false
enableMVCC=false enableMVCC=false
alias=["token1:token","token2:token","token3:token"] alias=["token1:token","token2:token","token3:token"]
# 记录地址相关的交易列表,便于按地址查询交易
disableAddrIndex=false
# 记录每个高度总的手续费消耗量
disableFeeIndex=false
# 开启后会进一步精简localdb,用户查询合约功能会受影响,纯挖矿节点可以开启节省磁盘空间
disableExecLocal=false
[exec.sub.token] [exec.sub.token]
saveTokenTxList=true saveTokenTxList=true
...@@ -336,6 +347,7 @@ banks = ["1PTGVR7TUm1MJUH7M1UNcKBGMvfJ7nCrnN"]#Fee ...@@ -336,6 +347,7 @@ banks = ["1PTGVR7TUm1MJUH7M1UNcKBGMvfJ7nCrnN"]#Fee
#minFee最小手续费,配置时需*1e8(如:最小手续费收取1个,minFee=100000000) #minFee最小手续费,配置时需*1e8(如:最小手续费收取1个,minFee=100000000)
coins = [ coins = [
{ name = "bty", rate = 100000, minFee = 0 }, { name = "bty", rate = 100000, minFee = 0 },
{ name = "coins.bty", rate = 100000, minFee = 0 },
{ name = "ETH", rate = 100000, minFee = 0 }, { name = "ETH", rate = 100000, minFee = 0 },
{ name = "USDT", rate = 100000, minFee = 0 }, { name = "USDT", rate = 100000, minFee = 0 },
] ]
\ No newline at end of file
...@@ -3,7 +3,7 @@ module github.com/33cn/plugin ...@@ -3,7 +3,7 @@ module github.com/33cn/plugin
go 1.15 go 1.15
require ( require (
github.com/33cn/chain33 v1.65.6-0.20211118074307-04e724cee41c github.com/33cn/chain33 v1.65.6-0.20211130044919-77e92a34438a
github.com/BurntSushi/toml v0.3.1 github.com/BurntSushi/toml v0.3.1
github.com/NebulousLabs/Sia v1.3.7 github.com/NebulousLabs/Sia v1.3.7
github.com/NebulousLabs/errors v0.0.0-20181203160057-9f787ce8f69e // indirect github.com/NebulousLabs/errors v0.0.0-20181203160057-9f787ce8f69e // indirect
...@@ -33,6 +33,7 @@ require ( ...@@ -33,6 +33,7 @@ require (
github.com/pkg/errors v0.9.1 github.com/pkg/errors v0.9.1
github.com/robertkrimen/otto v0.0.0-20180617131154-15f95af6e78d github.com/robertkrimen/otto v0.0.0-20180617131154-15f95af6e78d
github.com/rs/cors v1.7.0 github.com/rs/cors v1.7.0
github.com/shopspring/decimal v1.2.0
github.com/spf13/cobra v1.1.1 github.com/spf13/cobra v1.1.1
github.com/stretchr/testify v1.7.0 github.com/stretchr/testify v1.7.0
github.com/tjfoc/gmsm v1.3.2 github.com/tjfoc/gmsm v1.3.2
...@@ -44,4 +45,5 @@ require ( ...@@ -44,4 +45,5 @@ require (
google.golang.org/protobuf v1.27.1 google.golang.org/protobuf v1.27.1
gopkg.in/sourcemap.v1 v1.0.5 // indirect gopkg.in/sourcemap.v1 v1.0.5 // indirect
gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v2 v2.4.0
gotest.tools v2.2.0+incompatible
) )
...@@ -48,10 +48,8 @@ dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBr ...@@ -48,10 +48,8 @@ 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.20211025083411-82c4406c6701 h1:XrlmULs3WrRHCJm/isW5WCiH3WlfeFgZHWDY0ZarVTI= github.com/33cn/chain33 v1.65.6-0.20211130044919-77e92a34438a h1:jLm8iWEWpWk0+dQZK7cQUFOxUhACsJ1heDc5Pme+drc=
github.com/33cn/chain33 v1.65.6-0.20211025083411-82c4406c6701/go.mod h1:27Z1b54wJ6EhE1IGA3S5AxSQ/t8dktFVgPnkLNbMFoE= github.com/33cn/chain33 v1.65.6-0.20211130044919-77e92a34438a/go.mod h1:27Z1b54wJ6EhE1IGA3S5AxSQ/t8dktFVgPnkLNbMFoE=
github.com/33cn/chain33 v1.65.6-0.20211118074307-04e724cee41c h1:XLvYVstAXMuDpVHNAzW/7jV3e/LlTa+z8i7zLLiwK0E=
github.com/33cn/chain33 v1.65.6-0.20211118074307-04e724cee41c/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=
github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M=
...@@ -2244,6 +2242,7 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= ...@@ -2244,6 +2242,7 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o=
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
......
...@@ -834,7 +834,7 @@ func (cs *ConsensusState) createProposalBlock() (block *ttypes.QbftBlock) { ...@@ -834,7 +834,7 @@ func (cs *ConsensusState) createProposalBlock() (block *ttypes.QbftBlock) {
// Mempool validated transactions // Mempool validated transactions
beg := time.Now() beg := time.Now()
pblock := cs.client.BuildBlock() pblock := cs.client.BuildBlock(cs.Height - 1)
if pblock == nil { if pblock == nil {
qbftlog.Error("createProposalBlock BuildBlock fail") qbftlog.Error("createProposalBlock BuildBlock fail")
return nil return nil
...@@ -1252,7 +1252,9 @@ func (cs *ConsensusState) finalizeCommit(height int64) { ...@@ -1252,7 +1252,9 @@ func (cs *ConsensusState) finalizeCommit(height int64) {
// commit block // commit block
commitBlock := cs.ProposalBlock.Data commitBlock := cs.ProposalBlock.Data
cs.client.CommitBlock(commitBlock) if !DetachExec() {
cs.client.CommitBlock(commitBlock.Clone())
}
if bytes.Equal(cs.privValidator.GetAddress(), block.QbftBlock.Header.ProposerAddr) { if bytes.Equal(cs.privValidator.GetAddress(), block.QbftBlock.Header.ProposerAddr) {
qbftlog.Info(fmt.Sprintf("Proposer reach consensus. Current: %v/%v/%v", cs.Height, cs.Round, cs.Step), qbftlog.Info(fmt.Sprintf("Proposer reach consensus. Current: %v/%v/%v", cs.Height, cs.Round, cs.Step),
"CommitRound", cs.CommitRound, "tx-len", len(commitBlock.Txs), "cost", types.Since(cs.begCons), "CommitRound", cs.CommitRound, "tx-len", len(commitBlock.Txs), "cost", types.Since(cs.begCons),
...@@ -1264,10 +1266,7 @@ func (cs *ConsensusState) finalizeCommit(height int64) { ...@@ -1264,10 +1266,7 @@ func (cs *ConsensusState) finalizeCommit(height int64) {
"proposer-addr", fmt.Sprintf("%X", ttypes.Fingerprint(block.QbftBlock.Header.ProposerAddr)), "proposer-addr", fmt.Sprintf("%X", ttypes.Fingerprint(block.QbftBlock.Header.ProposerAddr)),
"seq", block.Header.Sequence) "seq", block.Header.Sequence)
} }
reqblock, err := cs.client.RequestBlock(height) reqblock := cs.client.WaitBlock(height)
if err != nil {
panic(fmt.Sprintf("finalizeCommit RequestBlock fail: %v", err))
}
stateCopy.LastResultsHash = reqblock.Hash(cs.client.GetAPI().GetConfig()) stateCopy.LastResultsHash = reqblock.Hash(cs.client.GetAPI().GetConfig())
//check whether need update validator nodes //check whether need update validator nodes
...@@ -1428,6 +1427,11 @@ func (cs *ConsensusState) addProposalBlock(proposalBlock *tmtypes.QbftBlock) (er ...@@ -1428,6 +1427,11 @@ func (cs *ConsensusState) addProposalBlock(proposalBlock *tmtypes.QbftBlock) (er
qbftlog.Info(fmt.Sprintf("Consensus set proposal block. Current: %v/%v/%v", cs.Height, cs.Round, cs.Step), qbftlog.Info(fmt.Sprintf("Consensus set proposal block. Current: %v/%v/%v", cs.Height, cs.Round, cs.Step),
"ProposalBlockHash", fmt.Sprintf("%X", cs.ProposalBlockHash), "cost", types.Since(cs.begCons)) "ProposalBlockHash", fmt.Sprintf("%X", cs.ProposalBlockHash), "cost", types.Since(cs.begCons))
if DetachExec() {
qbftlog.Info("write proposal block in advance")
go cs.client.CommitBlock(cs.ProposalBlock.Data.Clone())
}
// Update Valid* if we can. // Update Valid* if we can.
prevotes := cs.Votes.Prevotes(cs.Round) prevotes := cs.Votes.Prevotes(cs.Round)
blockID, hasTwoThirds := prevotes.TwoThirdsMajority() blockID, hasTwoThirds := prevotes.TwoThirdsMajority()
......
...@@ -215,7 +215,7 @@ func validateBlock(stateDB *CSStateDB, s State, b *ttypes.QbftBlock) error { ...@@ -215,7 +215,7 @@ func validateBlock(stateDB *CSStateDB, s State, b *ttypes.QbftBlock) error {
// validate prev block info // validate prev block info
if !bytes.Equal(b.Header.LastBlockID.Hash, s.LastBlockID.Hash) { if !bytes.Equal(b.Header.LastBlockID.Hash, s.LastBlockID.Hash) {
return fmt.Errorf("Wrong Block.Header.LastBlockID. Expected %v, got %v", s.LastBlockID, b.Header.LastBlockID) return fmt.Errorf("Wrong Block.Header.LastBlockID. Expected %X, got %X", s.LastBlockID.Hash, b.Header.LastBlockID.Hash)
} }
newTxs := b.Header.NumTxs newTxs := b.Header.NumTxs
...@@ -225,16 +225,16 @@ func validateBlock(stateDB *CSStateDB, s State, b *ttypes.QbftBlock) error { ...@@ -225,16 +225,16 @@ func validateBlock(stateDB *CSStateDB, s State, b *ttypes.QbftBlock) error {
// validate app info // validate app info
if !bytes.Equal(b.Header.AppHash, s.AppHash) { if !bytes.Equal(b.Header.AppHash, s.AppHash) {
return fmt.Errorf("Wrong Block.Header.AppHash. Expected %X, got %v", s.AppHash, b.Header.AppHash) return fmt.Errorf("Wrong Block.Header.AppHash. Expected %X, got %X", s.AppHash, b.Header.AppHash)
} }
if !bytes.Equal(b.Header.ConsensusHash, s.ConsensusParams.Hash()) { if !bytes.Equal(b.Header.ConsensusHash, s.ConsensusParams.Hash()) {
return fmt.Errorf("Wrong Block.Header.ConsensusHash. Expected %X, got %v", s.ConsensusParams.Hash(), b.Header.ConsensusHash) return fmt.Errorf("Wrong Block.Header.ConsensusHash. Expected %X, got %X", s.ConsensusParams.Hash(), b.Header.ConsensusHash)
} }
if !bytes.Equal(b.Header.LastResultsHash, s.LastResultsHash) { if !bytes.Equal(b.Header.LastResultsHash, s.LastResultsHash) {
return fmt.Errorf("Wrong Block.Header.LastResultsHash. Expected %X, got %v", s.LastResultsHash, b.Header.LastResultsHash) return fmt.Errorf("Wrong Block.Header.LastResultsHash. Expected %X, got %X", s.LastResultsHash, b.Header.LastResultsHash)
} }
if !bytes.Equal(b.Header.ValidatorsHash, s.Validators.Hash()) { if !bytes.Equal(b.Header.ValidatorsHash, s.Validators.Hash()) {
return fmt.Errorf("Wrong Block.Header.ValidatorsHash. Expected %X, got %v", s.Validators.Hash(), b.Header.ValidatorsHash) return fmt.Errorf("Wrong Block.Header.ValidatorsHash. Expected %X, got %X", s.Validators.Hash(), b.Header.ValidatorsHash)
} }
// Validate block LastCommit. // Validate block LastCommit.
......
...@@ -482,37 +482,47 @@ func (pc *peerConn) stopForError(r interface{}) { ...@@ -482,37 +482,47 @@ func (pc *peerConn) stopForError(r interface{}) {
} }
} }
// 数据压缩后发送, 内部对相关数组进行重复利用 // 数据压缩
func encodeMsg(msg types.Message, pbuf *[]byte, typeID byte) []byte { func encodeMsg(msg types.Message, typeID byte) []byte {
buf := *pbuf
buf = buf[:cap(buf)]
raw := types.Encode(msg) raw := types.Encode(msg)
buf = snappy.Encode(buf, raw) cmp := byte(0)
if len(raw) > MaxMsgPacketPayloadSize { if len(raw) > MaxMsgPacketPayloadSize {
qbftlog.Info("packet exceed max size", "old", len(raw), "new", len(buf)) buf := make([]byte, 0)
buf = snappy.Encode(buf, raw)
cmp = byte(1)
qbftlog.Info("compress large message", "old", len(raw), "new", len(buf))
raw = buf
}
ebuf := make([]byte, len(raw)+6)
ebuf[0] = typeID
ebuf[1] = cmp
bytelen := make([]byte, 4)
binary.BigEndian.PutUint32(bytelen, uint32(len(raw)))
copy(ebuf[2:6], bytelen)
copy(ebuf[6:], raw)
return ebuf
}
// 数据解压
func decodeMsg(msg []byte, cmp byte) ([]byte, error) {
if cmp == byte(0) {
return msg, nil
} }
*pbuf = buf buf := make([]byte, 0)
// 复用raw数组作为压缩数据返回, 需要比较容量是否够大 buf, err := snappy.Decode(buf, msg)
if cap(raw) >= len(buf)+5 { if err != nil {
raw = raw[:len(buf)+5] return nil, err
} else {
raw = make([]byte, len(buf)+5)
} }
raw[0] = typeID qbftlog.Info("uncompress large message", "old", len(msg), "new", len(buf))
bytelen := make([]byte, 4) return buf, nil
binary.BigEndian.PutUint32(bytelen, uint32(len(buf)))
copy(raw[1:5], bytelen)
copy(raw[5:], buf)
return raw
} }
func (pc *peerConn) sendRoutine() { func (pc *peerConn) sendRoutine() {
buf := make([]byte, 0)
FOR_LOOP: FOR_LOOP:
for { for {
select { select {
case msg := <-pc.sendQueue: case msg := <-pc.sendQueue:
raw := encodeMsg(msg.Msg, &buf, msg.TypeID) raw := encodeMsg(msg.Msg, msg.TypeID)
_, err := pc.bufWriter.Write(raw) _, err := pc.bufWriter.Write(raw)
if err != nil { if err != nil {
qbftlog.Error("peerConn sendroutine write data failed", "error", err) qbftlog.Error("peerConn sendroutine write data failed", "error", err)
...@@ -533,40 +543,41 @@ FOR_LOOP: ...@@ -533,40 +543,41 @@ FOR_LOOP:
func (pc *peerConn) recvRoutine() { func (pc *peerConn) recvRoutine() {
FOR_LOOP: FOR_LOOP:
for { for {
//typeID+msgLen+msg //typeID+cmp+msgLen+msg
var buf [5]byte var buf [6]byte
_, err := io.ReadFull(pc.bufReader, buf[:]) _, err := io.ReadFull(pc.bufReader, buf[:])
if err != nil { if err != nil {
qbftlog.Error("Connection failed @ recvRoutine (reading byte)", "conn", pc, "err", err) qbftlog.Error("recvRoutine read byte fail", "conn", pc, "err", err)
pc.stopForError(err) pc.stopForError(err)
break FOR_LOOP break FOR_LOOP
} }
pkt := msgPacket{} pkt := msgPacket{}
pkt.TypeID = buf[0] pkt.TypeID = buf[0]
len := binary.BigEndian.Uint32(buf[1:]) cmp := buf[1]
if len > 0 { msgLen := binary.BigEndian.Uint32(buf[2:6])
buf2 := make([]byte, len) if msgLen <= 0 {
_, err = io.ReadFull(pc.bufReader, buf2) qbftlog.Error("recvRoutine read invalid data", "msgLen", msgLen, "cmp", cmp, "peerIP", pc.ip.String())
if err != nil { continue
qbftlog.Error("recvRoutine read data fail", "conn", pc, "err", err) }
pc.stopForError(err) buf2 := make([]byte, msgLen)
} _, err = io.ReadFull(pc.bufReader, buf2)
buf3 := make([]byte, len) if err != nil {
buf3, err = snappy.Decode(buf3, buf2) qbftlog.Error("recvRoutine read data fail", "err", err, "peerIP", pc.ip.String())
if err != nil { continue
qbftlog.Error("recvRoutine snappy decode fail", "conn", pc, "err", err)
pc.stopForError(err)
}
pkt.Bytes = buf3
} }
buf3, err := decodeMsg(buf2, cmp)
if err != nil {
qbftlog.Error("recvRoutine decode msg fail", "err", err, "peerIP", pc.ip.String())
continue
}
pkt.Bytes = buf3
if v, ok := ttypes.MsgMap[pkt.TypeID]; ok { if v, ok := ttypes.MsgMap[pkt.TypeID]; ok {
realMsg := reflect.New(v).Interface() realMsg := reflect.New(v).Interface()
err := proto.Unmarshal(pkt.Bytes, realMsg.(proto.Message)) err := proto.Unmarshal(pkt.Bytes, realMsg.(proto.Message))
if err != nil { if err != nil {
qbftlog.Error("peerConn recvRoutine Unmarshal data failed", "err", err) qbftlog.Error("recvRoutine Unmarshal data fail", "msgTy", pkt.TypeID, "msgLen", len(pkt.Bytes), "err", err, "peerIP", pc.ip.String())
continue continue
} }
if pc.transferChannel != nil && (pkt.TypeID == ttypes.ProposalID || pkt.TypeID == ttypes.VoteID || if pc.transferChannel != nil && (pkt.TypeID == ttypes.ProposalID || pkt.TypeID == ttypes.VoteID ||
...@@ -595,12 +606,8 @@ FOR_LOOP: ...@@ -595,12 +606,8 @@ FOR_LOOP:
pc.updateStateQueue <- MsgInfo{pkt.TypeID, realMsg.(proto.Message), pc.ID(), pc.ip.String()} pc.updateStateQueue <- MsgInfo{pkt.TypeID, realMsg.(proto.Message), pc.ID(), pc.ip.String()}
} }
} else { } else {
err := fmt.Errorf("Unknown message type %v", pkt.TypeID) qbftlog.Error("receive unknown message type", "type", pkt.TypeID, "peerIP", pc.ip.String())
qbftlog.Error("Connection failed @ recvRoutine", "conn", pc, "err", err)
pc.stopForError(err)
break FOR_LOOP
} }
} }
pc.quitUpdate <- struct{}{} pc.quitUpdate <- struct{}{}
pc.quitBeat <- struct{}{} pc.quitBeat <- struct{}{}
......
...@@ -59,6 +59,7 @@ var ( ...@@ -59,6 +59,7 @@ var (
useAggSig atomic.Value // false useAggSig atomic.Value // false
multiBlocks atomic.Value // 1 multiBlocks atomic.Value // 1
gossipVotes atomic.Value gossipVotes atomic.Value
detachExec atomic.Value // false
zeroHash [32]byte zeroHash [32]byte
random *rand.Rand random *rand.Rand
...@@ -112,6 +113,7 @@ type subConfig struct { ...@@ -112,6 +113,7 @@ type subConfig struct {
UseAggregateSignature bool `json:"useAggregateSignature"` UseAggregateSignature bool `json:"useAggregateSignature"`
MultiBlocks int64 `json:"multiBlocks"` MultiBlocks int64 `json:"multiBlocks"`
MessageInterval int32 `json:"messageInterval"` MessageInterval int32 `json:"messageInterval"`
DetachExecution bool `json:"detachExecution"`
} }
func applyConfig(cfg *types.Consensus, sub []byte) { func applyConfig(cfg *types.Consensus, sub []byte) {
...@@ -166,6 +168,7 @@ func applyConfig(cfg *types.Consensus, sub []byte) { ...@@ -166,6 +168,7 @@ func applyConfig(cfg *types.Consensus, sub []byte) {
if subcfg.MessageInterval > 0 { if subcfg.MessageInterval > 0 {
peerGossipSleepDuration.Store(subcfg.MessageInterval) peerGossipSleepDuration.Store(subcfg.MessageInterval)
} }
detachExec.Store(subcfg.DetachExecution)
gossipVotes.Store(true) gossipVotes.Store(true)
} }
...@@ -175,6 +178,11 @@ func UseAggSig() bool { ...@@ -175,6 +178,11 @@ func UseAggSig() bool {
return useAggSig.Load().(bool) return useAggSig.Load().(bool)
} }
// DetachExec returns whether detach Execution from Consensus
func DetachExec() bool {
return detachExec.Load().(bool)
}
// DefaultDBProvider returns a database // DefaultDBProvider returns a database
func DefaultDBProvider(name string) dbm.DB { func DefaultDBProvider(name string) dbm.DB {
return dbm.NewDB(name, "leveldb", dbPath, 0) return dbm.NewDB(name, "leveldb", dbPath, 0)
...@@ -230,7 +238,7 @@ func New(cfg *types.Consensus, sub []byte) queue.Module { ...@@ -230,7 +238,7 @@ func New(cfg *types.Consensus, sub []byte) queue.Module {
} }
qbftlog.Info("show qbft info", "version", qbftVersion, "sign", ttypes.CryptoName, "useAggSig", UseAggSig(), qbftlog.Info("show qbft info", "version", qbftVersion, "sign", ttypes.CryptoName, "useAggSig", UseAggSig(),
"genesisFile", genesisFile, "privFile", privFile) "detachExec", DetachExec(), "genesisFile", genesisFile, "privFile", privFile)
ttypes.InitMessageMap() ttypes.InitMessageMap()
...@@ -526,12 +534,8 @@ func (client *Client) CheckTxDup(txs []*types.Transaction, height int64) (transa ...@@ -526,12 +534,8 @@ func (client *Client) CheckTxDup(txs []*types.Transaction, height int64) (transa
} }
// BuildBlock build a new block // BuildBlock build a new block
func (client *Client) BuildBlock() *types.Block { func (client *Client) BuildBlock(height int64) *types.Block {
lastBlock, err := client.RequestLastBlock() lastBlock := client.WaitBlock(height)
if err != nil {
qbftlog.Error("BuildBlock fail", "err", err)
return nil
}
cfg := client.GetAPI().GetConfig() cfg := client.GetAPI().GetConfig()
txs := client.RequestTx(int(cfg.GetP(lastBlock.Height+1).MaxTxNumber)-1, nil) txs := client.RequestTx(int(cfg.GetP(lastBlock.Height+1).MaxTxNumber)-1, nil)
// placeholder // placeholder
...@@ -561,7 +565,7 @@ func (client *Client) CommitBlock(block *types.Block) { ...@@ -561,7 +565,7 @@ func (client *Client) CommitBlock(block *types.Block) {
} }
// WaitBlock by height // WaitBlock by height
func (client *Client) WaitBlock(height int64) bool { func (client *Client) WaitBlock(height int64) *types.Block {
ticker := time.NewTicker(10 * time.Second) ticker := time.NewTicker(10 * time.Second)
defer ticker.Stop() defer ticker.Stop()
...@@ -570,13 +574,16 @@ func (client *Client) WaitBlock(height int64) bool { ...@@ -570,13 +574,16 @@ func (client *Client) WaitBlock(height int64) bool {
select { select {
case <-client.ctx.Done(): case <-client.ctx.Done():
qbftlog.Info("WaitBlock quit") qbftlog.Info("WaitBlock quit")
return false return nil
case <-ticker.C: case <-ticker.C:
qbftlog.Info("Still waiting block......", "height", height, "cost", time.Since(beg)) qbftlog.Info("Still waiting block......", "height", height, "cost", time.Since(beg))
default: default:
newHeight, err := client.getLastHeight() newHeight, err := client.getLastHeight()
if err == nil && newHeight >= height { if err == nil && newHeight >= height {
return true block, err := client.RequestBlock(height)
if err == nil {
return block
}
} }
time.Sleep(50 * time.Millisecond) time.Sleep(50 * time.Millisecond)
} }
......
...@@ -60,11 +60,11 @@ func main() { ...@@ -60,11 +60,11 @@ func main() {
} }
Perf(argsWithoutProg[1], argsWithoutProg[2], argsWithoutProg[3], argsWithoutProg[4], argsWithoutProg[5]) Perf(argsWithoutProg[1], argsWithoutProg[2], argsWithoutProg[3], argsWithoutProg[4], argsWithoutProg[5])
case "perfV2": case "perfV2":
if len(argsWithoutProg) != 4 { if len(argsWithoutProg) != 5 {
fmt.Print(errors.New("参数错误").Error()) fmt.Print(errors.New("参数错误").Error())
return return
} }
PerfV2(argsWithoutProg[1], argsWithoutProg[2], argsWithoutProg[3]) PerfV2(argsWithoutProg[1], argsWithoutProg[2], argsWithoutProg[3], argsWithoutProg[4])
case "put": case "put":
if len(argsWithoutProg) != 3 { if len(argsWithoutProg) != 3 {
fmt.Print(errors.New("参数错误").Error()) fmt.Print(errors.New("参数错误").Error())
...@@ -96,7 +96,7 @@ func main() { ...@@ -96,7 +96,7 @@ func main() {
func LoadHelp() { func LoadHelp() {
fmt.Println("Available Commands:") fmt.Println("Available Commands:")
fmt.Println("perf [host, size, num, interval, duration] : 写数据性能测试,interval单位为100毫秒,host形式为ip:port") fmt.Println("perf [host, size, num, interval, duration] : 写数据性能测试,interval单位为100毫秒,host形式为ip:port")
fmt.Println("perfV2 [host, size, duration] : 写数据性能测试,host形式为ip:port") fmt.Println("perfV2 [host, size, interval, duration] : 写数据性能测试,interval单位为秒,host形式为ip:port")
fmt.Println("put [ip, size] : 写数据") fmt.Println("put [ip, size] : 写数据")
fmt.Println("get [ip, hash] : 读数据") fmt.Println("get [ip, hash] : 读数据")
fmt.Println("valnode [ip, pubkey, power] : 增加/删除/修改tendermint节点") fmt.Println("valnode [ip, pubkey, power] : 增加/删除/修改tendermint节点")
...@@ -232,16 +232,17 @@ func Perf(host, txsize, num, sleepinterval, totalduration string) { ...@@ -232,16 +232,17 @@ func Perf(host, txsize, num, sleepinterval, totalduration string) {
} }
// PerfV2 // PerfV2
func PerfV2(host, txsize, duration string) { func PerfV2(host, txsize, sleepinterval, duration string) {
durInt, _ := strconv.Atoi(duration) durInt, _ := strconv.Atoi(duration)
sizeInt, _ := strconv.Atoi(txsize) sizeInt, _ := strconv.Atoi(txsize)
sleep, _ := strconv.Atoi(sleepinterval)
numCPU := runtime.NumCPU() numCPU := runtime.NumCPU()
numThread := numCPU * 2 numThread := numCPU
numSend := numCPU * 3 numSend := numCPU * 2
ch := make(chan struct{}, numThread) ch := make(chan struct{}, numThread)
chSend := make(chan struct{}, numSend) chSend := make(chan struct{}, numSend)
numInt := 10000 numInt := 10000
batchNum := 200 batchNum := 100
txChan := make(chan *types.Transaction, numInt) txChan := make(chan *types.Transaction, numInt)
var blockHeight int64 var blockHeight int64
total := int64(0) total := int64(0)
...@@ -307,24 +308,42 @@ func PerfV2(host, txsize, duration string) { ...@@ -307,24 +308,42 @@ func PerfV2(host, txsize, duration string) {
defer conn.Close() defer conn.Close()
gcli := types.NewChain33Client(conn) gcli := types.NewChain33Client(conn)
txs := &types.Transactions{Txs: make([]*types.Transaction, 0, batchNum)} txs := &types.Transactions{Txs: make([]*types.Transaction, 0, batchNum)}
retryTxs := make([]*types.Transaction, 0, batchNum*2)
for tx := range txChan { for tx := range txChan {
txs.Txs = append(txs.Txs, tx) txs.Txs = append(txs.Txs, tx)
if len(txs.Txs) == batchNum { if len(retryTxs) > 0 {
_, err := gcli.SendTransactions(context.Background(), txs) txs.Txs = append(txs.Txs, retryTxs...)
atomic.AddInt64(&total, int64(batchNum)) retryTxs = retryTxs[:0]
txs.Txs = txs.Txs[:0] }
if len(txs.Txs) >= batchNum {
reps, err := gcli.SendTransactions(context.Background(), txs)
if err != nil { if err != nil {
if strings.Contains(err.Error(), "ErrChannelClosed") { log.Error("sendtxs", "err", err)
return
}
atomic.AddInt64(&total, int64(len(txs.Txs)))
// retry failed txs
for index, reply := range reps.GetReplyList() {
if reply.IsOk {
continue
}
if string(reply.GetMsg()) == types.ErrChannelClosed.Error() {
return return
} }
log.Error("sendtx", "err", err.Error()) if string(reply.GetMsg()) == types.ErrMemFull.Error() ||
time.Sleep(time.Second) string(reply.GetMsg()) == types.ErrManyTx.Error() {
continue retryTxs = append(retryTxs, txs.Txs[index])
}
} }
atomic.AddInt64(&success, int64(batchNum)) atomic.AddInt64(&success, int64(len(txs.Txs)-len(retryTxs)))
if len(retryTxs) > 0 {
time.Sleep(time.Second * time.Duration(sleep))
}
txs.Txs = txs.Txs[:0]
} }
} }
chSend <- struct{}{} chSend <- struct{}{}
}() }()
......
...@@ -29,8 +29,8 @@ func init() { ...@@ -29,8 +29,8 @@ func init() {
//InitFork ... //InitFork ...
func InitFork(cfg *types.Chain33Config) { func InitFork(cfg *types.Chain33Config) {
cfg.RegisterDappFork(AutonomyX, "Enable", 0) cfg.RegisterDappFork(AutonomyX, "Enable", 0)
cfg.RegisterDappFork(AutonomyX, ForkAutonomyDelRule, 9500000) cfg.RegisterDappFork(AutonomyX, ForkAutonomyDelRule, 0)
cfg.RegisterDappFork(AutonomyX, ForkAutonomyEnableItem, 10000000) cfg.RegisterDappFork(AutonomyX, ForkAutonomyEnableItem, 0)
} }
//InitExecutor ... //InitExecutor ...
......
...@@ -30,8 +30,8 @@ func init() { ...@@ -30,8 +30,8 @@ func init() {
//InitFork ... //InitFork ...
func InitFork(cfg *types.Chain33Config) { func InitFork(cfg *types.Chain33Config) {
cfg.RegisterDappFork(BlackwhiteX, "ForkBlackWhiteV2", 900000) cfg.RegisterDappFork(BlackwhiteX, "ForkBlackWhiteV2", 0)
cfg.RegisterDappFork(BlackwhiteX, "Enable", 850000) cfg.RegisterDappFork(BlackwhiteX, "Enable", 0)
} }
//InitExecutor ... //InitExecutor ...
......
...@@ -5,8 +5,8 @@ services: ...@@ -5,8 +5,8 @@ services:
build: build:
context: . context: .
dockerfile: Dockerfile-bridgevmxgo dockerfile: Dockerfile-bridgevmxgo
ports: #ports:
- "9901:9901" # - "9901:9901"
ebrelayerb: ebrelayerb:
build: build:
...@@ -29,9 +29,9 @@ services: ...@@ -29,9 +29,9 @@ services:
PARAFILE: "/root/chain33.para33.toml" PARAFILE: "/root/chain33.para33.toml"
expose: expose:
- "8802" - "8802"
ports: #ports:
- "8801:8801" # - "8801:8801"
- "8901:8901" # - "8901:8901"
chain32: chain32:
entrypoint: /root/entrypoint.sh entrypoint: /root/entrypoint.sh
......
...@@ -1020,6 +1020,45 @@ function Testethereum2EVMToChain33_usdt() { ...@@ -1020,6 +1020,45 @@ function Testethereum2EVMToChain33_usdt() {
echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}" echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
} }
function Testethereum2EVMToChain33_usdt() {
# 查询 ETH 这端 bridgeBank 地址原来是
result=$(${CLIA} ethereum balance -o "${ethBridgeBank}" -t "${ethereumUSDTERC20TokenAddr}")
# cli_ret "${result}" "balance" ".balance" "0"
# ETH 这端 lock 12个
result=$(${CLIA} ethereum lock -m 12 -k "${ethTestAddrKey1}" -r "${chain33ReceiverAddr}" -t "${ethereumUSDTERC20TokenAddr}")
cli_ret "${result}" "lock"
# eth 等待 2 个区块
sleep 4
# 查询 ETH 这端 bridgeBank 地址 12
result=$(${CLIA} ethereum balance -o "${ethBridgeBank}" -t "${ethereumUSDTERC20TokenAddr}")
# cli_ret "${result}" "balance" ".balance" "12"
sleep ${maturityDegree}
# chain33 chain33EthBridgeTokenAddr(ETH合约中)查询 lock 金额
result=$(${Chain33Cli} evm query -a "${chain33USDTBridgeTokenAddr}" -c "${chain33TestAddr1}" -b "balanceOf(${chain33ReceiverAddr})")
# 结果是 7 * le8
# is_equal "${result}" "700000000"
updateConfig "USDT" "${chain33USDTBridgeTokenAddr}"
configbridgevmxgoAddr "${XgoChain33BridgeBank}"
${EvmxgoBoss4xCLI} chain33 offline approve_erc20 -a 330000000000 -s "${XgoChain33BridgeBank}" -c "${chain33USDTBridgeTokenAddr}" -k "${chain33ReceiverAddrKey}" -f 1 --chainID "${chain33ID}"
chain33_offline_send_evm "approve_erc20.txt"
hash=$(${Chain33Cli} send evm call -f 1 -k "${chain33ReceiverAddr}" -e "${XgoChain33BridgeBank}" -p "lock(${chain33TestAddr2}, ${chain33USDTBridgeTokenAddr}, 500000000)" --chainID "${chain33ID}")
check_tx "${Chain33Cli}" "${hash}"
result=$(${Chain33Cli} evm query -a "${chain33USDTBridgeTokenAddr}" -c "${chain33DeployAddr}" -b "balanceOf(${chain33ReceiverAddr})")
# is_equal "${result}" "4200000000"
result=$(${Chain33Cli} evm query -a "${chain33USDTBridgeTokenAddr}" -c "${chain33DeployAddr}" -b "balanceOf(${XgoChain33BridgeBank})")
# is_equal "${result}" "500000000"
}
function AllRelayerMainTest() { function AllRelayerMainTest() {
set +e set +e
......
...@@ -5,7 +5,10 @@ ...@@ -5,7 +5,10 @@
package executor package executor
import ( import (
"math"
"github.com/33cn/chain33/common/db/table" "github.com/33cn/chain33/common/db/table"
"github.com/shopspring/decimal"
"github.com/33cn/chain33/account" "github.com/33cn/chain33/account"
"github.com/33cn/chain33/common" "github.com/33cn/chain33/common"
...@@ -569,12 +572,25 @@ func (action *Action) CollateralizeBorrow(borrow *pty.CollateralizeBorrow) (*typ ...@@ -569,12 +572,25 @@ func (action *Action) CollateralizeBorrow(borrow *pty.CollateralizeBorrow) (*typ
return nil, err return nil, err
} }
// 精度转换 #1024
// token精度转成精度8
valueReal := borrow.GetValue()
cfg := action.Collateralize.GetAPI().GetConfig()
if cfg.IsDappFork(action.Collateralize.GetHeight(), pty.CollateralizeX, pty.ForkCollateralizePrecision) {
precisionNum := int(math.Log10(float64(cfg.GetTokenPrecision())))
valueReal = decimal.NewFromInt(valueReal).Shift(int32(-precisionNum)).Shift(8).IntPart()
}
// 根据价格和需要借贷的金额,计算需要质押的抵押物数量 // 根据价格和需要借贷的金额,计算需要质押的抵押物数量
btyFrozen, err := getBtyNumToFrozen(borrow.GetValue(), lastPrice, coll.LiquidationRatio) btyFrozen, err := getBtyNumToFrozen(valueReal, lastPrice, coll.LiquidationRatio)
if err != nil { if err != nil {
clog.Error("CollateralizeBorrow.getBtyNumToFrozen", "CollID", coll.CollateralizeId, "addr", action.fromaddr, "execaddr", action.execaddr, "error", err) clog.Error("CollateralizeBorrow.getBtyNumToFrozen", "CollID", coll.CollateralizeId, "addr", action.fromaddr, "execaddr", action.execaddr, "error", err)
return nil, err return nil, err
} }
// bty精度8转成coins精度
if cfg.IsDappFork(action.Collateralize.GetHeight(), pty.CollateralizeX, pty.ForkCollateralizePrecision) {
precisionNum := int(math.Log10(float64(cfg.GetCoinPrecision())))
btyFrozen = decimal.NewFromInt(btyFrozen).Shift(-8).Shift(int32(precisionNum)).IntPart()
}
// 检查抵押物账户余额 // 检查抵押物账户余额
if !action.CheckExecAccountBalance(action.fromaddr, btyFrozen, 0) { if !action.CheckExecAccountBalance(action.fromaddr, btyFrozen, 0) {
...@@ -680,8 +696,22 @@ func (action *Action) CollateralizeRepay(repay *pty.CollateralizeRepay) (*types. ...@@ -680,8 +696,22 @@ func (action *Action) CollateralizeRepay(repay *pty.CollateralizeRepay) (*types.
return nil, pty.ErrRecordNotExist return nil, pty.ErrRecordNotExist
} }
// 精度转换 #1024
// token精度转成精度8
cfg := action.Collateralize.GetAPI().GetConfig()
valueReal := borrowRecord.DebtValue
if cfg.IsDappFork(action.Collateralize.GetHeight(), pty.CollateralizeX, pty.ForkCollateralizePrecision) {
precisionNum := int(math.Log10(float64(cfg.GetTokenPrecision())))
valueReal = decimal.NewFromInt(valueReal).Shift(int32(-precisionNum)).Shift(8).IntPart()
}
// 借贷金额+利息 // 借贷金额+利息
fee := ((borrowRecord.DebtValue * coll.StabilityFeeRatio) / 1e8) * 1e4 fee := ((valueReal * coll.StabilityFeeRatio) / 1e8) * 1e4
// 精度8转成token精度
if cfg.IsDappFork(action.Collateralize.GetHeight(), pty.CollateralizeX, pty.ForkCollateralizePrecision) {
precisionNum := int(math.Log10(float64(cfg.GetTokenPrecision())))
fee = decimal.NewFromInt(fee).Shift(-8).Shift(int32(precisionNum)).IntPart()
}
realRepay := borrowRecord.DebtValue + fee realRepay := borrowRecord.DebtValue + fee
// 检查 // 检查
...@@ -813,7 +843,17 @@ func (action *Action) CollateralizeAppend(cAppend *pty.CollateralizeAppend) (*ty ...@@ -813,7 +843,17 @@ func (action *Action) CollateralizeAppend(cAppend *pty.CollateralizeAppend) (*ty
// 构造借出记录 // 构造借出记录
borrowRecord.CollateralValue += cAppend.CollateralValue borrowRecord.CollateralValue += cAppend.CollateralValue
borrowRecord.CollateralPrice = lastPrice borrowRecord.CollateralPrice = lastPrice
borrowRecord.LiquidationPrice = calcLiquidationPrice(borrowRecord.DebtValue, borrowRecord.CollateralValue)
// 精度转换 #1024
cfg := action.Collateralize.GetAPI().GetConfig()
debtValueReal := borrowRecord.DebtValue
collateralValueReal := borrowRecord.CollateralValue
if cfg.IsDappFork(action.Collateralize.GetHeight(), pty.CollateralizeX, pty.ForkCollateralizePrecision) {
precisionNum := int(math.Log10(float64(cfg.GetTokenPrecision())))
debtValueReal = decimal.NewFromInt(debtValueReal).Shift(int32(-precisionNum)).Shift(8).IntPart()
collateralValueReal = decimal.NewFromInt(collateralValueReal).Shift(int32(-precisionNum)).Shift(8).IntPart()
}
borrowRecord.LiquidationPrice = calcLiquidationPrice(debtValueReal, collateralValueReal)
if borrowRecord.LiquidationPrice*PriceWarningRate < lastPrice { if borrowRecord.LiquidationPrice*PriceWarningRate < lastPrice {
// 告警解除 // 告警解除
if borrowRecord.Status == pty.CollateralizeUserStatusWarning { if borrowRecord.Status == pty.CollateralizeUserStatusWarning {
......
...@@ -30,6 +30,7 @@ func init() { ...@@ -30,6 +30,7 @@ func init() {
func InitFork(cfg *types.Chain33Config) { func InitFork(cfg *types.Chain33Config) {
cfg.RegisterDappFork(CollateralizeX, "Enable", 0) cfg.RegisterDappFork(CollateralizeX, "Enable", 0)
cfg.RegisterDappFork(CollateralizeX, ForkCollateralizeTableUpdate, 0) cfg.RegisterDappFork(CollateralizeX, ForkCollateralizeTableUpdate, 0)
cfg.RegisterDappFork(CollateralizeX, ForkCollateralizePrecision, 0)
} }
//InitExecutor ... //InitExecutor ...
...@@ -157,7 +158,7 @@ func CreateRawCollateralizeCreateTx(cfg *types.Chain33Config, parm *Collateraliz ...@@ -157,7 +158,7 @@ func CreateRawCollateralizeCreateTx(cfg *types.Chain33Config, parm *Collateraliz
llog.Error("CreateRawCollateralizeCreateTx", "parm", parm) llog.Error("CreateRawCollateralizeCreateTx", "parm", parm)
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
} }
totalBalanceInt64, err := types.FormatFloatDisplay2Value(parm.TotalBalance, cfg.GetCoinPrecision()) totalBalanceInt64, err := types.FormatFloatDisplay2Value(parm.TotalBalance, cfg.GetTokenPrecision())
if err != nil { if err != nil {
return nil, errors.Wrapf(types.ErrInvalidParam, "FormatFloatDisplay2Value.TotalBalance") return nil, errors.Wrapf(types.ErrInvalidParam, "FormatFloatDisplay2Value.TotalBalance")
} }
...@@ -188,7 +189,7 @@ func CreateRawCollateralizeBorrowTx(cfg *types.Chain33Config, parm *Collateraliz ...@@ -188,7 +189,7 @@ func CreateRawCollateralizeBorrowTx(cfg *types.Chain33Config, parm *Collateraliz
llog.Error("CreateRawCollateralizeBorrowTx", "parm", parm) llog.Error("CreateRawCollateralizeBorrowTx", "parm", parm)
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
} }
valueInt64, err := types.FormatFloatDisplay2Value(parm.Value, cfg.GetCoinPrecision()) valueInt64, err := types.FormatFloatDisplay2Value(parm.Value, cfg.GetTokenPrecision())
if err != nil { if err != nil {
return nil, errors.Wrapf(types.ErrInvalidParam, "FormatFloatDisplay2Value.Value") return nil, errors.Wrapf(types.ErrInvalidParam, "FormatFloatDisplay2Value.Value")
} }
...@@ -315,7 +316,7 @@ func CreateRawCollateralizeRetrieveTx(cfg *types.Chain33Config, parm *Collateral ...@@ -315,7 +316,7 @@ func CreateRawCollateralizeRetrieveTx(cfg *types.Chain33Config, parm *Collateral
llog.Error("CreateRawCollateralizeCloseTx", "parm", parm) llog.Error("CreateRawCollateralizeCloseTx", "parm", parm)
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
} }
balanceInt64, err := types.FormatFloatDisplay2Value(parm.Balance, cfg.GetCoinPrecision()) balanceInt64, err := types.FormatFloatDisplay2Value(parm.Balance, cfg.GetTokenPrecision())
if err != nil { if err != nil {
return nil, errors.Wrapf(types.ErrInvalidParam, "FormatFloatDisplay2Value.Balance") return nil, errors.Wrapf(types.ErrInvalidParam, "FormatFloatDisplay2Value.Balance")
} }
...@@ -348,11 +349,11 @@ func CreateRawCollateralizeManageTx(cfg *types.Chain33Config, parm *Collateraliz ...@@ -348,11 +349,11 @@ func CreateRawCollateralizeManageTx(cfg *types.Chain33Config, parm *Collateraliz
llog.Error("CreateRawCollateralizeManageTx", "parm", parm) llog.Error("CreateRawCollateralizeManageTx", "parm", parm)
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
} }
totalBalanceInt64, err := types.FormatFloatDisplay2Value(parm.TotalBalance, cfg.GetCoinPrecision()) totalBalanceInt64, err := types.FormatFloatDisplay2Value(parm.TotalBalance, cfg.GetTokenPrecision())
if err != nil { if err != nil {
return nil, errors.Wrapf(types.ErrInvalidParam, "FormatFloatDisplay2Value.totalBalance") return nil, errors.Wrapf(types.ErrInvalidParam, "FormatFloatDisplay2Value.totalBalance")
} }
debtCeilingInt64, err := types.FormatFloatDisplay2Value(parm.DebtCeiling, cfg.GetCoinPrecision()) debtCeilingInt64, err := types.FormatFloatDisplay2Value(parm.DebtCeiling, cfg.GetTokenPrecision())
if err != nil { if err != nil {
return nil, errors.Wrapf(types.ErrInvalidParam, "FormatFloatDisplay2Value.DebtCeiling") return nil, errors.Wrapf(types.ErrInvalidParam, "FormatFloatDisplay2Value.DebtCeiling")
} }
......
...@@ -56,4 +56,5 @@ const ( ...@@ -56,4 +56,5 @@ const (
//fork ... //fork ...
var ( var (
ForkCollateralizeTableUpdate = "ForkCollateralizeTableUpdate" ForkCollateralizeTableUpdate = "ForkCollateralizeTableUpdate"
ForkCollateralizePrecision = "ForkCollateralizePrecision"
) )
...@@ -29,17 +29,17 @@ func init() { ...@@ -29,17 +29,17 @@ func init() {
//InitFork ... //InitFork ...
func InitFork(cfg *types.Chain33Config) { func InitFork(cfg *types.Chain33Config) {
cfg.RegisterDappFork(ExecutorName, EVMEnable, 500000) cfg.RegisterDappFork(ExecutorName, EVMEnable, 0)
// EVM合约中的数据分散存储,支持大数据量 // EVM合约中的数据分散存储,支持大数据量
cfg.RegisterDappFork(ExecutorName, ForkEVMState, 650000) cfg.RegisterDappFork(ExecutorName, ForkEVMState, 0)
// EVM合约状态数据生成哈希,保存在主链的StateDB中 // EVM合约状态数据生成哈希,保存在主链的StateDB中
cfg.RegisterDappFork(ExecutorName, ForkEVMKVHash, 1000000) cfg.RegisterDappFork(ExecutorName, ForkEVMKVHash, 0)
// EVM合约支持ABI绑定和调用 // EVM合约支持ABI绑定和调用
cfg.RegisterDappFork(ExecutorName, ForkEVMABI, 1250000) cfg.RegisterDappFork(ExecutorName, ForkEVMABI, 0)
// EEVM合约用户金额冻结 // EEVM合约用户金额冻结
cfg.RegisterDappFork(ExecutorName, ForkEVMFrozen, 1300000) cfg.RegisterDappFork(ExecutorName, ForkEVMFrozen, 0)
// EEVM 黄皮v1分叉高度 // EEVM 黄皮v1分叉高度
cfg.RegisterDappFork(ExecutorName, ForkEVMYoloV1, 9500000) cfg.RegisterDappFork(ExecutorName, ForkEVMYoloV1, 0)
// EVM合约支持交易组 // EVM合约支持交易组
cfg.RegisterDappFork(ExecutorName, ForkEVMTxGroup, 0) cfg.RegisterDappFork(ExecutorName, ForkEVMTxGroup, 0)
} }
......
...@@ -260,23 +260,23 @@ func (action *evmxgoAction) mint(mint *evmxgotypes.EvmxgoMint, tx2lock *types.Tr ...@@ -260,23 +260,23 @@ func (action *evmxgoAction) mint(mint *evmxgotypes.EvmxgoMint, tx2lock *types.Tr
return nil, err return nil, err
} }
// TODO check() // evmxgo合约,配置symbol对应的实际地址,检验地址正确才能发币
configSymbol, err := loadEvmxgoMintConfig(action.db, mint.GetSymbol())
if err != nil || configSymbol == nil {
elog.Error("evmxgo mint ", "not config symbol", mint.GetSymbol(), "error", err)
return nil, evmxgotypes.ErrEvmxgoSymbolNotAllowedMint
}
if mint.BridgeToken != configSymbol.Address {
elog.Error("evmxgo mint ", "NotCorrectBridgeTokenAddress with address by manager", configSymbol.Address, "mint.BridgeToken", mint.BridgeToken)
return nil, evmxgotypes.ErrNotCorrectBridgeTokenAddress
}
evmxgodb, err := loadEvmxgoDB(action.db, mint.GetSymbol()) evmxgodb, err := loadEvmxgoDB(action.db, mint.GetSymbol())
if err != nil { if err != nil {
if err != evmxgotypes.ErrEvmxgoSymbolNotExist { if err != evmxgotypes.ErrEvmxgoSymbolNotExist {
return nil, err return nil, err
} }
// evmxgo合约,只要配置了就可以铸币
configSymbol, err := loadEvmxgoMintConfig(action.db, mint.GetSymbol())
if err != nil || configSymbol == nil {
elog.Error("evmxgo mint ", "not config symbol", mint.GetSymbol(), "error", err)
return nil, evmxgotypes.ErrEvmxgoSymbolNotAllowedMint
}
if mint.BridgeToken != configSymbol.Address {
elog.Error("evmxgo mint ", "NotCorrectBridgeTokenAddress with address by manager", configSymbol.Address, "mint.BridgeToken", mint.BridgeToken)
return nil, evmxgotypes.ErrNotCorrectBridgeTokenAddress
}
evmxgodb = newEvmxgoDB(mint) evmxgodb = newEvmxgoDB(mint)
} }
......
...@@ -565,7 +565,7 @@ func evmxgo_Exec_Burn_Local(exec dapp.Driver, receipt *types.Receipt) (*types.Lo ...@@ -565,7 +565,7 @@ func evmxgo_Exec_Burn_Local(exec dapp.Driver, receipt *types.Receipt) (*types.Lo
Tx1, err := signTx(tx, PrivKeyA) Tx1, err := signTx(tx, PrivKeyA)
if err != nil { if err != nil {
fmt.Println("RPC_Default_Process sign test", "err", err) fmt.Println("RPC_Default_Process sign test", "err", err)
return nil, err return nil, err
} }
receiptDate := &types.ReceiptData{Ty: receipt.Ty, Logs: receipt.Logs} receiptDate := &types.ReceiptData{Ty: receipt.Ty, Logs: receipt.Logs}
......
...@@ -564,31 +564,22 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload * ...@@ -564,31 +564,22 @@ func (a *Action) matchModel(leftAccountDB, rightAccountDB *account.DB, payload *
return logs, kvs, nil return logs, kvs, nil
} }
//根据订单号查询,分为两步,优先去localdb中查询,如没有则再去状态数据库中查询 //根据订单号去状态数据库中查询
// 1.挂单中得订单信会根据orderID在localdb中存储 // 1.localdb删除顺序,先实时删除缓存,区块生成时统一修改db。会导致缓存数据被删除但查询时缓存查询不到会去db查询依旧可以查询到删除的数据
// 2.订单撤销,或者成交后,根据orderID在localdb中存储得数据会被删除,这时只能到状态数据库中查询
func findOrderByOrderID(statedb dbm.KV, localdb dbm.KV, orderID int64) (*et.Order, error) { func findOrderByOrderID(statedb dbm.KV, localdb dbm.KV, orderID int64) (*et.Order, error) {
table := NewMarketOrderTable(localdb) data, err := statedb.Get(calcOrderKey(orderID))
primaryKey := []byte(fmt.Sprintf("%022d", orderID))
row, err := table.GetData(primaryKey)
if err != nil { if err != nil {
data, err := statedb.Get(calcOrderKey(orderID)) elog.Error("findOrderByOrderID.Get", "orderID", orderID, "err", err.Error())
if err != nil { return nil, err
elog.Error("findOrderByOrderID.Get", "orderID", orderID, "err", err.Error()) }
return nil, err var order et.Order
} err = types.Decode(data, &order)
var order et.Order if err != nil {
err = types.Decode(data, &order) elog.Error("findOrderByOrderID.Decode", "orderID", orderID, "err", err.Error())
if err != nil { return nil, err
elog.Error("findOrderByOrderID.Decode", "orderID", orderID, "err", err.Error())
return nil, err
}
order.Executed = order.GetLimitOrder().Amount - order.Balance
return &order, nil
} }
order := row.Data.(*et.Order)
order.Executed = order.GetLimitOrder().Amount - order.Balance order.Executed = order.GetLimitOrder().Amount - order.Balance
return order, nil 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) {
......
package executor package executor
import ( import (
"fmt"
"github.com/33cn/chain33/common/db/table" "github.com/33cn/chain33/common/db/table"
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
ety "github.com/33cn/plugin/plugin/dapp/exchange/types" ety "github.com/33cn/plugin/plugin/dapp/exchange/types"
...@@ -191,10 +193,10 @@ func (e *exchange) updateOrder(marketTable, orderTable, historyTable *table.Tabl ...@@ -191,10 +193,10 @@ func (e *exchange) updateOrder(marketTable, orderTable, historyTable *table.Tabl
} }
} }
//删除原有状态orderID //删除原有状态orderID
order.Status = ety.Ordered primaryKey := []byte(fmt.Sprintf("%022d", order.OrderID))
err = orderTable.DelRow(order) err = orderTable.Del(primaryKey)
if err != nil { if err != nil {
elog.Error("updateIndex", "orderTable.DelRow", err.Error()) elog.Error("updateIndex", "orderTable.Del", err.Error())
return err return err
} }
order.Status = ety.Revoked order.Status = ety.Revoked
......
...@@ -273,16 +273,5 @@ coins = [ ...@@ -273,16 +273,5 @@ coins = [
{name = "CCNY", rate = 100000, minFee = 0}, {name = "CCNY", rate = 100000, minFee = 0},
] ]
#[mver.exec.sub.exchange.ForkParamV1]
#banks = [
# "1PTGVR7TUm1MJUH7M1UNcKBGMvfJ7nCrnN"
#]
#coins = [
# {name = "bty", rate = 100000, minFee = 1000000},
# {name = "CCNY", rate = 100000, minFee = 1000000},
#]
[fork.sub.exchange] [fork.sub.exchange]
Enable=0 Enable=0
#ForkParamV1=1 \ No newline at end of file
\ No newline at end of file
...@@ -26,7 +26,7 @@ func init() { ...@@ -26,7 +26,7 @@ func init() {
//InitFork ... //InitFork ...
func InitFork(cfg *types.Chain33Config) { func InitFork(cfg *types.Chain33Config) {
cfg.RegisterDappFork(HashlockX, "Enable", 0) cfg.RegisterDappFork(HashlockX, "Enable", 0)
cfg.RegisterDappFork(HashlockX, ForkBadRepeatSecretX, 2715575) cfg.RegisterDappFork(HashlockX, ForkBadRepeatSecretX, 0)
} }
//InitExecutor ... //InitExecutor ...
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
package executor package executor
import ( import (
"math"
"github.com/33cn/chain33/account" "github.com/33cn/chain33/account"
"github.com/33cn/chain33/common" "github.com/33cn/chain33/common"
dbm "github.com/33cn/chain33/common/db" dbm "github.com/33cn/chain33/common/db"
...@@ -13,6 +15,7 @@ import ( ...@@ -13,6 +15,7 @@ import (
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
pty "github.com/33cn/plugin/plugin/dapp/issuance/types" pty "github.com/33cn/plugin/plugin/dapp/issuance/types"
tokenE "github.com/33cn/plugin/plugin/dapp/token/executor" tokenE "github.com/33cn/plugin/plugin/dapp/token/executor"
"github.com/shopspring/decimal"
) )
// List control // List control
...@@ -536,12 +539,25 @@ func (action *Action) IssuanceDebt(debt *pty.IssuanceDebt) (*types.Receipt, erro ...@@ -536,12 +539,25 @@ func (action *Action) IssuanceDebt(debt *pty.IssuanceDebt) (*types.Receipt, erro
return nil, err return nil, err
} }
// 精度转换 #1024
// 先将token由token精度转成精度8
valueReal := debt.GetValue()
cfg := action.Issuance.GetAPI().GetConfig()
if cfg.IsDappFork(action.Issuance.GetHeight(), pty.IssuanceX, pty.ForkIssuancePrecision) {
precisionNum := int(math.Log10(float64(cfg.GetTokenPrecision())))
valueReal = decimal.NewFromInt(valueReal).Shift(int32(-precisionNum)).Shift(8).IntPart()
}
// 根据价格和需要借贷的金额,计算需要质押的抵押物数量 // 根据价格和需要借贷的金额,计算需要质押的抵押物数量
btyFrozen, err := getBtyNumToFrozen(debt.Value, lastPrice, issu.LiquidationRatio) btyFrozen, err := getBtyNumToFrozen(valueReal, lastPrice, issu.LiquidationRatio)
if err != nil { if err != nil {
clog.Error("IssuanceDebt.getBtyNumToFrozen", "CollID", issu.IssuanceId, "addr", action.fromaddr, "execaddr", action.execaddr, "error", err) clog.Error("IssuanceDebt.getBtyNumToFrozen", "CollID", issu.IssuanceId, "addr", action.fromaddr, "execaddr", action.execaddr, "error", err)
return nil, err return nil, err
} }
// 再将bty由精度8转成coins精度
if cfg.IsDappFork(action.Issuance.GetHeight(), pty.IssuanceX, pty.ForkIssuancePrecision) {
precisionNum := int(math.Log10(float64(cfg.GetCoinPrecision())))
btyFrozen = decimal.NewFromInt(btyFrozen).Shift(-8).Shift(int32(precisionNum)).IntPart()
}
// 检查抵押物账户余额 // 检查抵押物账户余额
if !action.CheckExecAccountBalance(action.fromaddr, btyFrozen, 0) { if !action.CheckExecAccountBalance(action.fromaddr, btyFrozen, 0) {
......
...@@ -30,6 +30,7 @@ func init() { ...@@ -30,6 +30,7 @@ func init() {
func InitFork(cfg *types.Chain33Config) { func InitFork(cfg *types.Chain33Config) {
cfg.RegisterDappFork(IssuanceX, "Enable", 0) cfg.RegisterDappFork(IssuanceX, "Enable", 0)
cfg.RegisterDappFork(IssuanceX, ForkIssuanceTableUpdate, 0) cfg.RegisterDappFork(IssuanceX, ForkIssuanceTableUpdate, 0)
cfg.RegisterDappFork(IssuanceX, ForkIssuancePrecision, 0)
} }
//InitExecutor ... //InitExecutor ...
...@@ -148,11 +149,11 @@ func CreateRawIssuanceCreateTx(cfg *types.Chain33Config, parm *IssuanceCreateTx) ...@@ -148,11 +149,11 @@ func CreateRawIssuanceCreateTx(cfg *types.Chain33Config, parm *IssuanceCreateTx)
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
} }
totalBalanceInt64, err := types.FormatFloatDisplay2Value(parm.TotalBalance, cfg.GetCoinPrecision()) totalBalanceInt64, err := types.FormatFloatDisplay2Value(parm.TotalBalance, cfg.GetTokenPrecision())
if err != nil { if err != nil {
return nil, errors.Wrapf(types.ErrInvalidParam, "FormatFloatDisplay2Value.totalBalance") return nil, errors.Wrapf(types.ErrInvalidParam, "FormatFloatDisplay2Value.totalBalance")
} }
debtCeilingInt64, err := types.FormatFloatDisplay2Value(parm.DebtCeiling, cfg.GetCoinPrecision()) debtCeilingInt64, err := types.FormatFloatDisplay2Value(parm.DebtCeiling, cfg.GetTokenPrecision())
if err != nil { if err != nil {
return nil, errors.Wrapf(types.ErrInvalidParam, "FormatFloatDisplay2Value.DebtCeiling") return nil, errors.Wrapf(types.ErrInvalidParam, "FormatFloatDisplay2Value.DebtCeiling")
} }
...@@ -187,7 +188,7 @@ func CreateRawIssuanceDebtTx(cfg *types.Chain33Config, parm *IssuanceDebtTx) (*t ...@@ -187,7 +188,7 @@ func CreateRawIssuanceDebtTx(cfg *types.Chain33Config, parm *IssuanceDebtTx) (*t
llog.Error("CreateRawIssuanceBorrowTx", "parm", parm) llog.Error("CreateRawIssuanceBorrowTx", "parm", parm)
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
} }
valueInt64, err := types.FormatFloatDisplay2Value(parm.Value, cfg.GetCoinPrecision()) valueInt64, err := types.FormatFloatDisplay2Value(parm.Value, cfg.GetTokenPrecision())
if err != nil { if err != nil {
return nil, errors.Wrapf(types.ErrInvalidParam, "FormatFloatDisplay2Value.Value") return nil, errors.Wrapf(types.ErrInvalidParam, "FormatFloatDisplay2Value.Value")
} }
......
...@@ -55,4 +55,5 @@ const ( ...@@ -55,4 +55,5 @@ const (
//fork ... //fork ...
var ( var (
ForkIssuanceTableUpdate = "ForkIssuanceTableUpdate" ForkIssuanceTableUpdate = "ForkIssuanceTableUpdate"
ForkIssuancePrecision = "ForkIssuancePrecision"
) )
This diff is collapsed.
...@@ -102,6 +102,17 @@ func FilterTxsForPara(cfg *types.Chain33Config, main *types.ParaTxDetail) []*typ ...@@ -102,6 +102,17 @@ func FilterTxsForPara(cfg *types.Chain33Config, main *types.ParaTxDetail) []*typ
return txs return txs
} }
// FilterParaCrossTxs only all para chain cross txs like xx.paracross exec
func FilterParaCrossTxs(txs []*types.Transaction) []*types.Transaction {
var paraCrossTxs []*types.Transaction
for _, tx := range txs {
if types.IsParaExecName(string(tx.Execer)) && bytes.HasSuffix(tx.Execer, []byte(pt.ParaX)) {
paraCrossTxs = append(paraCrossTxs, tx)
}
}
return paraCrossTxs
}
// FilterParaCrossTxHashes only all para chain cross txs like xx.paracross exec // FilterParaCrossTxHashes only all para chain cross txs like xx.paracross exec
func FilterParaCrossTxHashes(txs []*types.Transaction) [][]byte { func FilterParaCrossTxHashes(txs []*types.Transaction) [][]byte {
var txHashs [][]byte var txHashs [][]byte
......
...@@ -64,12 +64,12 @@ func init() { ...@@ -64,12 +64,12 @@ func init() {
//InitFork ... //InitFork ...
func InitFork(cfg *types.Chain33Config) { func InitFork(cfg *types.Chain33Config) {
cfg.RegisterDappFork(ParaX, "Enable", 0) cfg.RegisterDappFork(ParaX, "Enable", 0)
cfg.RegisterDappFork(ParaX, "ForkParacrossWithdrawFromParachain", 1298600) cfg.RegisterDappFork(ParaX, "ForkParacrossWithdrawFromParachain", 0)
cfg.RegisterDappFork(ParaX, ForkCommitTx, 1850000) cfg.RegisterDappFork(ParaX, ForkCommitTx, 0)
cfg.RegisterDappFork(ParaX, ForkLoopCheckCommitTxDone, 3230000) cfg.RegisterDappFork(ParaX, ForkLoopCheckCommitTxDone, 0)
cfg.RegisterDappFork(ParaX, ForkParaAssetTransferRbk, 4500000) cfg.RegisterDappFork(ParaX, ForkParaAssetTransferRbk, 0)
cfg.RegisterDappFork(ParaX, ForkParaSupervision, 6000000) cfg.RegisterDappFork(ParaX, ForkParaSupervision, 0)
cfg.RegisterDappFork(ParaX, ForkParaAutonomySuperGroup, 10200000) cfg.RegisterDappFork(ParaX, ForkParaAutonomySuperGroup, 0)
//只在平行链启用 //只在平行链启用
cfg.RegisterDappFork(ParaX, ForkParaSelfConsStages, types.MaxHeight) cfg.RegisterDappFork(ParaX, ForkParaSelfConsStages, types.MaxHeight)
......
...@@ -47,7 +47,7 @@ func init() { ...@@ -47,7 +47,7 @@ func init() {
//InitFork ... //InitFork ...
func InitFork(cfg *types.Chain33Config) { func InitFork(cfg *types.Chain33Config) {
cfg.RegisterDappFork(PrivacyX, "Enable", 980000) cfg.RegisterDappFork(PrivacyX, "Enable", 0)
} }
//InitExecutor ... //InitExecutor ...
......
...@@ -111,7 +111,7 @@ func (val *QbftNode) Query_GetPerfStat(in *pty.ReqQbftPerfStat) (types.Message, ...@@ -111,7 +111,7 @@ func (val *QbftNode) Query_GetPerfStat(in *pty.ReqQbftPerfStat) (types.Message,
startHeader := startInfo.Block.Header startHeader := startInfo.Block.Header
endHeader := endInfo.Block.Header endHeader := endInfo.Block.Header
totalTx := endHeader.TotalTxs - startHeader.TotalTxs totalTx := endHeader.TotalTxs - startHeader.TotalTxs + startHeader.NumTxs
totalBlock := endHeader.Height - startHeader.Height + 1 totalBlock := endHeader.Height - startHeader.Height + 1
totalSecond := endHeader.Time - startHeader.Time + 1 totalSecond := endHeader.Time - startHeader.Time + 1
return &pty.QbftPerfStat{ return &pty.QbftPerfStat{
......
...@@ -56,7 +56,7 @@ func init() { ...@@ -56,7 +56,7 @@ func init() {
//InitFork ... //InitFork ...
func InitFork(cfg *types.Chain33Config) { func InitFork(cfg *types.Chain33Config) {
cfg.RegisterDappFork(RelayX, "Enable", 570000) cfg.RegisterDappFork(RelayX, "Enable", 0)
} }
//InitExecutor ... //InitExecutor ...
......
...@@ -9,9 +9,8 @@ import ( ...@@ -9,9 +9,8 @@ import (
"errors" "errors"
"fmt" "fmt"
"math/rand" "math/rand"
"testing"
"strings" "strings"
"testing"
"github.com/33cn/chain33/client" "github.com/33cn/chain33/client"
"github.com/33cn/chain33/common/address" "github.com/33cn/chain33/common/address"
...@@ -250,6 +249,8 @@ func TestExecDelLocalBackup(t *testing.T) { ...@@ -250,6 +249,8 @@ func TestExecDelLocalBackup(t *testing.T) {
func constructRetrieveInstance() drivers.Driver { func constructRetrieveInstance() drivers.Driver {
cfgstring := strings.Replace(types.GetDefaultCfgstring(), "Title=\"local\"", "Title=\"chain33\"", 1) cfgstring := strings.Replace(types.GetDefaultCfgstring(), "Title=\"local\"", "Title=\"chain33\"", 1)
chainTestCfg := types.NewChain33Config(cfgstring) chainTestCfg := types.NewChain33Config(cfgstring)
chainTestCfg.SetDappFork(rt.RetrieveX, rt.ForkRetriveX, 180000)
chainTestCfg.SetDappFork(rt.RetrieveX, rt.ForkRetriveAssetX, 3150000)
Init(rt.RetrieveX, chainTestCfg, nil) Init(rt.RetrieveX, chainTestCfg, nil)
q := queue.New("channel") q := queue.New("channel")
q.SetConfig(chainTestCfg) q.SetConfig(chainTestCfg)
......
...@@ -20,8 +20,8 @@ func init() { ...@@ -20,8 +20,8 @@ func init() {
//InitFork ... //InitFork ...
func InitFork(cfg *types.Chain33Config) { func InitFork(cfg *types.Chain33Config) {
cfg.RegisterDappFork(RetrieveX, "Enable", 0) cfg.RegisterDappFork(RetrieveX, "Enable", 0)
cfg.RegisterDappFork(RetrieveX, ForkRetriveX, 180000) cfg.RegisterDappFork(RetrieveX, ForkRetriveX, 0)
cfg.RegisterDappFork(RetrieveX, ForkRetriveAssetX, 3150000) cfg.RegisterDappFork(RetrieveX, ForkRetriveAssetX, 0)
} }
//InitExecutor ... //InitExecutor ...
......
...@@ -17,6 +17,7 @@ EventTransfer -> 转移资产 ...@@ -17,6 +17,7 @@ EventTransfer -> 转移资产
//nofee transaction will not pack into block //nofee transaction will not pack into block
import ( import (
"bytes"
"fmt" "fmt"
log "github.com/33cn/chain33/common/log/log15" log "github.com/33cn/chain33/common/log/log15"
...@@ -31,6 +32,7 @@ var driverName = "ticket" ...@@ -31,6 +32,7 @@ var driverName = "ticket"
// Init initial // Init initial
func Init(name string, cfg *types.Chain33Config, sub []byte) { func Init(name string, cfg *types.Chain33Config, sub []byte) {
drivers.Register(cfg, GetName(), newTicket, cfg.GetDappFork(driverName, "Enable")) drivers.Register(cfg, GetName(), newTicket, cfg.GetDappFork(driverName, "Enable"))
drivers.RegisterKVExpiredChecker(ty.TicketX, expiredKVChecker)
InitExecType() InitExecType()
} }
...@@ -193,3 +195,23 @@ func (t *Ticket) CheckTx(tx *types.Transaction, index int) error { ...@@ -193,3 +195,23 @@ func (t *Ticket) CheckTx(tx *types.Transaction, index int) error {
func (t *Ticket) CheckReceiptExecOk() bool { func (t *Ticket) CheckReceiptExecOk() bool {
return true return true
} }
// 自定义接口,用于删除不再需要保存的kv
// 比如 ticket 已经 close 之后就废弃了,可以删除
func expiredKVChecker(key, value []byte) bool {
// 由于 ticketBindKeyPrefix 包含了 ticketKeyPrefix,所以需要多做一次检查
if bytes.HasPrefix(key, ticketBindKeyPrefix) {
return false
}
if !bytes.HasPrefix(key, ticketKeyPrefix) {
return false
}
var tk ty.Ticket
if err := types.Decode(value, &tk); err != nil {
return false
}
if tk.Status == ty.TicketClosed {
return true
}
return false
}
...@@ -29,6 +29,11 @@ var tlog = log.New("module", "ticket.db") ...@@ -29,6 +29,11 @@ var tlog = log.New("module", "ticket.db")
//var genesisKey = []byte("mavl-acc-genesis") //var genesisKey = []byte("mavl-acc-genesis")
//var addrSeed = []byte("address seed bytes for public key") //var addrSeed = []byte("address seed bytes for public key")
var (
ticketKeyPrefix = []byte("mavl-ticket-")
ticketBindKeyPrefix = []byte("mavl-ticket-tbind-")
)
// DB db // DB db
type DB struct { type DB struct {
ty.Ticket ty.Ticket
...@@ -106,14 +111,14 @@ func (t *DB) Save(db dbm.KV) { ...@@ -106,14 +111,14 @@ func (t *DB) Save(db dbm.KV) {
//Key address to save key //Key address to save key
func Key(id string) (key []byte) { func Key(id string) (key []byte) {
key = append(key, []byte("mavl-ticket-")...) key = append(key, ticketKeyPrefix...)
key = append(key, []byte(id)...) key = append(key, []byte(id)...)
return key return key
} }
// BindKey bind key // BindKey bind key
func BindKey(id string) (key []byte) { func BindKey(id string) (key []byte) {
key = append(key, []byte("mavl-ticket-tbind-")...) key = append(key, ticketBindKeyPrefix...)
key = append(key, []byte(id)...) key = append(key, []byte(id)...)
return key return key
} }
......
...@@ -415,10 +415,12 @@ Enable=0 ...@@ -415,10 +415,12 @@ Enable=0
[fork.sub.issuance] [fork.sub.issuance]
Enable=0 Enable=0
ForkIssuanceTableUpdate=0 ForkIssuanceTableUpdate=0
ForkIssuancePrecision=0
[fork.sub.collateralize] [fork.sub.collateralize]
Enable=0 Enable=0
ForkCollateralizeTableUpdate=0 ForkCollateralizeTableUpdate=0
ForkCollateralizePrecision=0
[fork.sub.qbftNode] [fork.sub.qbftNode]
Enable=0 Enable=0
......
...@@ -78,8 +78,8 @@ func init() { ...@@ -78,8 +78,8 @@ func init() {
//InitFork ... //InitFork ...
func InitFork(cfg *types.Chain33Config) { func InitFork(cfg *types.Chain33Config) {
cfg.RegisterDappFork(TicketX, "Enable", 0) cfg.RegisterDappFork(TicketX, "Enable", 0)
cfg.RegisterDappFork(TicketX, "ForkTicketId", 1062000) cfg.RegisterDappFork(TicketX, "ForkTicketId", 0)
cfg.RegisterDappFork(TicketX, "ForkTicketVrf", 1770000) cfg.RegisterDappFork(TicketX, "ForkTicketVrf", 0)
} }
//InitExecutor ... //InitExecutor ...
......
...@@ -437,6 +437,8 @@ func getprivkey(key string) crypto.PrivKey { ...@@ -437,6 +437,8 @@ func getprivkey(key string) crypto.PrivKey {
func TestToken_validSymbolWithHeight(t *testing.T) { func TestToken_validSymbolWithHeight(t *testing.T) {
cfg := types.NewChain33Config(strings.Replace(types.GetDefaultCfgstring(), "Title=\"local\"", "Title=\"chain33\"", 1)) cfg := types.NewChain33Config(strings.Replace(types.GetDefaultCfgstring(), "Title=\"local\"", "Title=\"chain33\"", 1))
cfg.SetDappFork(pty.TokenX, pty.ForkBadTokenSymbolX, 184000)
cfg.SetDappFork(pty.TokenX, pty.ForkTokenSymbolWithNumberX, 1298600)
forkBadTokenSymbol := cfg.GetDappFork(pty.TokenX, pty.ForkBadTokenSymbolX) forkBadTokenSymbol := cfg.GetDappFork(pty.TokenX, pty.ForkBadTokenSymbolX)
forkTokenSymbolWithNumber := cfg.GetDappFork(pty.TokenX, pty.ForkTokenSymbolWithNumberX) forkTokenSymbolWithNumber := cfg.GetDappFork(pty.TokenX, pty.ForkTokenSymbolWithNumberX)
t.Log("x", "1", forkBadTokenSymbol, "2", forkTokenSymbolWithNumber) t.Log("x", "1", forkBadTokenSymbol, "2", forkTokenSymbolWithNumber)
......
...@@ -46,6 +46,7 @@ var ( ...@@ -46,6 +46,7 @@ var (
func TestToken(t *testing.T) { func TestToken(t *testing.T) {
cfg := types.NewChain33Config(strings.Replace(types.GetDefaultCfgstring(), "Title=\"local\"", "Title=\"chain33\"", 1)) cfg := types.NewChain33Config(strings.Replace(types.GetDefaultCfgstring(), "Title=\"local\"", "Title=\"chain33\"", 1))
cfg.SetDappFork(pty.TokenX, pty.ForkTokenCheckX, 1600000)
Init(pty.TokenX, cfg, nil) Init(pty.TokenX, cfg, nil)
tokenTotal := int64(10000 * 1e8) tokenTotal := int64(10000 * 1e8)
tokenBurn := int64(10 * 1e8) tokenBurn := int64(10 * 1e8)
......
...@@ -23,12 +23,12 @@ func init() { ...@@ -23,12 +23,12 @@ func init() {
//InitFork ... //InitFork ...
func InitFork(cfg *types.Chain33Config) { func InitFork(cfg *types.Chain33Config) {
cfg.RegisterDappFork(TokenX, "Enable", 100899) cfg.RegisterDappFork(TokenX, "Enable", 0)
cfg.RegisterDappFork(TokenX, ForkTokenBlackListX, 190000) cfg.RegisterDappFork(TokenX, ForkTokenBlackListX, 0)
cfg.RegisterDappFork(TokenX, ForkBadTokenSymbolX, 184000) cfg.RegisterDappFork(TokenX, ForkBadTokenSymbolX, 0)
cfg.RegisterDappFork(TokenX, ForkTokenPriceX, 560000) cfg.RegisterDappFork(TokenX, ForkTokenPriceX, 0)
cfg.RegisterDappFork(TokenX, ForkTokenSymbolWithNumberX, 1298600) cfg.RegisterDappFork(TokenX, ForkTokenSymbolWithNumberX, 0)
cfg.RegisterDappFork(TokenX, ForkTokenCheckX, 1600000) cfg.RegisterDappFork(TokenX, ForkTokenCheckX, 0)
} }
//InitExecutor ... //InitExecutor ...
......
...@@ -59,12 +59,12 @@ func init() { ...@@ -59,12 +59,12 @@ func init() {
//InitFork ... //InitFork ...
func InitFork(cfg *types.Chain33Config) { func InitFork(cfg *types.Chain33Config) {
cfg.RegisterDappFork(TradeX, "Enable", 100899) cfg.RegisterDappFork(TradeX, "Enable", 0)
cfg.RegisterDappFork(TradeX, ForkTradeBuyLimitX, 301000) cfg.RegisterDappFork(TradeX, ForkTradeBuyLimitX, 0)
cfg.RegisterDappFork(TradeX, ForkTradeAssetX, 1010000) cfg.RegisterDappFork(TradeX, ForkTradeAssetX, 0)
cfg.RegisterDappFork(TradeX, ForkTradeIDX, 1450000) cfg.RegisterDappFork(TradeX, ForkTradeIDX, 0)
cfg.RegisterDappFork(TradeX, ForkTradeFixAssetDBX, 2500000) cfg.RegisterDappFork(TradeX, ForkTradeFixAssetDBX, 0)
cfg.RegisterDappFork(TradeX, ForkTradePriceX, 3150000) cfg.RegisterDappFork(TradeX, ForkTradePriceX, 0)
} }
//InitExecutor ... //InitExecutor ...
......
...@@ -30,8 +30,8 @@ func init() { ...@@ -30,8 +30,8 @@ func init() {
func InitFork(cfg *types.Chain33Config) { func InitFork(cfg *types.Chain33Config) {
name = UnfreezeX name = UnfreezeX
cfg.RegisterDappFork(name, "Enable", 0) cfg.RegisterDappFork(name, "Enable", 0)
cfg.RegisterDappFork(name, ForkTerminatePartX, 1298600) cfg.RegisterDappFork(name, ForkTerminatePartX, 0)
cfg.RegisterDappFork(name, ForkUnfreezeIDX, 1450000) cfg.RegisterDappFork(name, ForkUnfreezeIDX, 0)
} }
//InitExecutor ... //InitExecutor ...
......
...@@ -67,7 +67,7 @@ func init() { ...@@ -67,7 +67,7 @@ func init() {
//InitFork ... //InitFork ...
func InitFork(cfg *types.Chain33Config) { func InitFork(cfg *types.Chain33Config) {
cfg.RegisterDappFork("store-kvmvccmavl", "ForkKvmvccmavl", 187*10000) cfg.RegisterDappFork("store-kvmvccmavl", "ForkKvmvccmavl", 0)
} }
// KVmMavlStore provide kvmvcc and mavl store interface implementation // KVmMavlStore provide kvmvcc and mavl store interface implementation
...@@ -81,8 +81,9 @@ type KVmMavlStore struct { ...@@ -81,8 +81,9 @@ type KVmMavlStore struct {
type subKVMVCCConfig struct { type subKVMVCCConfig struct {
EnableMVCCIter bool `json:"enableMVCCIter"` EnableMVCCIter bool `json:"enableMVCCIter"`
EnableMVCCPrune bool `json:"enableMVCCPrune"` EnableMVCCPrune bool `json:"enableMVCCPrune"`
PruneHeight int32 `json:"pruneHeight"` PruneHeight int32 `json:"pruneHeight"` //每PruneHeight高度做一次状态精简
EnableEmptyBlockHandle bool `json:"enableEmptyBlockHandle"` EnableEmptyBlockHandle bool `json:"enableEmptyBlockHandle"`
ReservedHeight int64 `json:"reservedHeight"` //保留最新的ReservedHeight个区块的状态数据
} }
type subMavlConfig struct { type subMavlConfig struct {
...@@ -114,6 +115,8 @@ type subConfig struct { ...@@ -114,6 +115,8 @@ type subConfig struct {
TkCloseCacheLen int32 `json:"tkCloseCacheLen"` TkCloseCacheLen int32 `json:"tkCloseCacheLen"`
// 使能空块处理 // 使能空块处理
EnableEmptyBlockHandle bool `json:"enableEmptyBlockHandle"` EnableEmptyBlockHandle bool `json:"enableEmptyBlockHandle"`
//保留的状态数据的高度
ReservedHeight int64 `json:"reservedHeight"`
} }
// New construct KVMVCCStore module // New construct KVMVCCStore module
...@@ -128,6 +131,7 @@ func New(cfg *types.Store, sub []byte, chain33cfg *types.Chain33Config) queue.Mo ...@@ -128,6 +131,7 @@ func New(cfg *types.Store, sub []byte, chain33cfg *types.Chain33Config) queue.Mo
subKVMVCCcfg.EnableMVCCPrune = subcfg.EnableMVCCPrune subKVMVCCcfg.EnableMVCCPrune = subcfg.EnableMVCCPrune
subKVMVCCcfg.PruneHeight = subcfg.PruneMVCCHeight subKVMVCCcfg.PruneHeight = subcfg.PruneMVCCHeight
subKVMVCCcfg.EnableEmptyBlockHandle = subcfg.EnableEmptyBlockHandle subKVMVCCcfg.EnableEmptyBlockHandle = subcfg.EnableEmptyBlockHandle
subKVMVCCcfg.ReservedHeight = subcfg.ReservedHeight
subMavlcfg.EnableMavlPrefix = subcfg.EnableMavlPrefix subMavlcfg.EnableMavlPrefix = subcfg.EnableMavlPrefix
subMavlcfg.EnableMVCC = subcfg.EnableMVCC subMavlcfg.EnableMVCC = subcfg.EnableMVCC
...@@ -171,6 +175,7 @@ func New(cfg *types.Store, sub []byte, chain33cfg *types.Chain33Config) queue.Mo ...@@ -171,6 +175,7 @@ func New(cfg *types.Store, sub []byte, chain33cfg *types.Chain33Config) queue.Mo
func (kvmMavls *KVmMavlStore) Close() { func (kvmMavls *KVmMavlStore) Close() {
quit = true quit = true
wg.Wait() wg.Wait()
kmlog.Info("store wait group done")
kvmMavls.KVMVCCStore.Close() kvmMavls.KVMVCCStore.Close()
kvmMavls.MavlStore.Close() kvmMavls.MavlStore.Close()
kvmMavls.BaseStore.Close() kvmMavls.BaseStore.Close()
......
...@@ -664,7 +664,8 @@ func TestPruning(t *testing.T) { ...@@ -664,7 +664,8 @@ func TestPruning(t *testing.T) {
hashes = append(hashes, hash) hashes = append(hashes, hash)
} }
pruningMVCC(store.GetDB(), 99, &KVMCCCConfig{PruneHeight: 10}) pruningMVCCData(store.GetDB(), 80)
pruningMVCCMeta(store.GetDB(), 80)
//check //check
getDatas := &types.StoreGet{ getDatas := &types.StoreGet{
......
This diff is collapsed.
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