web3跨链预言机协议-BandProtocol
项目简介
Band Protocol 项目最初于 2017年成立并建立在 ETH 之上。后于2020年转移到了 Cosmos 网络上,基于 Cosmos SDK 搭建了一条 Band Chain 。这是一条 oracle-specific chain,主要功能是提供跨链预言机服务。Cosmos生态上第一个,也是目前最火的去中心化的跨链预言机。
架构总览
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 进行可信验证。
可定制的预言机服务
所有的去中心化预言机服务,都免不了两个行为
-
【多个节点】从【多个数据来源】获取数据
-
将来自【多个节点】的数据结果,聚合成一个最终答案
Band Protocol 使上面两个行为变得可以定制。
通过 Data Source script ,用户可以自由构建并发布【数据来源服务】到链上。
而通过 Oracle Script ,用户可以自由的选择多个链上存在的【数据来源服务】作为预言机服务的数据来源,并且定制最终结果的聚合方法。
Data Source Script
指定脚本规范和构建支持多语言的执行器。
用户需要编写一个【可执行文件】,用于抓取指定的链外数据,样例如下
Executable例子 展开源码
创建Data Source的过程,可以看做是发起交易将【可执行文件】上链的过程。任何用户都可以发送 MsgCreateDataSource 给 chain 去创建 data source 服务。其中包含的参数如下
参数 | 类型 | 描述 |
---|---|---|
Sender | sdk.AccAddress | 消息发送者的地址 |
Owner | sdk.AccAddress | (可选)这个data source服务的拥有者地址 |
Name | string | 这个data source服务的名字 |
Description | string | 这个data source服务的描述 |
Executable | []byte | 可执行文件,这个data source服务的请求者会执行这个文件去获取数据。(支持多种语言) |
Treasury | sdk.AccAddress | 服务费的收款地址 |
Fee | sdk.Coins | 这个data source服务的服务费 |
Data Source的【可执行文件】的执行是发生在链外,所以不会产生gas费用。
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 阶段在链上执行:
- 节点收到 Oracle Request ,进入Preparation阶段。节点需要执行Preparation方法,去构建出多个Data Source Queries (其中指定Data Source脚本和入参)。
- 节点根据 Data Queries 执行 Data Sources 脚本,获取到数据结果并提交报告
- 当报告的数量满足一定需求时,进入Execution 阶段。节点会执行Execution方法,从所有报告中聚合出一个最终结果并保存
去中心化的预言机服务
预言机服务流程
技术点:将预言机服务本地化,植入到了链本身层面。
(MsgRequestData 和 MsgReportData 本质上都是发起一笔交易)
-
用户发出 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
- 通知节点网络执行数据请求
- Validator根据请求中的 Calldata 在 wasm 环境下执行 Oracle Script 的 【Preparation方法】,构建出一系列的data source queries
- 根据请求中指定的 AskCount 随机选出一组 Validator 子集 (随机规则 Validator Sampling)
- 被选中的 Validator 在链下执行 data source queries ,获取到数据结果 (这里属于链下执行,和链上无关)
-
子集中的 Validator 将数据结果封装成 MsgReportData 并提交到链上,其中包含以下信
Parameter
Type
Description
RequestID int64 请求的ID Validator sdk.ValAddress 验证者的真实地址 Reporter sdk.AccAddress 验证者用于签名的地址 Data []struct'{ externalDataId: int64, data: []byte }' 从data sources那里查询到的数据结果 - 在【区块执行的 execute tx 阶段】发现提交的报告数量大于等于 MinCount 则会在 【区块执行的 end block 阶段】对 reports 进行聚合
- 聚合是,Validator 会执行 Oracle Script 中的 【Execution方法】来聚合出最终结果并持久化到区块当中。
(同时也会产生一个包含本次【请求和结果信息】的Merkle Proof,用于跨链验证数据结果的有效性) - 如果超过设定时间,数量还是小于MinCount,则本次数据请求失败
随机采样 Validator Sampling
技术点
和大多数的链上随机数方案差不多,引入多个最近历史区块hash构建seed,防止随机数被控制
因为Band Chain中Validator数量很多,如果让所有节点去执行Oracle请求会导致性能瓶颈。所以Band Chain会通过Decentralized Validator Sampling(去中心化的验证者采样)去随机挑选出一个验证者子集去执行Oracle请求。
选举规则的设计如下
- 构建随机seed
- RollingSeed,是从前 n 个 blockhash 中各取出 32/n 个 bytes组合成的一串新的 bytes 。(目前 n = 32 ,也就是从前 32 个 blockhash 中各取一个 byte 来组成 rollingSeed)
防止Validator控制seed,因为其作为出块人一般只能控制其中的 n/32 个 bytes (或者说一个 blockhash) - Oracle请求的requestID
- BandChain的chainID
- RollingSeed,是从前 n 个 blockhash 中各取出 32/n 个 bytes组合成的一串新的 bytes 。(目前 n = 32 ,也就是从前 32 个 blockhash 中各取一个 byte 来组成 rollingSeed)
- 生成随机数rng
- 将Validator按照权重降序排序,并将其按照权重值展开,例子如下:
- 所有Validator的权重求和,得到sum
- 将 rng%sum ,取余后获得 luckyNumber
- 根据luckyNumber落于哪个{X,Y}区间,选择Validator。(例如,luckyNumber = 178,则选中Validator #2 ,因为其区间为{101,185})
选取多个 Validator 时,只需要将上一个选中的Validator从列表中移除,然后重复上面的步骤 3 - 6 即可。
跨链交互
Cosmos链 - IBC
技术点:得益于Cosmos的IBC
- 用户在 Counterparty chain 上创建请求并通过IBC中继到 Band chain 上
- 根据请求指定的Oracle Script,执行其Preparation阶段,分解出一系列需要执行的data sources queries
- 进行 gas 费用检查
- 发送一个包含【错误信息】或者【请求标识符】的ack给 Counterparty chain
- 如果检查通过,广播该request
- 被随机选中的Validator会执行data source queries去获取到数据结果,并构成报告提交到band chain
- 如果成功提交的report数量满足request中设定的minCount要求,则在Band chain上聚合并存储最终数据结果
- 最终结果会被打包成 OracleResponsePacketData 并通过IBC中继回 Counterparty chain
异构链 - Lite Client
技术点
基于Merkel Proof构建数据证明。其实和很多跨链项目的原理差不多
异构链可以通过 Lite Client (轻客户端) 来验证自己收到的 result 的合法性。
- user contract 发送 【需要验证的result】和【encode proof】给 bridge contract ,并由 bridge contract 抛出事件
- 轻客户端通过三个步骤来执行验证
- 重构区块头
- 恢复参与该区块构建的所有签名者的地址
- 检查所有签名者的总票权是否足够
- 返回验证结果给 bridge contract
- 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 阶进行聚合处理。
相关文章:

web3跨链预言机协议-BandProtocol
项目简介 Band Protocol 项目最初于 2017年成立并建立在 ETH 之上。后于2020年转移到了 Cosmos 网络上,基于 Cosmos SDK 搭建了一条 Band Chain 。这是一条 oracle-specific chain,主要功能是提供跨链预言机服务。Cosmos生态上第一个,也是目…...

JAVA将集合切分成指定份数(简易)
JAVA将集合切分成指定份数 主要方法 /** * 主要方法* param list 切分的集合* param count 切成的份数* return*/ public static List<List> splitList(List list,int count){if(count <0 ){return Lists.newArrayList();}List<List> result Lists.newArrayL…...

深度神经网络(DNN)在时序预测中的应用与缺陷
目录 编辑 一、DNN在时序预测中的应用 二、DNN的缺陷 三、技术挑战与未来趋势 四、结论 随着大数据时代的到来,深度学习技术在时序预测领域扮演着越来越重要的角色。深度神经网络(DNN)因其强大的非线性拟合能力和自动特征提取能力&…...

springboot445新冠物资管理(论文+源码)_kaic
摘 要 使用旧方法对新冠物资管理的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在新冠物资管理的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开发的新冠物资管…...

C++算法第十一天
本篇文章我们继续学习动态规划 目录 第一题 题目链接 题目解析 代码原理 代码编写 第二题 题目链接 题目解析 代码原理 代码编写 第三题 题目链接 题目解析 代码原理 代码编写 第四题 题目链接 题目解析 代码原理 代码编写 第五题 题目链接 题目解析 代…...
常 用 类
一、 Object 类 1. Object 类的介绍 (1) Object 类位于 java.lang 包中,是继承关系的根类、超类,是所有类的父类 ( 直接的父类或是间接父类 ) (2) Object 类型的引用可以用于存储任意类型的对象。 (3) Object 类中定义方法,所有类都可以…...

ACL(访问控制列表)
ACL技术概述 • 随着网络的飞速发展,网络安全和网络服务质量 QoS ( Quality of Service )问题日益突出。 ▫ 园区重要服务器资源被随意访问,园区机密信息容易泄露,造成安全隐患。 ▫ Internet 病毒肆意侵略园区内网&am…...
json字符串转json
问题 Json格式化后,存在各种\n ,\r,以及空格,怎么办? 直接replaceAlll(“\s”,“”) 吗? 解决办法: //使用hutool的jsonutil工具,直接将其转换为json,再转string, //这样就不需要使用 各种re…...

GPT-Omni 与 Mini-Omni2:创新与性能的结合
近年来,随着人工智能技术的飞速发展,各种模型和平台应运而生,以满足从个人用户到企业级应用的多样化需求。在这一领域,GPT-Omni 和 Mini-Omni2 是两款备受瞩目的技术产品,它们凭借独特的设计和强大的功能,在…...
探秘 JSON:数据交互的轻盈使者
文章目录 一、JSON是什么二、JSON的语法规则三、应用场景四、性能优化五、总结 一、JSON是什么 JSON(JavaScript Object Notation)即 JavaScript 对象表示法,是一种轻量级的数据交换格式。JSON 以键值对的形式组织数据,键是字符串…...
源码分析之Openlayers中的Attribution属性控件
概述 本文主要介绍 Openlayers 中Attribution属性控件的源码实现,该控件也是 Openlayers 中三个默认控件之一。默认情况下,控件会显示在地图的右下角,可以通过控件的类名设置CSS属性控制。实际应用中该控件主要显示与图层源source相关的所有…...
Shell自定义(二)
1.Shell自定义 1.初始化 定义全局变量environ,把g_env的内容用memset初始化为0,这里用malloc开辟的空间为对应环境变量的长度1,多1位置是最后结束符0,strcpy把此时的对应的环境变量拷贝到g_env里面,下面是新增一个环…...

自然语言处理:我的学习心得与笔记
Pytorch 1.Pytorch基本语法 1.1 认识Pytorch 1.2 Pytorch中的autograd 2.Pytorch初步应用 2.1 使用Pytorch构建一个神经网络 2.2 使用Pytorch构建一个分类器 小节总结 学习了什么是Pytorch. 。Pytorch是一个基于Numpy的科学计算包,作为Numpy的替代者,向用户提供使用GPU强大…...
Oracle 中什么情况下 可以使用 EXISTS 替代 IN 提高查询效率
为什么 EXISTS 更高效? EXISTS 提前终止: EXISTS 一旦在子查询中找到第一个匹配项,就会立即返回 TRUE,不再继续扫描子查询中的其他记录。IN 必须扫描整个子查询的结果集,将所有结果与主查询的每一行进行对比。大数据集…...
Spring基础分析08-集成JPA/Hibernate进行ORM操作
大家好,今天和大家一起分享一下Spring集成JPAHibernate进行ORM操作的流程~ JPA(Java Persistence API)作为Java EE标准的一部分,提供了统一的API来管理实体类和持久化上下文;Hibernate则是最流行的JPA实现之一&#x…...

MySQL知识汇总(一)
一些命令行操作注意加 分号 “ ; ” show databases 查看所有数据库 use 数据库名 切换数据库 show tables 查看数据库中所有表 describe 表名 显示表中所有信息 create database [if not exists] 新库名 创…...

PDFMathTranslate 一个基于AI优秀的PDF论文翻译工具
PDFMathTranslate 是一个设想中的工具,旨在翻译PDF文档中的数学内容。以下是这个工具的主要特点和使用方法: 链接:https://www.modelscope.cn/studios/AI-ModelScope/PDFMathTranslate 功能特点 数学公式识别:利用先进的OCR&…...

React+Vite从零搭建项目及配置详解
相信很多React初学者第一次搭建自己的项目,搭建时会无从下手,本篇适合快速实现功能,熟悉React项目搭建流程。 目录 一、创建项目react-item 二、调整项目目录结构 三、使用scss预处理器 四、组件库Ant Design 五、配置基础路由 六、配置…...
@pytest.fixture() 跟 @pytest.fixture有区别吗?
在iOS UI 自动化工程里面最早我用的是pytest.fixture(),因为在pycharm中联想出来的fixture是带()的,后来偶然一次我没有带()发现也没有问题,于是详细查了一下pytest.fixture() 和 pytest.fixtur…...

Google Cloud Architect 认证考试错题集5
Google Cloud Architect 认证考试错题集5 D. Store static content such as HTML and images in a Cloud Storage bucket. Use Cloud Functions to host the APIs and save the user data in Firestore. - Storing static content in a Cloud Storage bucket is a cost-effecti…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...