1 简介
oracle-relayer 用于监控 BSC 上发生的跨链事件,并将相应的跨链信息发传递到 BC。与 bsc-relyer 不同,bsc-relyer 可以单独部署服务,而 oracle-relayer 与 BC 绑定,每个 bc-validator 都应该维护自己的 oracle-relayer 服务。
2 oracle-relayer 与 BC、BSC 的连接通道
oracle-relayer 与 BC、BSC 均通过 RPC 进行通信,RPC 的信息记录在 config/config.json 文件下。
-
oracle-relayer <-----> BSC
oracle-relayer 直接使用了 Etheruem 提供的 RPC 模块,可直接调用发送数据或者请求,其中最常用的是eth_getLogs
进行交易获取某个块的log
信息。其中,log
信息记录了solidity 合约中发生的事件,相关内容可参考:理解以太坊事件与日志。 -
oracle-relayer <-----> BC
oracle-relayer 通过发送不同的请求信息获取 BC 上的数据,例如GetProphecy
等。
2 监控 BSC
- 获取 BSC 最新块的块头;
- 获取 BSC 最新块中,地址为
CrossChain.sol
系统合约、topics 为CrossChainPackageEventHash
的 log 信息,并将其转化成CrossChainPackageEvent
保存到本地 DB 中,CrossChainPackageEvent
中记录了 BSC 发送到 BC 的跨链交易详情,其结构如下:
type CrossChainPackageEvent struct {
ChainId uint16
OracleSequence uint64
PackageSequence uint64
ChannelId uint8
Payload []byte
}
- 根据 【BSC详解】3——bsc 中说明,BSC 共识为 PoSA,必须要等到一定的出快数量后,才能确保前面的块真正的被确认接收。在 oracle-relayer 中,本地会执行此逻辑的判断,只有当某一个高度的块的后面若干个高度的块的数据都获取到时,才将这个块高的数据置为 确认 状态。
3 中继
3.1 Oracle
在介绍中继的工作前,首先需要讲解 BC 的 Oracle 模块。
Oracle 模块 用于处理 预言(Prophecy) 和 声明(Claim),Prophecy 的意思是 validators 需要对某些事情上达成共识(例如跨链 tx),Claim 针对于某一个 Prophecy,由 validator 提出(例如某个 tx 明细),当大多数 validators (例如70%)对于同一个 Prophecy,Claim 同一个事情,该 Claim 将会被执行。Oracle 模块使用 sequence
记录 Prophecy 和 Claim,当一个 Prophecy 被成功执行后,Claim 的 sequence
会增加1。
具体的流程如下:
- Oracle 模块接收来自 validator 的 Claim,校验其合法性,如果 sequence 错误,将拒绝处理;
- 如果时第一个合法的 Claim,将会创建新的相关的 Prophecy,如果不是第一个,将会添加到现有的 Prophecy中;
- 如果 Claim 的数量达到一定的阈值,例如70%,Prophecy 将被标记为成功,相对应的 Claim 将通过对应和回调被执行,sequence 增加1;
- 如果 Claim 的数量未达到阈值,则 Prophecy 将被标记为失败并被删除,validators 将开始新的一轮 Claim;
3.2 中继工作
- 向 BC 查询 sequence;
- 在 DB 中查找 sequence 对应的
CrossChainPackageEvent
(通过OracleSequence
字段进行匹配); - 向 BC 查询 sequence 对应的 Prophecy;
- 将
CrossChainPackageEvent
进行打包,将数据填写进该 Prophecy 中;