Skip to content

CrossChain Bridge Design

cross-chain edited this page May 22, 2020 · 7 revisions

方案设计

目标是实现从源链安全置换资产到目的链上产生等额影射资产(换进),同时支持从目的链上置换影射资产回源链(换出)。

本应用部署只支持配置一个源链资产到目的链影射资产的置换服务,这样可以减少应用内的处理复杂度。如果需要支持多个置换对,可以每个置换对单独配置并独立部署一个服务应用。

快速导航

方案概述

换进步骤

换出步骤

服务处理流程

配置文件

启动参数

服务接口

数据存储设计

方案概述

通过在目的链上创建影射资产,并维护换进换出操作时源链上已置换资产和目的链上对应影射资产的数额一致性。

通过 dcrm 安全多签方法实现多方共同管理资产和影射资产的换进换出置换操作。

方案图示:

Cross-Chain Bridge

服务提供者主要操作

  1. 部署服务应用

  2. 创建共管账户

    采用 dcrm 技术创建。

    在源链上创建一个 dcrm 共管帐户,这个帐户下的资产只能在共管人中有满足指定门限(例如 2/3, 3/5)的人签名时才能发起交易(类似多重签名技术)。

    如果有多个置换对要部署,需要分开独立部署每一个置换对,而且确保各自采用不同的共管账户(除非你知道你用同一个共管账户在做什么而且是你所希望的)。

  3. 创建映射资产

    采用 dcrm 安全多方签名发布扩展 ERC20 token智能合约的方式实现,该ERC20 映射资产由DCRM节点分布式控制。

    ERC20合约必须支持以下两个扩展接口:

    • SwapIn 接口

      功能为增发数量为 amount 的影射资产到 account 账户(该账户为换进置换交易备注中指定的目的链上的接收地址)。通过 onlyOwner 修饰保证增发只能由创建合约的共管账户进行。

      接口产生 LogSwapin(bytes32 indexed txhash, address indexed account, uint amount) 日志方便目的链浏览器展示 SwapIn 信息和关联交易(源链充值交易 )。

      Swapin(bytes32 txhash, address account, uint256 amount) public onlyOwner
    • SwapOut 接口

      功能为在目的链上从 msg.sender 账户销毁数量为 amount 的影射资产,并指定换出置换在源链上的接收地址为 account 账户。

      接口产生 LogSwapout(address indexed account, uint amount, string bindaddr) 日志方便目的链浏览器展示 SwapOut 信息。

      Swapout(uint256 amount, string memory bindaddr) public

      例子以参考:BtcSwapAsset

  4. 提供服务

    服务通过 JSON-RPC API 方式提供,详见服务接口

    • 资产置换服务
    • 置换状态查询
    • 置换历史查询
    • 其它服务

普通用户主要操作

  1. 换进:从源链置换资产到目的链
  2. 换出:从目的链置换影射资产回源链
  3. 撤消无效换进:当充值交易忘记备注或者备注格式错误时可申请撤消

换进步骤

  1. 用户在源链上往共管帐户充值

    • 指定目的链上的接收地址
      BTC 上通过交易备注(OP_RETURN)方式指定
      ETH, FUSION 上通过交易 input data 指定
    • 备注格式
      SWAPTO:接收地址的十六进制编码
      例如,SWAPTO:0x0000000000000000000000000000000000000001

    注意:由于在源链上填写指定格式的交易备注对普通用户来说有一定的难度,而且并非所有钱包应用支持填写交易备注,所以也可以通过一些可信跨链桥应用来做。在跨链桥应用中,用户只需填写跨链金额和目的链上的接收地址即可,跨链桥应用会向源链共管账户发起指定金额的带交易备注(指定绑定地址)的转账交易以完成此步骤。

  2. 用户使用充值资产交易的哈希申请换进置换

    • 用户通过调用接口 swapin 申请
    • 需要验证充值交易已成功入块并且参数正确
    • 需要满足一定数量的稳定块高保障
  3. 服务提供者在目的链上增发等额影射资产到指定的接收地址

    • 在服务接口 swapin 中实现
    • 通过调用影射资产合约的 Swapin 方法实现增发功能
    • 交易需要 dcrm 安全多方签名

注:如果步骤1忘记填写交易备注或者备注格式错误,如何找回资产?
通过接口 recallswapin 找回。

换出步骤

  1. 用户在目的链上销毁影射资产

    • 通过调用影射资产合约的 Swapout 方法实现销毁
      并指定源链上的接收地址
  2. 用户使用销毁资产交易的哈希申请换出置换

    • 用户通过调用接口 swapout 申请
    • 需要验证销毁交易已成功入块并且参数正确
    • 需要满足一定数量的稳定块高保障
  3. 服务提供者在源链上从共管账户转账等额资产到指定的接收地址

    • 在服务接口 swapout 中实现
    • 在源链上转账等额资产到指定的接收地址
      并给交易添加备注(SWAPTX:销毁资产的交易哈希)方便源链浏览器展示关联交易(目的链销毁交易)。
    • 交易需要 dcrm 安全多方签名

注:如果步骤1中指定了错误的接收地址,那么资产损失将无法挽回!

服务处理流程

以换进置换为例,当用户通过 swapin(txid) 申请换进置换时,

  1. 首先进行换进置换登记

    尝试写入 swapins 登记表格,如果 txid 已存在表明已经登记则忽略写入

  2. 单独启动一个或者多个线程轮询处理登记表中换进申请

    从登记表中取出最近尚未验证的记录进行验证并更新记录的 status 字段。 从登记表中取出最近尚未处理的记录进行处理并更新记录的 status 字段。 处理成功,已发起置换交易后将交易哈希写入 swapin_results 表格

  3. 单独启动一个或者多个线程轮询更新置换结果表格中的记录状态

    从置换结果表中取出还未成功置换并达到稳定块高的记录,通过 RPC 查询验证并更新记录的状态和配对交易相关字段信息。

配置文件

字段名 值类型 含义
s_chain_name string 源链名
s_asset_symbol string 源链资产符号
s_asset_decimals uint8 源链资产小数位数
s_dcrm_address string 源链共管账户地址
s_rpc_server string 源链RPC服务器URL
d_chain_name string 目的链名
d_asset_symbol string 目的链资产符号
d_asset_decimals uint8 目的链资产小数位数
d_contract_address string 目的链影射资产合约地址
d_rpc_server string 目的链RPC服务器URL

启动参数

只需使用 --config <配置文件> 指定配置文件即可,其余均在配置文件中设置。

对应添加的配置文件新增项如下:

字段名 值类型 含义
rpc_port uint32 服务侦听端口

服务接口

参见 crossChain-Bridge API

数据存储设计

置换申请登记表

swapins 表格

换进置换登记表格

字段名 类型 含义
txid hex hash string 充值交易哈希 (主键)
status uint16 状态码
timestamp uint32 更新记录时间戳
memo string 备注(例如错误信息等)

swapouts 表格

换出置换登记表格

字段名 类型 含义
txid hex hash string 销毁交易哈希 (主键)
status uint16 状态码
timestamp uint32 更新记录时间戳
memo string 备注(例如错误信息等)

置换结果记录表

swapin_results 表格

换进置换结果表格

字段名 类型 含义
txid hex hash string 充值交易哈希 (主键)
txheight uint64 充值交易块高
txtime uint32 充值交易块时间戳
from hex address string 交易的from地址
to hex address string 交易的to地址
bind hex address string 交易备注中的绑定地址
value string of big int 交易数额
swaptx hex hash string 配对交易哈希
swapheight uint64 配对交易块高
swaptime uint32 配对交易块时间戳
status uint16 状态码
timestamp uint32 更新记录时间戳
memo string 备注

swapout_results 表格

换出置换结果表格

字段名 类型 含义
txid hex hash string 销毁交易哈希 (主键)
txheight uint64 销毁交易块高
txtime uint32 销毁交易块时间戳
from hex address string 交易的from地址
to hex address string 交易的to地址
bind hex address string 交易中指定的绑定地址
value string of big int 交易数额
swaptx hex hash string 配对交易哈希
swapheight uint64 配对交易块高
swaptime uint32 配对交易块时间戳
status uint16 状态码
timestamp uint32 更新记录时间戳
memo string 备注

状态码

以上表中的 status 状态码统一表示如下:

状态码 含义
0 待验证
1 验证失败
2 可以撤消
3 等待撤消
4 撤消出错
5 等待置换
6 置换出错
7 已经处理
8 未发出置换,等待确认
9 已发出置换,等待上链
10 置换成功
11 绑定地址错误