-
Notifications
You must be signed in to change notification settings - Fork 6
CrossChain Bridge Design
目标是实现从源链安全置换资产到目的链上产生等额影射资产(换进),同时支持从目的链上置换影射资产回源链(换出)。
本应用部署只支持配置一个源链资产到目的链影射资产的置换服务,这样可以减少应用内的处理复杂度。如果需要支持多个置换对,可以每个置换对单独配置并独立部署一个服务应用。
通过在目的链上创建影射资产,并维护换进换出操作时源链上已置换资产和目的链上对应影射资产的数额一致性。
通过 dcrm 安全多签方法实现多方共同管理资产和影射资产的换进换出置换操作。
方案图示:
-
部署服务应用
-
创建共管账户
采用 dcrm 技术创建。
在源链上创建一个 dcrm 共管帐户,这个帐户下的资产只能在共管人中有满足指定门限(例如 2/3, 3/5)的人签名时才能发起交易(类似多重签名技术)。
如果有多个置换对要部署,需要分开独立部署每一个置换对,而且确保各自采用不同的共管账户(除非你知道你用同一个共管账户在做什么而且是你所希望的)。
-
创建映射资产
采用 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
-
-
提供服务
服务通过 JSON-RPC API 方式提供,详见服务接口。
- 资产置换服务
- 置换状态查询
- 置换历史查询
- 其它服务
- 换进:从源链置换资产到目的链
- 换出:从目的链置换影射资产回源链
- 撤消无效换进:当充值交易忘记备注或者备注格式错误时可申请撤消
-
用户在源链上往共管帐户充值
- 指定目的链上的接收地址
BTC 上通过交易备注(OP_RETURN)
方式指定
ETH, FUSION 上通过交易 input data
指定 - 备注格式
SWAPTO:接收地址
的十六进制编码
例如,SWAPTO:0x0000000000000000000000000000000000000001
注意:由于在源链上填写指定格式的交易备注对普通用户来说有一定的难度,而且并非所有钱包应用支持填写交易备注,所以也可以通过一些可信跨链桥应用来做。在跨链桥应用中,用户只需填写跨链金额和目的链上的接收地址即可,跨链桥应用会向源链共管账户发起指定金额的带交易备注(指定绑定地址)的转账交易以完成此步骤。
- 指定目的链上的接收地址
-
用户使用充值资产交易的哈希申请换进置换
- 用户通过调用接口 swapin 申请
- 需要验证充值交易已成功入块并且参数正确
- 需要满足一定数量的稳定块高保障
-
服务提供者在目的链上增发等额影射资产到指定的接收地址
- 在服务接口 swapin 中实现
- 通过调用影射资产合约的
Swapin
方法实现增发功能 - 交易需要 dcrm 安全多方签名
注:如果步骤1忘记填写交易备注或者备注格式错误,如何找回资产?
通过接口 recallswapin 找回。
-
用户在目的链上销毁影射资产
- 通过调用影射资产合约的
Swapout
方法实现销毁
并指定源链上的接收地址
- 通过调用影射资产合约的
-
用户使用销毁资产交易的哈希申请换出置换
- 用户通过调用接口 swapout 申请
- 需要验证销毁交易已成功入块并且参数正确
- 需要满足一定数量的稳定块高保障
-
服务提供者在源链上从共管账户转账等额资产到指定的接收地址
- 在服务接口 swapout 中实现
- 在源链上转账等额资产到指定的接收地址
并给交易添加备注(SWAPTX:销毁资产的交易哈希
)方便源链浏览器展示关联交易(目的链销毁交易)。 - 交易需要 dcrm 安全多方签名
注:如果步骤1中指定了错误的接收地址,那么资产损失将无法挽回!
以换进置换为例,当用户通过 swapin(txid)
申请换进置换时,
-
首先进行换进置换登记
尝试写入
swapins
登记表格,如果txid
已存在表明已经登记则忽略写入 -
单独启动一个或者多个线程轮询处理登记表中换进申请
从登记表中取出最近尚未验证的记录进行验证并更新记录的
status
字段。 从登记表中取出最近尚未处理的记录进行处理并更新记录的status
字段。 处理成功,已发起置换交易后将交易哈希写入swapin_results
表格 -
单独启动一个或者多个线程轮询更新置换结果表格中的记录状态
从置换结果表中取出还未成功置换并达到稳定块高的记录,通过 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 | 服务侦听端口 |
置换申请登记表
换进置换登记表格
字段名 | 类型 | 含义 |
---|---|---|
txid | hex hash string | 充值交易哈希 (主键) |
status | uint16 | 状态码 |
timestamp | uint32 | 更新记录时间戳 |
memo | string | 备注(例如错误信息等) |
换出置换登记表格
字段名 | 类型 | 含义 |
---|---|---|
txid | hex hash string | 销毁交易哈希 (主键) |
status | uint16 | 状态码 |
timestamp | uint32 | 更新记录时间戳 |
memo | string | 备注(例如错误信息等) |
置换结果记录表
换进置换结果表格
字段名 | 类型 | 含义 |
---|---|---|
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 | 备注 |
换出置换结果表格
字段名 | 类型 | 含义 |
---|---|---|
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 | 绑定地址错误 |