Commit eb4c79bf authored by mdj33's avatar mdj33 Committed by vipwzw

add para chain no cross asset height list

parent 8966343e
...@@ -273,6 +273,9 @@ superManager=[ ...@@ -273,6 +273,9 @@ superManager=[
nodeGroupFrozenCoins=0 nodeGroupFrozenCoins=0
#平行链共识停止后主链等待的高度 #平行链共识停止后主链等待的高度
paraConsensusStopBlocks=30000 paraConsensusStopBlocks=30000
#配置平行链无资产跨链交易的高度列表,title不用加user.p,不同title使用#分割,不同高度序列使用.分割,高度为平行链自身的高度,不是主链高度
#mc.10-100.200-300#guodun.50-60.300-400#game.10-50.70-90
paraNoCrossAssetHeightList=""
[exec.sub.autonomy] [exec.sub.autonomy]
total="16htvcBNSEA7fZhAdLJphDwQRQJaHpyHTp" total="16htvcBNSEA7fZhAdLJphDwQRQJaHpyHTp"
......
...@@ -7,6 +7,7 @@ package executor ...@@ -7,6 +7,7 @@ package executor
import ( import (
"bytes" "bytes"
"encoding/hex" "encoding/hex"
"strconv"
"strings" "strings"
"github.com/33cn/chain33/account" "github.com/33cn/chain33/account"
...@@ -981,6 +982,45 @@ func rollbackCrossTx(a *action, cross *types.TransactionDetail, crossTxHash []by ...@@ -981,6 +982,45 @@ func rollbackCrossTx(a *action, cross *types.TransactionDetail, crossTxHash []by
} }
//无跨链交易高度列表是人为配置的,是确认的历史高度,是一种特殊处理,不会影响区块状态hash
//mc.10-100.200-300#guodun.50-60.300-400#game.10-50.70-90
func isInNoHeightCrossAsseList(list string, status *pt.ParacrossNodeStatus) (bool, error) {
paraChains := strings.Split(list, "#")
for _, chain := range paraChains {
paras := strings.Split(chain, ".")
//compare title
if strings.ToLower("user.p."+paras[0]+".") != strings.ToLower(status.Title) {
continue
}
//check para height
heights := paras[1:]
for _, h := range heights {
p := strings.Split(h, "-")
if len(p) != 2 {
return false, errors.Wrapf(types.ErrInvalidParam, "check NoHeightCrossAsseList title=%s,height=%s", chain, h)
}
s, err := strconv.Atoi(p[0])
if err != nil {
return false, errors.Wrapf(err, "check NoHeightCrossAsseList title=%s,height=%s", chain, h)
}
e, err := strconv.Atoi(p[1])
if err != nil {
return false, errors.Wrapf(err, "check NoHeightCrossAsseList title=%s,height=%s", chain, h)
}
if s > e {
return false, errors.Wrapf(types.ErrInvalidParam, "check NoHeightCrossAsseList title=%s,height=%s", chain, h)
}
//共识的平行链高度(不是主链高度)落在范围内,说明此高度没有跨链资产交易,可以忽略
if status.Height >= int64(s) && status.Height <= int64(e) {
return true, nil
}
}
}
return false, nil
}
func getCrossTxHashsByRst(api client.QueueProtocolAPI, status *pt.ParacrossNodeStatus) ([][]byte, []byte, error) { func getCrossTxHashsByRst(api client.QueueProtocolAPI, status *pt.ParacrossNodeStatus) ([][]byte, []byte, error) {
//支持带版本号的跨链交易bitmap //支持带版本号的跨链交易bitmap
//1.如果等于0,是老版本的平行链,按老的方式处理. 2. 如果大于0等于ver,新版本且没有跨链交易,不需要处理. 3. 大于ver,说明有跨链交易按老的方式处理 //1.如果等于0,是老版本的平行链,按老的方式处理. 2. 如果大于0等于ver,新版本且没有跨链交易,不需要处理. 3. 大于ver,说明有跨链交易按老的方式处理
...@@ -1000,6 +1040,20 @@ func getCrossTxHashsByRst(api client.QueueProtocolAPI, status *pt.ParacrossNodeS ...@@ -1000,6 +1040,20 @@ func getCrossTxHashsByRst(api client.QueueProtocolAPI, status *pt.ParacrossNodeS
return nil, nil, nil return nil, nil, nil
} }
} }
conf := types.ConfSub(cfg, pt.ParaX)
heightListStr := conf.GStr("paraNoCrossAssetHeightList")
if len(heightListStr) > 0 {
in, err := isInNoHeightCrossAsseList(heightListStr, status)
if err != nil {
clog.Error("getCrossTxHashs decode NoHeightCrossAsseList", "err", err)
return nil, nil, err
}
//在配置的无资产跨链高度列表中,则直接退出
if in {
clog.Debug("getCrossTxHashs NoHeightCrossAsseList", "str", heightListStr, "height", status.Height, "title", status.Title)
return nil, nil, nil
}
}
blockDetail, err := GetBlock(api, status.MainBlockHash) blockDetail, err := GetBlock(api, status.MainBlockHash)
if err != nil { if err != nil {
......
...@@ -877,3 +877,70 @@ func TestVerifyBlsSign(t *testing.T) { ...@@ -877,3 +877,70 @@ func TestVerifyBlsSign(t *testing.T) {
assert.Equal(t, nil, err) assert.Equal(t, nil, err)
} }
func TestIsInNoHeightCrossAsseList(t *testing.T) {
status1 := &pt.ParacrossNodeStatus{
Title: "user.p.mc.",
Height: 1000,
}
str := "mc.10-100"
isIn, err := isInNoHeightCrossAsseList(str, status1)
assert.Nil(t, err)
assert.Equal(t, false, isIn)
status1.Height = 100
isIn, err = isInNoHeightCrossAsseList(str, status1)
assert.Nil(t, err)
assert.Equal(t, true, isIn)
str = "mc.10-100.200-300#guodun.50-60.300-400"
status1.Height = 200
isIn, err = isInNoHeightCrossAsseList(str, status1)
assert.Nil(t, err)
assert.Equal(t, true, isIn)
status1.Title = "user.p.guodun."
status1.Height = 61
isIn, err = isInNoHeightCrossAsseList(str, status1)
assert.Nil(t, err)
assert.Equal(t, false, isIn)
status1.Height = 60
isIn, err = isInNoHeightCrossAsseList(str, status1)
assert.Nil(t, err)
assert.Equal(t, true, isIn)
str = "mc.10-100.200-300#guodun.50-60.300-400#guo.80-90.300-400"
status1.Title = "user.p.Guo."
status1.Height = 60
isIn, err = isInNoHeightCrossAsseList(str, status1)
assert.Nil(t, err)
assert.Equal(t, false, isIn)
status1.Height = 300
isIn, err = isInNoHeightCrossAsseList(str, status1)
assert.Nil(t, err)
assert.Equal(t, true, isIn)
//异常情况
str = "mc.10-100.200-300#guodun.50-60.300-400#guo.80.300-400"
status1.Title = "user.p.Guo."
status1.Height = 300
isIn, err = isInNoHeightCrossAsseList(str, status1)
assert.NotNil(t, err)
assert.Equal(t, false, isIn)
str = "mc.10-100.200-300#guodun.50-60.300-400#guo"
status1.Title = "user.p.Guo."
status1.Height = 300
isIn, err = isInNoHeightCrossAsseList(str, status1)
assert.Nil(t, err)
assert.Equal(t, false, isIn)
str = "mc.10-100.200-300#guodun.50-60.300-400#"
status1.Title = "user.p.Guo."
status1.Height = 300
isIn, err = isInNoHeightCrossAsseList(str, status1)
assert.Nil(t, err)
assert.Equal(t, false, isIn)
}
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