Commit 298964c4 authored by mdj33's avatar mdj33 Committed by 33cn

para asset transfer bypass paracross exec

parent 541275bc
...@@ -93,8 +93,8 @@ coinDevFund=12 ...@@ -93,8 +93,8 @@ coinDevFund=12
[consensus.sub.para] [consensus.sub.para]
#主链节点的grpc服务器ip,当前可以支持多ip负载均衡,如“118.31.177.1:8802,39.97.2.127:8802,120.77.111.44:8802,jiedian2.bityuan.com,cloud.bityuan.com #主链节点的grpc服务器ip,当前可以支持多ip负载均衡,如“118.31.177.1:8802,39.97.2.127:8802”
#ParaRemoteGrpcClient="118.31.177.1:8802,39.97.2.127:8802,120.77.111.44:8802,jiedian2.bityuan.com,cloud.bityuan.com,183.129.226.74:8802,183.129.226.75:8802" #ParaRemoteGrpcClient="118.31.177.1:8802,39.97.2.127:8802,120.77.111.44:8802,jiedian2.bityuan.com,cloud.bityuan.com"
ParaRemoteGrpcClient="localhost:8802" ParaRemoteGrpcClient="localhost:8802"
#主链指定高度的区块开始同步 #主链指定高度的区块开始同步
startHeight=345850 startHeight=345850
......
...@@ -533,26 +533,13 @@ function para_cross_transfer_from_parachain() { ...@@ -533,26 +533,13 @@ function para_cross_transfer_from_parachain() {
exit 1 exit 1
fi fi
echo "========== #1. user.p.game chain transfer to main chain 300 user.p.game.coins.para, remain=700 ===========" echo "========== #1. user.p.game chain transfer to main chain 300 user.p.game.coins.para, remain=0 ==========="
hash=$(${PARA_CLI5} send para cross_transfer -a 300 -e user.p.game.coins -s para -t 1BM2xhBk95qoae8zKNDWwAVGgBERhb7DQu -k 0x128de4afa7c061c00d854a1bca51b58e80a2c292583739e5aebf4c0f778959e1) hash=$(${PARA_CLI5} send para cross_transfer -a 300 -e user.p.game.coins -s para -t 1BM2xhBk95qoae8zKNDWwAVGgBERhb7DQu -k 0x128de4afa7c061c00d854a1bca51b58e80a2c292583739e5aebf4c0f778959e1)
echo "${hash}" echo "${hash}"
query_tx "${PARA_CLI5}" "${hash}" query_tx "${PARA_CLI5}" "${hash}"
check_cross_transfer_game_balance "300.0000" "0.0000" "${hash}" check_cross_transfer_game_balance "300.0000" "0.0000" "${hash}"
echo "check asset transfer tx=$hash"
res=$(${CLI} para asset_txinfo -s "${hash}")
echo "$res"
succ=$(jq -r ".success" <<<"$res")
if [ "${succ}" != "true" ]; then
echo "para asset transfer tx report fail"
exit 1
fi
echo "========== #2. main transfer 200 user.p.game.coins.para game chain asset to para chain, main remain=100, parachain=200 ====" echo "========== #2. main transfer 200 user.p.game.coins.para game chain asset to para chain, main remain=100, parachain=200 ===="
hash=$(${CLI} send para transfer_exec -e paracross -a 200 -s user.p.game.coins.para -k 0x128de4afa7c061c00d854a1bca51b58e80a2c292583739e5aebf4c0f778959e1)
echo "${hash}"
query_tx "${CLI}" "${hash}"
hash=$(${CLI} --paraName=user.p.para. send para cross_transfer -a 200 -e paracross -s user.p.game.coins.para -t 1BM2xhBk95qoae8zKNDWwAVGgBERhb7DQu -k 0x128de4afa7c061c00d854a1bca51b58e80a2c292583739e5aebf4c0f778959e1) hash=$(${CLI} --paraName=user.p.para. send para cross_transfer -a 200 -e paracross -s user.p.game.coins.para -t 1BM2xhBk95qoae8zKNDWwAVGgBERhb7DQu -k 0x128de4afa7c061c00d854a1bca51b58e80a2c292583739e5aebf4c0f778959e1)
echo "${hash}" echo "${hash}"
query_tx "${CLI}" "${hash}" query_tx "${CLI}" "${hash}"
...@@ -562,19 +549,9 @@ function para_cross_transfer_from_parachain() { ...@@ -562,19 +549,9 @@ function para_cross_transfer_from_parachain() {
hash=$(${CLI} --paraName=user.p.para. send para cross_transfer -a 50 -e user.p.para.paracross -s paracross.user.p.game.coins.para -t 1BM2xhBk95qoae8zKNDWwAVGgBERhb7DQu -k 0x128de4afa7c061c00d854a1bca51b58e80a2c292583739e5aebf4c0f778959e1) hash=$(${CLI} --paraName=user.p.para. send para cross_transfer -a 50 -e user.p.para.paracross -s paracross.user.p.game.coins.para -t 1BM2xhBk95qoae8zKNDWwAVGgBERhb7DQu -k 0x128de4afa7c061c00d854a1bca51b58e80a2c292583739e5aebf4c0f778959e1)
echo "${hash}" echo "${hash}"
query_tx "${CLI}" "${hash}" query_tx "${CLI}" "${hash}"
check_cross_transfer_para_balance "100.0000" "150.0000" "${hash}" check_cross_transfer_para_balance "150.0000" "150.0000" "${hash}"
echo "withdraw 50 from paracross exec"
hash=$(${CLI} send para withdraw -a 50 -e paracross -s user.p.game.coins.para -k 0x128de4afa7c061c00d854a1bca51b58e80a2c292583739e5aebf4c0f778959e1)
echo "${hash}"
query_tx "${CLI}" "${hash}"
acc=$(${CLI} asset balance -a 1BM2xhBk95qoae8zKNDWwAVGgBERhb7DQu --asset_exec paracross --asset_symbol user.p.game.coins.para -e paracross | jq -r ".balance")
if [ "${acc}" != "150.0000" ]; then
echo "para_cross_transfer_ withdraw from paracross exec failed, acc=$acc"
exit 1
fi
echo "========== #4. withdraw game chain asset to game chain from main chain 50 user.p.game.coins.para,parachain=150,main=100,para=50+700 ======" echo "========== #4. withdraw game chain asset to game chain from main chain 50 user.p.game.coins.para,parachain=150,main=100,game=50 ======"
hash=$(${CLI} --paraName=user.p.game. send para cross_transfer -a 50 -e paracross -s user.p.game.coins.para -t 1BM2xhBk95qoae8zKNDWwAVGgBERhb7DQu -k 0x128de4afa7c061c00d854a1bca51b58e80a2c292583739e5aebf4c0f778959e1) hash=$(${CLI} --paraName=user.p.game. send para cross_transfer -a 50 -e paracross -s user.p.game.coins.para -t 1BM2xhBk95qoae8zKNDWwAVGgBERhb7DQu -k 0x128de4afa7c061c00d854a1bca51b58e80a2c292583739e5aebf4c0f778959e1)
echo "${hash}" echo "${hash}"
query_tx "${CLI}" "${hash}" query_tx "${CLI}" "${hash}"
......
...@@ -63,11 +63,13 @@ func getCrossAction(transfer *pt.CrossAssetTransfer, txExecer string) (int64, er ...@@ -63,11 +63,13 @@ func getCrossAction(transfer *pt.CrossAssetTransfer, txExecer string) (int64, er
/* /*
修正原生执行器名字 修正原生执行器名字
realExec realSymbol type realExec realSymbol
coins+bty coins bty coins+bty mainTransfer coins bty
paracross+user.p.test1.coins.bty coins bty paracross+user.p.test1.coins.bty paraWithdraw coins bty
user.p.test1.coins+bty coins bty user.p.test1.coins+bty paraTransfer coins bty
user.p.test1.paracross+coins.bty coins bty user.p.test1.paracross+coins.bty mainWithdraw coins bty
paracross+user.p.test1.coins.bty(->user.p.test2) mainTransfer paracross user.p.test1.coins.bty
user.p.test2.paracross+paracross.user.p.test1.coins.bty mainWithdraw paracross user.p.test1.coins.bty
注意: 注意:
1. user.p.test1.coins+bty只是对外表示平行链资产,真正执行器也是coins,因为account模型的mavl-coins-bty- 在主链和平行链都一样,平行链模型并不是mavl-user.p.test.coins-bty- 1. user.p.test1.coins+bty只是对外表示平行链资产,真正执行器也是coins,因为account模型的mavl-coins-bty- 在主链和平行链都一样,平行链模型并不是mavl-user.p.test.coins-bty-
2. paracross执行器下的资产都是外来资产,在withdraw时候,真正的原生执行器是在symbol里面 2. paracross执行器下的资产都是外来资产,在withdraw时候,真正的原生执行器是在symbol里面
...@@ -195,13 +197,23 @@ func (a *action) execTransfer(transfer *pt.CrossAssetTransfer) (*types.Receipt, ...@@ -195,13 +197,23 @@ func (a *action) execTransfer(transfer *pt.CrossAssetTransfer) (*types.Receipt,
execAddr = address.ExecAddress(string(a.tx.Execer)) execAddr = address.ExecAddress(string(a.tx.Execer))
toAddr = address.ExecAddress(pt.ParaX) toAddr = address.ExecAddress(pt.ParaX)
} }
clog.Debug("paracross.execTransfer", "execer", string(a.tx.Execer), "assetexec", transfer.AssetExec, "symbol", transfer.AssetSymbol,
"txHash", common.ToHex(a.tx.Hash()))
//对于paracross合约下的资产直接转账,不需要通过存到paracross合约下再转账,这里只有主链的A平行链资产转移到另一个B平行链场景
if transfer.AssetExec == pt.ParaX {
r, err := accDB.Transfer(a.fromaddr, toAddr, transfer.Amount)
if err != nil {
return nil, errors.Wrapf(err, "assetTransfer,assetExec=%s,assetSym=%s", transfer.AssetExec, transfer.AssetSymbol)
}
return r, nil
}
fromAcc := accDB.LoadExecAccount(a.fromaddr, execAddr) fromAcc := accDB.LoadExecAccount(a.fromaddr, execAddr)
if fromAcc.Balance < transfer.Amount { if fromAcc.Balance < transfer.Amount {
return nil, errors.Wrapf(types.ErrNoBalance, "execTransfer,acctBalance=%d,assetExec=%s,assetSym=%s", fromAcc.Balance, transfer.AssetExec, transfer.AssetSymbol) return nil, errors.Wrapf(types.ErrNoBalance, "execTransfer,acctBalance=%d,assetExec=%s,assetSym=%s", fromAcc.Balance, transfer.AssetExec, transfer.AssetSymbol)
} }
clog.Debug("paracross.execTransfer", "execer", string(a.tx.Execer), "assetexec", transfer.AssetExec, "symbol", transfer.AssetSymbol,
"txHash", common.ToHex(a.tx.Hash()))
r, err := accDB.ExecTransfer(a.fromaddr, toAddr, execAddr, transfer.Amount) r, err := accDB.ExecTransfer(a.fromaddr, toAddr, execAddr, transfer.Amount)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "assetTransfer,assetExec=%s,assetSym=%s", transfer.AssetExec, transfer.AssetSymbol) return nil, errors.Wrapf(err, "assetTransfer,assetExec=%s,assetSym=%s", transfer.AssetExec, transfer.AssetSymbol)
...@@ -225,6 +237,16 @@ func (a *action) execWithdraw(withdraw *pt.CrossAssetTransfer, withdrawTx *types ...@@ -225,6 +237,16 @@ func (a *action) execWithdraw(withdraw *pt.CrossAssetTransfer, withdrawTx *types
clog.Debug("Paracross.execWithdraw", "amount", withdraw.Amount, "from", fromAddr, clog.Debug("Paracross.execWithdraw", "amount", withdraw.Amount, "from", fromAddr,
"assetExec", withdraw.AssetExec, "symbol", withdraw.AssetSymbol, "execAddr", execAddr, "txHash", common.ToHex(a.tx.Hash())) "assetExec", withdraw.AssetExec, "symbol", withdraw.AssetSymbol, "execAddr", execAddr, "txHash", common.ToHex(a.tx.Hash()))
//对于paracross合约下的资产直接转账,不需要通过存到paracross合约下再转账,这里只有主链的A平行链资产转移到另一个B平行链场景
if withdraw.AssetExec == pt.ParaX {
r, err := accDB.Transfer(fromAddr, withdraw.ToAddr, withdraw.Amount)
if err != nil {
return nil, errors.Wrapf(err, "assetWithdraw,assetExec=%s,assetSym=%s", withdraw.AssetExec, withdraw.AssetSymbol)
}
return r, nil
}
r, err := accDB.ExecTransfer(fromAddr, withdraw.ToAddr, execAddr, withdraw.Amount) r, err := accDB.ExecTransfer(fromAddr, withdraw.ToAddr, execAddr, withdraw.Amount)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "assetWithdraw,assetExec=%s,assetSym=%s", withdraw.AssetExec, withdraw.AssetSymbol) return nil, errors.Wrapf(err, "assetWithdraw,assetExec=%s,assetSym=%s", withdraw.AssetExec, withdraw.AssetSymbol)
......
...@@ -390,11 +390,35 @@ func TestAmendTransferParam(t *testing.T) { ...@@ -390,11 +390,35 @@ func TestAmendTransferParam(t *testing.T) {
rst, err := amendTransferParam(transfer, act) rst, err := amendTransferParam(transfer, act)
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, transfer.AssetExec, rst.AssetExec) assert.Equal(t, transfer.AssetExec, rst.AssetExec)
assert.Equal(t, transfer.AssetSymbol, rst.AssetSymbol)
transfer = &pt.CrossAssetTransfer{AssetExec: "paracross", AssetSymbol: "user.p.para.coins.bty"} transfer = &pt.CrossAssetTransfer{AssetExec: "paracross", AssetSymbol: "user.p.para.coins.bty"}
rst, err = amendTransferParam(transfer, act) rst, err = amendTransferParam(transfer, act)
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, transfer.AssetExec, rst.AssetExec) assert.Equal(t, transfer.AssetExec, rst.AssetExec)
assert.Equal(t, transfer.AssetSymbol, rst.AssetSymbol)
//
act = int64(pt.ParacrossMainAssetTransfer)
transfer = &pt.CrossAssetTransfer{AssetExec: "token", AssetSymbol: "coins.bty"}
rst, err = amendTransferParam(transfer, act)
assert.NotNil(t, err)
t.Log("token.coins.bty,err=", err)
transfer = &pt.CrossAssetTransfer{AssetExec: "paracross", AssetSymbol: "bty"}
rst, err = amendTransferParam(transfer, act)
assert.NotNil(t, err)
t.Log("paracross.bty,err=", err)
transfer = &pt.CrossAssetTransfer{AssetExec: "user.p.para.coins", AssetSymbol: "coins.bty"}
rst, err = amendTransferParam(transfer, act)
assert.NotNil(t, err)
t.Log("user.p.para.coins.coins.bty,err=", err)
transfer = &pt.CrossAssetTransfer{AssetExec: "user.p.para.paracross", AssetSymbol: "bty"}
rst, err = amendTransferParam(transfer, act)
assert.NotNil(t, err)
t.Log("user.p.para.paracross.bty,err=", err)
// //
act = int64(pt.ParacrossMainAssetWithdraw) act = int64(pt.ParacrossMainAssetWithdraw)
...@@ -405,7 +429,7 @@ func TestAmendTransferParam(t *testing.T) { ...@@ -405,7 +429,7 @@ func TestAmendTransferParam(t *testing.T) {
assert.Equal(t, "bty", rst.AssetSymbol) assert.Equal(t, "bty", rst.AssetSymbol)
act = int64(pt.ParacrossMainAssetWithdraw) act = int64(pt.ParacrossMainAssetWithdraw)
transfer = &pt.CrossAssetTransfer{AssetExec: "user.p.test.paracross", AssetSymbol: "paracross.user.p.test.coins.bty"} transfer = &pt.CrossAssetTransfer{AssetExec: "user.p.test2.paracross", AssetSymbol: "paracross.user.p.test.coins.bty"}
rst, err = amendTransferParam(transfer, act) rst, err = amendTransferParam(transfer, act)
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, "paracross", rst.AssetExec) assert.Equal(t, "paracross", rst.AssetExec)
...@@ -437,26 +461,4 @@ func TestAmendTransferParam(t *testing.T) { ...@@ -437,26 +461,4 @@ func TestAmendTransferParam(t *testing.T) {
rst, err = amendTransferParam(transfer, act) rst, err = amendTransferParam(transfer, act)
assert.NotNil(t, err) assert.NotNil(t, err)
//
act = int64(pt.ParacrossMainAssetTransfer)
transfer = &pt.CrossAssetTransfer{AssetExec: "token", AssetSymbol: "coins.bty"}
rst, err = amendTransferParam(transfer, act)
assert.NotNil(t, err)
t.Log("token.coins.bty,err=", err)
transfer = &pt.CrossAssetTransfer{AssetExec: "paracross", AssetSymbol: "bty"}
rst, err = amendTransferParam(transfer, act)
assert.NotNil(t, err)
t.Log("paracross.bty,err=", err)
transfer = &pt.CrossAssetTransfer{AssetExec: "user.p.para.coins", AssetSymbol: "coins.bty"}
rst, err = amendTransferParam(transfer, act)
assert.NotNil(t, err)
t.Log("user.p.para.coins.coins.bty,err=", err)
transfer = &pt.CrossAssetTransfer{AssetExec: "user.p.para.paracross", AssetSymbol: "bty"}
rst, err = amendTransferParam(transfer, act)
assert.NotNil(t, err)
t.Log("user.p.para.paracross.bty,err=", err)
} }
...@@ -180,7 +180,7 @@ func (e *Paracross) ExecLocal_CrossAssetTransfer(payload *pt.CrossAssetTransfer, ...@@ -180,7 +180,7 @@ func (e *Paracross) ExecLocal_CrossAssetTransfer(payload *pt.CrossAssetTransfer,
if !cfg.IsPara() && (act == pt.ParacrossMainAssetWithdraw || act == pt.ParacrossParaAssetTransfer) { if !cfg.IsPara() && (act == pt.ParacrossMainAssetWithdraw || act == pt.ParacrossParaAssetTransfer) {
return nil, nil return nil, nil
} }
asset, err := e.getCrossAssetTransferInfo(payload, tx) asset, err := e.getCrossAssetTransferInfo(payload, tx, act)
if err != nil { if err != nil {
return nil, err return nil, err
} }
......
...@@ -151,7 +151,7 @@ func (c *Paracross) udpateLocalParaTxs(paraTitle string, paraHeight int64, cross ...@@ -151,7 +151,7 @@ func (c *Paracross) udpateLocalParaTxs(paraTitle string, paraHeight int64, cross
} }
//主链共识后,平行链执行出错的平行链资产withdraw回滚 //主链共识后,平行链执行出错的平行链资产withdraw回滚
if act == pt.ParacrossMainAssetWithdraw || act == pt.ParacrossParaAssetTransfer { if act == pt.ParacrossMainAssetWithdraw || act == pt.ParacrossParaAssetTransfer {
asset, err := c.getCrossAssetTransferInfo(payload.GetCrossAssetTransfer(), paraTx.Tx) asset, err := c.getCrossAssetTransferInfo(payload.GetCrossAssetTransfer(), paraTx.Tx, act)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -210,7 +210,7 @@ func (c *Paracross) getAssetTransferInfo(tx *types.Transaction, coinToken string ...@@ -210,7 +210,7 @@ func (c *Paracross) getAssetTransferInfo(tx *types.Transaction, coinToken string
return asset, nil return asset, nil
} }
func (c *Paracross) getCrossAssetTransferInfo(payload *pt.CrossAssetTransfer, tx *types.Transaction) (*pt.ParacrossAsset, error) { func (c *Paracross) getCrossAssetTransferInfo(payload *pt.CrossAssetTransfer, tx *types.Transaction, act int64) (*pt.ParacrossAsset, error) {
exec := payload.AssetExec exec := payload.AssetExec
symbol := payload.AssetSymbol symbol := payload.AssetSymbol
if payload.AssetSymbol == "" { if payload.AssetSymbol == "" {
...@@ -223,14 +223,20 @@ func (c *Paracross) getCrossAssetTransferInfo(payload *pt.CrossAssetTransfer, tx ...@@ -223,14 +223,20 @@ func (c *Paracross) getCrossAssetTransferInfo(payload *pt.CrossAssetTransfer, tx
return nil, err return nil, err
} }
isWithDraw := true
if act == pt.ParacrossMainAssetTransfer || act == pt.ParacrossParaAssetTransfer {
isWithDraw = false
}
asset := &pt.ParacrossAsset{ asset := &pt.ParacrossAsset{
From: tx.From(), From: tx.From(),
To: tx.To, To: tx.To,
Amount: amount, IsWithdraw: isWithDraw,
TxHash: common.ToHex(tx.Hash()), Amount: amount,
Height: c.GetHeight(), TxHash: common.ToHex(tx.Hash()),
Exec: exec, Height: c.GetHeight(),
Symbol: symbol, Exec: exec,
Symbol: symbol,
} }
return asset, nil return asset, nil
} }
......
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