这篇文章上次修改于 883 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
跨链:将资产从一条链转到另一条链。比如 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、SimpleSwap、FastBTC、OneBTC:对于 BTC —> ETH
- 用户填写转账额度和自己的 ETH 地址。或者连接 MetaMask 后自动填充地址。
- 点击 Swap 按钮后,系统给用户提供一个多签 BTC 地址。
- 用户手动向该多签 BTC 地址转账 Bitcoin。
- 系统确认收到了用户的转账,自动向用户填写的 ETH 地址转账。
- BTC-Relay:一个位于以太坊上的合约,存储 Bitcoin 区块头并用其构建一个迷你版的 BTC,以验证交易是否合法。只支持 BTC —> ETH,不支持 ETH —> BTC。不建议用户直接使用,仅供开发者调用。
源码
过程
- 用户将 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 存在分叉,该区块头所在的分支仍有可能成为主链的。
- 使用了组件 BTC-Relay,用来存储 Bitcoin 区块头并验证交易。
- FastBTC
没有评论