支持多链多币的跨链桥

admin
admin 9月15日
  • 在其它设备中阅读本文章

需求分析

  1. 可以支持多条链,只要链支持 Solidity 智能合约即可
  2. 可以支持多个代币,需要符合 ERC20 标准的代币
  3. 由去中心化的中继节点采用投票方式来完成跨链请求的确认
  4. 每个中继节点需要质押保证金,每成功一笔跨链交易可获取奖励
  5. 引入惩罚机制,中继节点每次作恶都会被罚没,保证金低于一定值时被封禁,重新充入保证金可解封
  6. 引入黑名单管理机制,符合监管需求,禁止名单内账户使用跨链桥功能
  7. 引入中继节点准入机制,维持中继节点集群稳定,保障跨链桥的稳定工作

跨链交易规则

  1. 跨链有最低金额限制(比如 100USDT)
  2. 每笔收取总金额的一定比例作为手续费(比如万分之五)
  3. 一定比例的手续费平分给参与投票的中继节点(比如 70%)
  4. 剩下比例的手续费发给平台(比如 30%)
  5. 用户需手动去领取跨链资产,也可以在指定一个帮忙自动提取的中继节点(需额外付费)

中继节点规则

  1. 中继节点列表由平台进行管理维护,需保持稳定(避免在短时间内大量增加或减少)
  2. 保证金由中继节点自行维护,存入自由,取出需要限制(比如每隔 24 小时可取一次)
  3. 中继节点数量需保持一定合适的数量,至少也得 3 个,太多中继节点也不好(浪费机器资源,也拖慢投票速度)

投票罚没规则

  1. 中继节点需保证金大于指定门槛的才可以参与投票(比如 10 万),低于的处于封禁状态
  2. 中继节点的投票权重都一样,和保证金大小无关
  3. 每次跨链请求需要大于 2 / 3 的中继节点(所有的包括封禁的)投票才算通过
  4. 投票时需要附带中继节点的签名(合约可以验证签名来核查投票结果并允许用户提取对应资产)
  5. 每次作恶罚没一定比例的保证金(比如 5 万),罚没的保证金转给平台地址
  6. 如果某个节点持续作恶,会不断损失保证金,平台也可以将其从中继节点列表中移除

跨链通道

  1. 要进行跨链交易,需要在两条链之间创建一个通道
  2. 通道是有方向的,一般情况要添加双向的:A 链 ->B 链和 B 链 ->A 链
  3. 通道需指定两条链关联的代币地址
  4. 相同的两条链可添加多对代币地址

参与角色

  1. 普通用户 -web 前端:发起跨链请求、领取跨链资产、查看交易记录(历史的和进行中的)
  2. 中继节点 - 后台服务:跨链交易投票、帮用户自动领取跨链资产
  3. 中继节点 -web 前端:查看管理保证金、查看收益、查看投票记录
  4. 平台管理 -web 前端:查看管理中继节点、查看保证金、查看收益列表、查看修改黑名单、查看交易记录
  5. 数据分析与监控:交易汇总分析、中继节点收益分析、资金流动分析、跨链桥异常预警

合约设计

核心流程:用户在 A 链存入(冻结)资产、中继节点投票(签名)确认、使用超 2 / 3 的签名在 B 链取出(解冻)资产

引入一个廉价的链来存储投票过程,而不是中继节点自行共识,投票过程更安全,也可追溯,提高系统的可用性、安全性

用来投票的链这里称为桥链(bridge chain),它还可用来存储一些其它数据或运行一些服务

  1. 使用签名技术减少合约调用次数,简化设计与节省交易 gas 费
  2. 为了节省交易 gas 费,所有投票在桥链上完成,其它功能也尽量在桥链上实现
  3. 投票就是签名,用户投票则是将签名写入到桥链合约中
  4. 跨链通道定义:通道 id=keccak256(来源链 id, 来源链代币地址, 目标链 id, 目标链代币地址)
  5. 跨链交易定义:交易 id=keccak256(通道 id, 时间戳, 接收者, 金额, 手续费)
  6. 跨链交易记为 KR,投票就是对 KR 进行签名,记为:KS,有效投票需满足数据无篡改和签名可验证

架构

  1. 桥核心合约(资产):跨链资金出入口、中继成员列表、黑名单列表
  2. 桥治理合约(投票):签名存储与验证、保证金管理、惩罚机制、手续费分发
  3. 桥链部署:治理合约
  4. A 链部署:资产合约
  5. B 链部署:资产合约
  6. C 链部署:资产合约

桥核心合约

  1. 接口 - 添加中继节点
  2. 接口 - 移除中继节点
  3. 接口 - 将账户地址加入黑名单
  4. 接口 - 将账户地址从黑名单删除
  5. 接口 - 添加跨链通道
  6. 接口 - 移除跨链通道
  7. 接口 - 跨链转入资产(用户资产充足且未在黑名单内)
  8. 接口 - 跨链取出资产(需通过 2 / 3 的中继节点签名验证)
  9. 事件 - 中继节点变更、黑名单变更、资产转入、资产转出、资产解冻、交易取消
  10. 查询 - 中继节点、黑名单、跨链 USDT 额度(到不同链上的额度)
  11. 变量 - 跨链 USDT 额度列表、中继节点列表、黑名单列表

桥治理合约

  1. 接口 - 增加保证金
  2. 接口 - 减少保证金
  3. 接口 - 上传签名(验证签名,作恶罚没)
  4. 事件 - 保证金变更、签名提交、投票结果、罚没
  5. 查询 - 保证金、签名、罚没次数、罚没金额
  6. 变量 - 保证金余额列表、签名列表、跨链交易列表、惩罚记录表

合约执行

以以太坊和波场为例,以稳定币 USDT 为例

初始化

  1. 两条链的桥核心合约设置相同的 10 个中继节点地址和黑名单列表
  2. 在桥链的桥治理合约中为 10 个中继节点地址冲入 20 万保证金
  3. 平台往两条链的桥核心合约中存入 10 万 USDT 作为流动资金

Ethereum >>> Tron 跨链

用户调用 Ethereum 链资产合约的跨链转入接口

  1. 检查用户不在黑名单内,黑名单用户交易直接失败
  2. 将用户的 1 万个 USDT 转到资产合约地址名下
  3. 更新变量:到 Tron 链的跨链 USDT 额度减少 1 万
  4. 发出事件:跨链转入(起始链 ID + 目标链 ID + 金额 + 目标链代币合约地址)

中继节点调用桥链上的桥治理合约上传签名接口

  1. 接收用户的跨链请求事件,可以等待 N 个区块确认(避免区块分叉导致交易失效)
  2. 对此跨链事件进行签名并提交到投票合约中(如果不认可则可以忽略)
  3. 在签名满 7 个时检查投票结果,如果有超 2 / 3 的有效票则进行以下操作:

    1. 对此次跨链请求作恶的中继节点执行罚没
    2. 分发跨链交易手续费
    3. 发出事件:投票完成(跨链请求交易哈希 + 可提取代币地址 + 可提取金额 + 7 个签名)

中继节点调用 Tron 链桥核心合约的跨链转出接口

  1. 检查合约持有的 USDT 是否足够
  2. 检查 7 个签名是否有效,且签名地址在中继节点列表中
  3. 给用户指定的接收地址转 9995 个 USDT(从桥核心合约地址名下)
  4. 更新变量:Ethereum 链的跨链 USDT 额度增加 1 万
  5. 发出事件:跨链取出(跨链请求交易哈希 + 代币地址 + 金额)

状态变更总结

  1. Ethereum 链的资产合约:

    1. 持有的 USDT 数量:10 万 -> 11 万
  2. 桥链的投票合约:

    1. 签名列表:+ 跨链请求的 7 个有效签名
  3. Tron 链的资产合约:

    1. 持有的 USDT 数量:10 万 -> 9 万
  4. 用户在 Ethereum 上的 USDT 减少 1 万,在 Tron 链上获得 9995 个
  5. 7 个中继节点在桥链上获得 3.5/ 7 个 USDT
  6. 平台获得 1.5 个 USDT

Tron >>> Ethereum 跨链

  1. 此操作和Ethereum >>> Tron跨链操作流程一样
  2. 跨链手续费同样在桥治理合约中分发
  3. 一开始只有两条链上的 USDT 很少,后期会随着交易量增长
  4. 用户兑换时可检查目标链上是否有充足的币来决定是否发起交易
  5. 如果用户一时提取不到资产,待桥核心合约有足够的资金再重试

跨链桥特点

  1. 同一笔跨链交易需按顺序执行:A 链转入、投票、B 链转出
  2. 需要 2 / 3 的中继节点投票,确保每一笔交易都是有效的
  3. 不同跨链交易可异步执行,桥链的 TPS 高,速度快
  4. 使用相对廉价的链合约来处理投票过程,安全性高,透明度高
  5. 惩罚机制,提高相同的稳定性
  6. 多链多币支持,拓展性强
  7. 平台只是审查中继节点列表,跨链交易由中继节点共识投票确认,去中心化程度高