# 平行链资产转移管理介绍

> 平行链支持主链资产和平行链资产之间的互转，也支持平行链资产间接的转移到另一个平行链。

## 1 chain33和平行链的统一资产表示

## 1.1 资产的身份

> 资产的身份有两个因素唯一确定：资产原生执行器和资产符号

- 资产原生执行器：指资产从哪个合约最初铸造的,比如coins合约，token合约，跨链的paracross合约
- 资产符号：指资产的名字，如bty,ccny

## 1.2 主链和平行链的资产合约区分

- 主链的资产合约没有前缀，比如coins, token
- 平行链的资产合约需要加上平行链title，如 user.p.game.coins, user.p.game.token

## 1.3 主链平行链资产统一表示

- 主链资产: coins.bty, token.ccny
- 平行链资产: user.p.game.coins.bty, user.p.game.token.ccny

## 1.4 跨链资产的统一表示

> 跨链资产转移到目标链的paracross合约，在目标链上可以认为是原生从paracross合约铸造的

- 主链资产coins.bty转移到平行链表示为:　user.p.game.paracross.coins.bty
- 平行链资产user.p.game.coins.ccny转移到主链表示为: paracross.user.p.game.coins.ccny

## 1.5 平行链转移到另一个平行链资产表示

> 两个平行链之间不能直接互转，需要先转到主链然后再转到另一个平行链，两笔交易

- 平行链game的user.p.game.coins.ccny资产转到主链表示为:paracross.user.p.game.coins.ccny
- 主链转移到test平行链表示为: user.p.test.paracross.paracross.user.p.game.coins.ccny,其中资产合约名为user.p.test.paracross,　资产符号名为paracross.user.p.game.coins.ccny,意思是从主链转过来的user.p.game.链的coins.ccny币

## 2 跨链资产转移的方向

> 新的跨链资产转移接口通过 交易执行器 + 资产合约　+ 资产符号　来唯一确定资产转移的方向: 转移或提回

```
　　　　　　　　　　　　　　　　　交易执行器                    资产合约名                  资产符号名                            目标资产名
主链转移到平行链:　　　　　　　　　user.p.game.paracross　　　  token                      ccny　                               user.p.game.paracross.token.ccny
主链从平行链提回:　　　　　　　　　user.p.game.paracross       user.p.game.paracross      token.ccny　                         主链资产恢复      
平行链转移到主链:　　　　　　　　　user.p.game.paracross       user.p.game.token          ccny                                 paracross.user.p.game.token.ccny
平行链从主链提回:　　　　　　　　　user.p.game.paracross       paracross                  user.p.game.token.ccny               平行链资产恢复
主链跨链资产转移到另一个平行链:　　user.p.test.paracross       paracross               　 user.p.game.token.ccny               user.p.test.paracross.paracross.user.p.game.token.ccny
主链跨链资产从另一个平行链提回:　　user.p.test.paracross       user.p.test.paracross   　 paracross.user.p.game.token.ccny     主链恢复到paracross合约
```

## 3 跨链资产转移步骤

> 准备跨链资产需要先转到本链的paracross合约下，再进行跨链转移交易

- 转账到paracross合约，比如coins, token资产转移到paracross合约,特别的主链上从Ａ平行链转移过来的资产虽然在paracross合约下，也需要一次转账到paracross合约
- 跨链转移交易，同时在主链和平行链执行
- 注意: 当前每个可铸币的原生合约都提供”各自”的存款到目标执行器的接口，比如token有token自己的，　paracross有paracross自己的transfer2Exec接口

## 4 跨链资产转移接口

## 4.1 资产转移接口

```
{
    "method":"Chain33.CreateTransaction",
    "params":[
        {
            "execer":"user.p.dog.paracross",
            "actionName":"CrossAssetTransfer",
            "payload":{
                "assetExec":"coins",
                "assetSymbol":"bty",
                "amount":100000000,
                "toAddr":"",
                "note":"",                
            }
        }
    ]
}
```

**参数说明：**

| 参数        | 类型   | 说明                                      |
| :---------- | :----- | :---------------------------------------- |
| method      | string | Chain33.CreateTransaction                 |
| execer      | string | 交易执行器，需填具体平行链title+paracross |
| assetExec   | string | 资产原生合约，比如coins,token             |
| assetSymbol | string | 资产符号，比如bty, ccny                   |
| amount      | int64  | 转移资产数量，精确到10^8                  |
| toAddr      | string | 可选，目标地址，缺省为交易签名地址        |
| note        | string | 可选，转移备注                            |

## 4.2 查询资产转移是否成功接口

> 只能在主链上查询

```
{
    "method":"Chain33.Query",
    "params":[
        {
            "execer":"paracross",
            "funcName":"GetAssetTxResult",
            "payload":{
                "data":"0x6162a730ab57d70b4bd32fd7ab0b57e0ba67aaca6d4a391579b772d4fe6024cb"
            }
        }
    ]
}
```

**参数说明：**

| 参数 | 类型   | 说明         |
| :--- | :----- | :----------- |
| data | string | 跨链交易hash |

**响应数据：**

```
{
    "id":null,
    "result":{
        "from":"12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv",
        "to":"1L6g6QcVgf2JjFWjFzdVUb9sFaanWYgpkL",
        "isWithdraw":false,
        "txHash":"0x6162a730ab57d70b4bd32fd7ab0b57e0ba67aaca6d4a391579b772d4fe6024cb",
        "amount":"100000000",
        "exec":"coins",
        "symbol":"bty",
        "crossType":0,
        "height":"4631836",
        "commitDoneHeight":"4631837",
        "paraHeight":"1258",
        "success":true
    },
    "error":null
}
```

**参数说明：**

| 参数             | 类型   | 说明                      |
| :--------------- | :----- | :------------------------ |
| method           | string | Chain33.CreateTransaction |
| from             | string | 跨链转移交易签名地址      |
| to               | string | 跨链转移内部合约地址      |
| isWithdraw       | bool   | 旧接口，弃用              |
| crossType        | int    | 旧接口，弃用              |
| height           | string | 交易主链执行高度          |
| commitDoneHeight | string | 交易在主链共识成功高度    |
| paraHeight       | string | 交易在平行链执行高度      |
| success          | string | 跨链转移交易是否成功      |

## 4.3 平行链跨资产转到合约接口

> 跨链转移进来的资产放在paracross合约下，默认为原生合约

```
{
    "method":"Chain33.CreateTransaction",
    "params":[
        {
            "execer":"{user.p.dog.}paracross",
            "actionName":"TransferToExec",
            "payload":{
                "execName":"{user.p.dog.}trade",
                "to":"1NJLuYtYjcrcSS5jcWZD3DLNRnUZ7Z1SRa",
                "amount":100000000,
                "cointoken":"coins.bty"
            }
        }
    ]
}
```

**参数说明：**

| 参数      | 类型   | 说明                                                     |
| :-------- | :----- | :------------------------------------------------------- |
| execer    | string | 主链填paracross，平行链需要把title加上                   |
| execName  | string | 目标合约名称，如果平行链上转需要填平行链的执行器名字     |
| to        | string | 目标合约地址，示例是user.p.dog.trade的地址               |
| amount    | int    | 转移数量                                                 |
| cointoken | string | 转移资产符号,默认原生合约就是paracross，所以只填符号即可 |

## 4.4 查询平行链共识高度

```
{
    "method":"Chain33.Query",
    "params":[
        {
            "execer":"paracross",
            "funcName":"GetTitle",
            "payload":{
                "data":"user.p.dog."
            }
        }
    ]
}
```

**响应数据：**

```
{
    "id":null,
    "result":{
        "title":"user.p.dog.",
        "height":"1265",
        "blockHash":"0x7409750e1aa739a02a65ca6e807236e16efec380c70e2f26b6778369866c216a",
        "mainHeight":"4632216",
        "mainHash":"0xd0048c8a298d196c90f19a653725cc01207c97aaacc0cdf31c5dccaf2bb3624e"
    },
    "error":null
}
```

## 4.5 查询平行链某高度共识情况

> 可以查看平行链某高度超级节点提交共识情况，查看哪些账户提交了共识，共识hash是否相同，若某高度未达成共识，可以用此接口查询提交情况

```
{
    "method":"Chain33.Query",
    "params":[
        {
            "execer":"paracross",
            "funcName":"GetTitleHeight",
            "payload":{
                "title":"user.p.dog.",
                "height":1000
            }
        }
    ]
}
```

**响应数据：**

```
{
    "id":null,
    "result":{
        "status":1,
        "title":"user.p.gamenew.",
        "height":"1000",
        "mainHeight":"4599999",
        "mainHash":"0xbafff1d0ba08462bbf08c3a507f243d14e55c7efc1e07023e2523e4efa0e8f53",
        "commitAddrs":[
            "1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4",
            "1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs",
            "1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR"
        ],
        "commitBlockHash":[
            "0x8dc126e0f7ae4ea4d47368016f71a575817f89ad98e7b646048dd2364038d387",
            "0x8dc126e0f7ae4ea4d47368016f71a575817f89ad98e7b646048dd2364038d387",
            "0x8dc126e0f7ae4ea4d47368016f71a575817f89ad98e7b646048dd2364038d387"
        ]
    },
    "error":null
}
```

**参数说明：**

| 参数            | 类型   | 说明                 |
| :-------------- | :----- | :------------------- |
| status          | int    | 1:成功，0:未共识成功 |
| commitAddrs     | string | 超级节点投票账户     |
| commitBlockHash | string | 超级节点提交块hash   |

## 4.6 查询平行链高度和共识高度

> 可以在主链或平行链上查询平行链当前高度和共识高度，在主链上查的链高度就是平行链的共识高度

```
{
    "method":"Chain33.Query",
    "params":[
        {
            "execer":"paracross",
            "funcName":"GetHeight",
            "payload":{
                "data":"user.p.dog."
            }
        }
    ]
}
```

| 参数 | 类型   | 说明                               |
| :--- | :----- | :--------------------------------- |
| data | string | 主链上查询需要填，平行链上可以不填 |

**响应数据**

```
{
    "id":null,
    "result":{
        "title":"user.p.gamenew.",
        "chainHeight":"1427",
        "consensHeight":"1425",
        "consensBlockHash":"0x1f7a9d51f7805cdba2952ea55a747e18f8113482a43ba5db0489c86c46019749"
    },
    "error":null
}
```

## 4.7 查询平行链高度和主链匹配高度

> 在平行链上查询具体平行链区块高度hash和对应主链区块的高度和hash

```
{
    "method":"Chain33.Query",
    "params":[
        {
            "execer":"paracross",
            "funcName":"GetBlock2MainInfo",
            "payload":{
                "start":"100",
                "end":"101",
                "isDetail":false
            }
        }
    ]
}
```

**响应数据**

```
{
    "id":null,
    "result":{
        "items":[
            {
                "height":"100",
                "blockHash":"0x2f1f78af6b10c0eb2447ee93b43365c99ef3ee6a929826a9385872572704e6de",
                "mainHeight":"4419999",
                "mainHash":"0xa41d2df00a6bcd64bb0d3fee5f60a78f1c7ef6f6118647f6b629abeaa5abee69"
            },
            {
                "height":"101",
                "blockHash":"0x25ce5b5f939690fddfd4e6929c6d76dea074013630d2704e9c14f6627e364815",
                "mainHeight":"4420199",
                "mainHash":"0x773c0d65c2c9a1281cab69f959650407c1ec6282098cbcd853fe9f52dde3527a"
            }
        ]
    },
    "error":null
}
```

