web3跨链预言机协议-BandProtocol

devtools/2024/12/23 14:55:33/

项目简介

Band Protocol 项目最初于 2017年成立并建立在 ETH 之上。后于2020年转移到了 Cosmos 网络上,基于 Cosmos SDK 搭建了一条 Band Chain 。这是一条 oracle-specific chain,主要功能是提供跨链预言机服务。Cosmos生态上第一个,也是目前最火的去中心化的跨链预言机

web3BandProtocol原理调研报告2023/03wcr-架构总览">架构总览

Band Protocol 通过发布在链上的 Oracle Script 提供预言机服务。(任何用户都可以定制和发布自己的 Oracle Script)

本地用户,可以通过直接向 Band Chain 发送 MsgRequestData 的方式 (一种Tx) ,向指定的 Oracle Script 申请预言机服务。(Oracle Script中指定了 data sources 和聚合方法)

Cosmos生态的项目可以通过 IBC 发送 MsgRequestDataPacket 给 Band Chain 申请预言机服务。

每一次预言机请求产生的最终结果都会存储在链上并产生一个 Proof (基于 Merkel Proof) 。异构链在使用 Band Chain 上的预言机数据的时候,可以通过 Bridge Contract 将 (data, proof) 交给 Lite Client 去验证其是否合法。

基于 Band Protocol 的特点,主要分为以下三个板块进行分析

  • 可定制的预言机服务 基于 Oracle Script 和 Data Source Script,用户可以自由定制预言机服务
  • 去中心化的预言机服务 基于Cosmos SDK开发了一条 Oracle-Specific 的 Band Chain
  • 跨链交互 基于Cosmos,可以通过 IBC 与其他 Cosmos 链交互。使用 relayer + tx proof ,使其预言机数据在异构链跨链使用时,也可以通过 Lite Client 进行可信验证。

web3BandProtocol原理调研报告2023/03wcr-可定制的预言机服务">可定制的预言机服务

所有的去中心化预言机服务,都免不了两个行为

  • 【多个节点】从【多个数据来源】获取数据

  • 将来自【多个节点】的数据结果,聚合成一个最终答案

Band Protocol 使上面两个行为变得可以定制。

通过 Data Source script ,用户可以自由构建并发布【数据来源服务】到链上。

而通过 Oracle Script ,用户可以自由的选择多个链上存在的【数据来源服务】作为预言机服务的数据来源,并且定制最终结果的聚合方法。

web3BandProtocol原理调研报告2023/03wcr-DataSourceScript" style="background-color:transparent;">Data Source Script

指定脚本规范和构建支持多语言的执行器。

用户需要编写一个【可执行文件】,用于抓取指定的链外数据,样例如下

Executable例子 展开源码

创建Data Source的过程,可以看做是发起交易将【可执行文件】上链的过程。任何用户都可以发送 MsgCreateDataSource 给 chain 去创建 data source 服务。其中包含的参数如下

参数

类型

描述

Sendersdk.AccAddress消息发送者的地址
Ownersdk.AccAddress(可选)这个data source服务的拥有者地址
Namestring这个data source服务的名字
Descriptionstring这个data source服务的描述
Executable[]byte可执行文件,这个data source服务的请求者会执行这个文件去获取数据。(支持多种语言)
Treasurysdk.AccAddress服务费的收款地址
Feesdk.Coins这个data source服务的服务费

Data Source的【可执行文件】的执行是发生在链外,所以不会产生gas费用。

web3BandProtocol原理调研报告2023/03wcr-OracleScript" style="background-color:transparent;">Oracle Script

指定规范,并使用了 WebAssembly 来执行。

任何人都可以通过Oracle Script去创建自己的Oracle服务。

可以用WebAssembly支持的语言编写以下两个方法:

  • Preparation Method:这个方法会构建 data source queries ,其中包含data source script ID 和 input params 。 (data source query 会用于执行指定的 data source script ,来获取数据)
  • Execution Method:这个方法会将来自多个Validator的数据报告聚合成一个最终的数据结果

将脚本代码编译成二进制的wasm code后,就可以通过发送 MsgCreateOraceScript 将其上链。

这两个方法分别会在 Preparation 阶段和 Execution 阶段在链上执行:

  1. 节点收到 Oracle Request ,进入Preparation阶段。节点需要执行Preparation方法,去构建出多个Data Source Queries (其中指定Data Source脚本和入参)。
  2. 节点根据 Data Queries 执行 Data Sources 脚本,获取到数据结果并提交报告
  3. 当报告的数量满足一定需求时,进入Execution 阶段。节点会执行Execution方法,从所有报告中聚合出一个最终结果并保存

web3BandProtocol原理调研报告2023/03wcr-去中心化的预言机服务" style="background-color:transparent;">去中心化的预言机服务

web3BandProtocol原理调研报告2023/03wcr-预言机服务流程" style="background-color:transparent;">预言机服务流程

技术点:将预言机服务本地化,植入到了链本身层面。

(MsgRequestData 和 MsgReportData 本质上都是发起一笔交易)

  1. 用户发出 MsgRequestData 请求链外数据,其中包含信息:

    Parameter

    Type

    Description

    OracleScriptID

    int64

    Oracle Script的ID

    Sender

    sdk.AccAddress

    消息发送者的地址

    Calldata

    string

    传给Oracle Script的执行参数

    AskCount

    int64

    需要随机选择多少个Validator来执行此请求

    MinCount

    int64

    需要至少【MinCount】个Validator提交结果才算请求成功

    ClientID

    string

    Client ID,由用户自己设定,聚合结果回传的时候也会带上这个ID

  2. 通知节点网络执行数据请求
  3. Validator根据请求中的 Calldata 在 wasm 环境下执行 Oracle Script 的 【Preparation方法】,构建出一系列的data source queries
  4. 根据请求中指定的 AskCount 随机选出一组 Validator 子集 (随机规则 Validator Sampling)
  5. 被选中的 Validator 在链下执行 data source queries ,获取到数据结果 (这里属于链下执行,和链上无关)
  6. 子集中的 Validator 将数据结果封装成 MsgReportData 并提交到链上,其中包含以下信

    Parameter

    Type

    Description

    RequestIDint64请求的ID
    Validatorsdk.ValAddress验证者的真实地址
    Reportersdk.AccAddress验证者用于签名的地址
    Data[]struct'{ externalDataId: int64, data: []byte }'从data sources那里查询到的数据结果
  7. 在【区块执行的 execute tx 阶段】发现提交的报告数量大于等于 MinCount 则会在 【区块执行的 end block 阶段】对 reports 进行聚合
  8. 聚合是,Validator 会执行 Oracle Script 中的 【Execution方法】来聚合出最终结果并持久化到区块当中。
    (同时也会产生一个包含本次【请求和结果信息】的Merkle Proof,用于跨链验证数据结果的有效性)
  9. 如果超过设定时间,数量还是小于MinCount,则本次数据请求失败

web3BandProtocol原理调研报告2023/03wcr-随机采样ValidatorSamplingValidatorSampling" style="background-color:transparent;">随机采样 Validator Sampling

技术点

和大多数的链上随机数方案差不多,引入多个最近历史区块hash构建seed,防止随机数被控制

因为Band Chain中Validator数量很多,如果让所有节点去执行Oracle请求会导致性能瓶颈。所以Band Chain会通过Decentralized Validator Sampling(去中心化的验证者采样)去随机挑选出一个验证者子集去执行Oracle请求。

选举规则的设计如下

  1. 构建随机seed
    1. RollingSeed,是从前 n 个 blockhash 中各取出 32/n 个 bytes组合成的一串新的 bytes 。(目前 n = 32 ,也就是从前 32 个 blockhash 中各取一个 byte 来组成 rollingSeed) 
      防止Validator控制seed,因为其作为出块人一般只能控制其中的 n/32 个 bytes (或者说一个 blockhash) 
    2. Oracle请求的requestID
    3. BandChain的chainID
  2. 生成随机数rng
  3. 将Validator按照权重降序排序,并将其按照权重值展开,例子如下:
  4. 所有Validator的权重求和,得到sum
  5. 将 rng%sum ,取余后获得 luckyNumber
  6. 根据luckyNumber落于哪个{X,Y}区间,选择Validator。(例如,luckyNumber = 178,则选中Validator #2 ,因为其区间为{101,185})

选取多个 Validator 时,只需要将上一个选中的Validator从列表中移除,然后重复上面的步骤 3 - 6 即可。

web3BandProtocol原理调研报告2023/03wcr-跨链交互" style="background-color:transparent;">跨链交互

web3BandProtocol原理调研报告2023/03wcr-Cosmos链-IBC">Cosmos链 - IBC

技术点:得益于Cosmos的IBC

  1. 用户在 Counterparty chain 上创建请求并通过IBC中继到 Band chain 上
  2. 根据请求指定的Oracle Script,执行其Preparation阶段,分解出一系列需要执行的data sources queries
  3. 进行 gas 费用检查
  4. 发送一个包含【错误信息】或者【请求标识符】的ack给 Counterparty chain
  5. 如果检查通过,广播该request
  6. 被随机选中的Validator会执行data source queries去获取到数据结果,并构成报告提交到band chain
  7. 如果成功提交的report数量满足request中设定的minCount要求,则在Band chain上聚合并存储最终数据结果
  8. 最终结果会被打包成 OracleResponsePacketData 并通过IBC中继回 Counterparty chain

web3BandProtocol原理调研报告2023/03wcr-异构链-LiteClient">异构链 - Lite Client

技术点

基于Merkel Proof构建数据证明。其实和很多跨链项目的原理差不多

异构链可以通过 Lite Client (轻客户端) 来验证自己收到的 result 的合法性。

  1. user contract 发送 【需要验证的result】和【encode proof】给 bridge contract ,并由 bridge contract 抛出事件
  2. 轻客户端通过三个步骤来执行验证
    1. 重构区块头
    2. 恢复参与该区块构建的所有签名者的地址
    3. 检查所有签名者的总票权是否足够
  3. 返回验证结果给 bridge contract 
  4. bridge contract 将结果转发给 user contract

Cosmos中区块执行的阶段 

在 Cosmos 当中,区块执行有三个阶段,before block → execute tx → end block。使用 Cosmos SDK 允许自定义设计 before block 和 end block 的处理逻辑。

Band chain 当中,如果提交的 report 的数量满足了用户的 minCount 要求,就会在 execute tx 阶段识别并加入到 pending list,然后在 end block 阶进行聚合处理。


http://www.ppmy.cn/devtools/144716.html

相关文章

【已解决】黑马点评项目jmeter高并发测试中用户数据的生成

具体实现见此篇文章的第3章 运行 test 程序后,生成以下用户名 以下文件名改成自己的地址 成功

Numpy数组的三种主要索引方式讲解及源码示例

1、整数索引和切片 NumPy中可以通过整数索引和切片来访问和修改数组中的元素,数组的维度不同、整数索引和切片的用法也会有所不同。 对于一维数组来说,整数索引和切片的用法与Python列表中索引和切片的用法相同;对于二维数组来说&#xff0c…

解决git报错:fatal: unable to connect to cache daemon: Unknown error

问题 fatal: unable to connect to cache daemon: Unknown error 这个错误通常是因为 Git 的缓存进程(git-credential-cache--daemon)无法正常工作,或者连接该守护进程时出现了问题。 fatal: unable to connect to cache daemon: Unknown e…

分布式光伏电站气象站

分布式光伏电站气象站是一种集成了光伏发电与气象观测功能的高科技设备,其主要功能体现在以下几个方面: 一、实时监测与记录气象数据 分布式光伏电站气象站能够实时监测和记录光伏电站所在区域的关键气象数据,包括但不限于温度、湿度、风速…

VPN技术-GRE隧道的配置

GRE隧道的配置 1, 在AR1上配置DHCP接口地址池,AR3上配置DHCP全局地址池 2, PC1获取的IP地址为10.10.10.253,PC2获取的IP地址为10.10.30.253 3,通过ip route-static将目的地址为10.10.30.253的流量引入到Tunnel #配…

electron-vite【实战】登录/注册页

效果预览 项目搭建 https://blog.csdn.net/weixin_41192489/article/details/144611858 技术要点 路由默认跳转到登录页 src/renderer/src/router/index.ts routes: [// 默认跳转到登录页{path: /,redirect: /login},...routes]登录窗口的必要配置 src/main/index.ts 中 cons…

arcgisPro将面要素转成CAD多段线

1、说明:正常使用【导出为CAD】工具,则导出的是CAD三维多线段,无法进行编辑操作、读取面积等。这是因为要素面中包含Z值,导出则为三维多线段数据。需要利用【复制要素】工具禁用M值和Z值,再导出为CAD,则得到…

电脑除尘更换cpu和显卡硅脂过程及安装win11系统中遇到的问题

原由 电脑是2022款的显卡TRX3050ti 的Y7000p,在使用过程中发现电脑风扇声音很大,想来也是用很久没有清理过灰尘了,在拆卸视频中发现一个换硅脂的,刚好手头有,想来也没换过,所以就直接换了。但修完后直接打开却出现了无…