这篇文章上次修改于 741 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

跨链:将资产从一条链转到另一条链。比如 ETH 上的 eth@ETH 跨到 CKB 上成为 eth@ckb,即 eth@ETH --> eth@CKB,大概的过程是,锁住 eth@ETH,然后铸造等量的 eth@CKB。如果要跨回去,销毁 eth@CKB,然后解锁 eth@ETH。

1 Force Bridge 中的跨链流程

  • Bridge in: ETH —> CKB

    • lock: 向 ETH 发送交易(user@ETH —> committee@ETH)

      • 连接 MetaMask 钱包: MetaMaskInpageProvider 发送请求 eth_requestAccounts
      • 如果用户没有在当前的 erc20 代币上转过账,需要用户 approve
      • 生成交易
      • 发送交易:ethersproject.JsonRpcSigner.sendTransaction()

        • 需要用户在 MetaMask 钱包上点击 confirm 按钮,确认交易
    • mint: 向 CKB 发送交易(committee@CKB —> user@CKB)

      • 不需要连接钱包,向 verifier 收集多方签名,verifier 验证交易合法后返回签名
  • Bridge out: CKB —> ETH

    • burn: 向 CKB 发送交易(user@CKB —> committee@CKB)

      • 连接 MetaMask 钱包: MetaMaskInpageProvider 发送请求 eth_requestAccounts
      • 生成交易
      • 获得签名:MetaMaskInpageProvider 发送请求 personal_sign,需要用户在 MetaMask 钱包上点击 sign 按钮
      • 签名交易:将签名放到 witnesses 中,ckb-lumos.helpers.createTransactionFromSkeleton() 构造 signedTx
      • 发送交易:ckb-lumos.RPC.send_transaction()
    • unlock: 向 ETH 发送交易( committee@ETH —> user@ETH)

      • 不需要连接钱包,向 verifier 收集多方签名,verifier 验证交易合法后返回签名

2 支持 BTC 跨链

  • 介绍

    • Multichain、SimpleSwapFastBTCOneBTC:对于 BTC —> ETH

      • 用户填写转账额度和自己的 ETH 地址。或者连接 MetaMask 后自动填充地址。
      • 点击 Swap 按钮后,系统给用户提供一个多签 BTC 地址。
      • 用户手动向该多签 BTC 地址转账 Bitcoin。
      • 系统确认收到了用户的转账,自动向用户填写的 ETH 地址转账。
    • BTC-Relay:一个位于以太坊上的合约,存储 Bitcoin 区块头并用其构建一个迷你版的 BTC,以验证交易是否合法。只支持 BTC —> ETH,不支持 ETH —> BTC。不建议用户直接使用,仅供开发者调用
  • 源码

    • BTC-Relay

      • 过程

        • 用户将 Bitcoin 从 user@BTC 转到 BTC-Relay@BTC。
        • Relayers 将 BTC 的 block headers 提交给 BTC-Relay 合约,并获得奖励。任何人都可以成为 Relayer。BTC-Relay 相当于维护了一个轻量级 BTC。
        • contract.verifyTx.call(rawTransaction, transactionIndex, merkleSibling, blockHash) 验证交易是否已经发生在 BTC-Relay 维护的轻量级 BTC 上。通过默克尔树快速验证。
        • contract.relayTx.sendTransaction(rawTransaction, transactionIndex, merkleSibling, blockHash, contractAddress) 将验证过的交易发送给 BTC-Relay 合约,触发合约执行 processTransaction(bytes rawTransaction, uint256 transactionHash) returns (int256)。
      • 风险

        • 可能有 Relayer 将错误的 header 提交给 BTC-Relay,导致 BTC-Relay 维护了一个错误的 BTC。
        • 解决:合约通过采取 BTC 一样的主链验证方法一样来验证 header 的合法性。当有新的区块头提交上来,会找到该区块头的父亲,进而能知道该区块头的累积工作量,如果该区块头的工作量大于当前链的工作量,则将新的区块头作为主链。如果该区块头的累积工作量小于当前主链的累积工作量,也不会丢弃该区块头,由于 BTC 存在分叉,该区块头所在的分支仍有可能成为主链的。
    • OneBTC

      • 使用了组件 BTC-Relay,用来存储 Bitcoin 区块头并验证交易。
    • MultiChain

      • 前端:当检测到用户是从 BTC 跨链时,仅仅是生成目的 BTC 地址,供用户转账,没有与后端的交互。
      • 后端:验证用户已转账后,在目标链上铸造对应数量的代币。
    • FastBTC