美文网首页
【BSC详解】4——oracle relayer

【BSC详解】4——oracle relayer

作者: ixiaolong | 来源:发表于2022-03-05 23:22 被阅读0次
    oracle-relayer.png

    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 文件下。

    1. oracle-relayer <-----> BSC
      oracle-relayer 直接使用了 Etheruem 提供的 RPC 模块,可直接调用发送数据或者请求,其中最常用的是 eth_getLogs 进行交易获取某个块的 log 信息。其中,log 信息记录了solidity 合约中发生的事件,相关内容可参考:理解以太坊事件与日志
    2. oracle-relayer <-----> BC
      oracle-relayer 通过发送不同的请求信息获取 BC 上的数据,例如 GetProphecy 等。
    oracle-relayer-rpc.png

    2 监控 BSC

    1. 获取 BSC 最新块的块头;
    2. 获取 BSC 最新块中,地址为 CrossChain.sol 系统合约、topics 为 CrossChainPackageEventHash 的 log 信息,并将其转化成 CrossChainPackageEvent 保存到本地 DB 中,CrossChainPackageEvent 中记录了 BSC 发送到 BC 的跨链交易详情,其结构如下:
    type CrossChainPackageEvent struct {
        ChainId         uint16
        OracleSequence  uint64
        PackageSequence uint64
        ChannelId       uint8
        Payload         []byte
    }
    
    1. 根据 【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。

    具体的流程如下:

    1. Oracle 模块接收来自 validator 的 Claim,校验其合法性,如果 sequence 错误,将拒绝处理;
    2. 如果时第一个合法的 Claim,将会创建新的相关的 Prophecy,如果不是第一个,将会添加到现有的 Prophecy中;
    3. 如果 Claim 的数量达到一定的阈值,例如70%,Prophecy 将被标记为成功,相对应的 Claim 将通过对应和回调被执行,sequence 增加1;
    4. 如果 Claim 的数量未达到阈值,则 Prophecy 将被标记为失败并被删除,validators 将开始新的一轮 Claim;
    3.2 中继工作
    1. 向 BC 查询 sequence;
    2. 在 DB 中查找 sequence 对应的 CrossChainPackageEvent(通过 OracleSequence 字段进行匹配);
    3. 向 BC 查询 sequence 对应的 Prophecy;
    4. CrossChainPackageEvent 进行打包,将数据填写进该 Prophecy 中;

    参考

    https://github.com/bnb-chain/oracle-relayer.git

    相关文章

      网友评论

          本文标题:【BSC详解】4——oracle relayer

          本文链接:https://www.haomeiwen.com/subject/rslbrrtx.html