使用Sui天气预言机获取全球实时天气数据

news2024/11/17 21:29:03

新的Sui天气预言机为全球1000多个城市的建设者提供天气数据,并作为一个独特的随机数生成器,适用于需要可信赖的随机结果的游戏和投注应用。它由基于Sui的智能合约和一个从OpenWeather API获取天气数据的后端服务组成,任何人都可以将天气数据集成到他们的应用中。

Sui天气预言机为其支持的任何城市提供温度、湿度和风力等信息。这个预言机可以被其他需要可靠和去中心化的天气信息的智能合约或应用程序使用,比如旅行、保险、农业、竞猜或游戏等各种用途。

Sui天气预言机可以实现使用OpenWeather API追踪天气和其他应用数据

天气是自然界中最不可预测和复杂的现象之一,利用天气的随机性可以提供一个有趣的用例。天气预报员在很大程度上做了一项令人钦佩的工作,预测雨水或晴天,诸如特定温度或风速之类的细枝末节超出了目前科学的范畴。

作为科学、数学和工程许多领域的基本概念,随机性可以用于生成安全的加密密钥、测试假设或模拟复杂系统。然而,生成真正的随机性并不容易,因为大多数物理或计算过程在某种程度上是确定性或有偏差的。使用天气数据作为预言机输入提供了均匀分布且独立于任何先前输出的随机输出。

应用中的预言机数据

Sui和其他区块链上的预言机充当通道,连接到链外数据,包括体育比分、股票价格和天气。直接在应用中显示这些数据是最明显的用途,使得开发者可以创建股票投资组合管理工具、天气追踪器和实时足球排名。当然,以这种方式使用数据可能变得更加复杂,比如应用程序使用体育比分来为幻想联赛提供信息就是一个例子。

游戏可以直接基于预言机数据构建。例如,预言机可以提供各种竞猜比赛的赔率和结果,比如体育比赛、彩票抽奖。

当开发者使用提供不可预测数据的预言机来生成随机性时,事情变得更加有趣。例如,一个预言机可以使用真实世界的事件,比如天气数据、体育赛果或股票价格,为游戏创建随机结果。另外,预言机可以使用密码学方法,比如哈希函数或数字签名,生成安全且可证明的随机数。预言机数据来自于一个可验证的独立于应用的来源,这使得随机结果具有可信度。

天气数据可以作为随机性的种子,来决定游戏中角色行动的结果(图片来源:RPGMaker)

基于预言机不可预测数据的随机性可以被融入游戏机制。例如,在角色扮演游戏中,预言机可以决定角色行动的成功或失败,比如施放法术、黑客入侵电脑或说服NPC。预言机也可以影响游戏世界,比如改变天气、生成敌人或触发事件。游戏可以使用预言机的数据来创建一个公平且一致的随机性,而不受游戏开发者或玩家的影响。

Sui天气预言机

预言机将使Sui平台上的新一代应用成为可能,将现实世界的数据连接到其高性能平台上。鉴于OpenWeather API的易用性和其数据的实用性,天气预言机是Sui的一个很好的补充。

使用案例

Sui天气预言机对许多需要天气数据的应用非常有用,例如:

  • 随机性:天气数据可以用作各种目的的随机源,比如生成随机数、选择获胜者或创建独特的NFT。例如,一个随机数生成器可以使用特定位置在特定时间的温度、湿度或风速作为种子。
  • 竞猜和游戏:应用可以使用Sui天气预言机的数据来实现天气预测、以天气为主题的游戏或基于天气的奖励。例如,一个游戏可以让用户竞猜一个城市的天气,或者一个应用可以根据不同地点的天气为用户提供NFT。
  • 其他用例:保险、旅行、教育或研究的应用可以使用天气数据。例如,应用可以将天气数据纳入计算自然灾害风险、规划旅行行程、教授学生天气模式或协助设置科学实验等方面。

预言机结构

Sui天气预言机为全球1000多个城市提供最新的天气信息,包括三个组件:一个外部服务、一个内部服务和一个智能合约。外部服务是OpenWeather API,提供来自各种来源的当前天气数据。内部服务是天气预言机的后端,每10分钟从OpenWeather API获取天气数据,并更新每个城市的天气状况。智能合约是Sui天气预言机合约,将天气数据存储在Sui区块链上,并允许用户以安全透明的方式访问。用户还可以利用天气数据开发各种依赖于天气的去中心化应用,比如游戏。

赚取存储返利

Sui天气预言机通过存储返利机制来减轻将其实时数据存储在网络上的成本。Sui支持在其基础设施和token经济模型中进行链上存储,通过在其Gas费中增加存储费用来实现。从存储费用中产生的资金有助于补偿网络运营商维护硬件以存储数据和处理交易的成本。为了控制链上数据的数量,删除链上数据将产生存储基金返利。

Sui天气预言机将天气数据存储并更新到区块链上。管理员支付一次性费用以创建初始的CityWeatherOracle对象列表,并在更新每个城市的天气数据时获得返利。返利与更新的数据量和频率成比例。通过这种方式,管理员可以以较低的成本在区块链上存储和更新天气数据。

利用Sui对象显示

Sui天气预言机使用Sui对象显示标准来根据当前天气条件动态更新每个城市的图标,例如显示雨云或太阳。Sui对象显示标准是一个模板引擎,允许对任何类型的对象进行链上管理和链下显示。它使用一个模板字符串,可以用对象的数据进行替换,比如城市的天气ID。链下显示由后端服务处理,向Sui资源浏览器提供每个受支持城市的图标。图标来自一个预定义的图标集,代表不同的天气条件,比如晴天、多云、雨天和雪天。

Sui对象显示标准可用于显示代表不同天气条件的图标(图片由Freepik上的coolvector提供)

Sui Weather Oracle智能合约

Sui天气预言机智能合约为全球1000多个地点提供实时和历史天气数据,并支持基于城市天气数据铸造天气NFT。该智能合约还使用了Sui对象显示标准,使得在区块链上动态且可定制地显示天气数据和天气NFT成为可能。该智能合约有四个主要功能:add_cityremove_cityupdatemint

oracle::weather模块定义了以下内容:

AdminCap结构体代表预言机所有者的管理员权限。

struct AdminCap has key, store { id: UID }

WEATHER结构体代表设置一个发布者。

struct WEATHER has drop {}

WeatherOracle结构体代表预言机本身,它有idaddressnamedescription字段,分别代表存储预言机的标识符、所有者地址、名称和描述。

struct WeatherOracle has key {
    id: UID,
    address: address,
    name: String,
    description: String,
}

CityWeatherOracle结构体代表特定城市的天气数据。它有id(城市的唯一ID)、geoname_id(地理位置名称ID)、name(名称)、 country(国家)、latitude(纬度)、positive_latitude(正纬度)、longitude(经度)、positive_longitude(正经度)、weather_id(天气ID)、temp(温度)、pressure(压力)、humidity(湿度)、visibility(能见度)、wind_speed(风速)、wind_deg(风向)、wind_gust(阵风)、clouds(云量)和dt(时间戳)等字段。

struct CityWeatherOracle has key, store {
    id: UID,
    geoname_id: u32,
    name: String,
    country: String,
    latitude: u32,
    positive_latitude: bool,
    longitude: u32,
    positive_longitude: bool,
    weather_id: u16,
    temp: u32,
    pressure: u32,
    humidity: u8,
    visibility: u16,
    wind_speed: u16,
    wind_deg: u16,
    wind_gust: Option<u16>,
    clouds: u8,
    dt: u32
}

一个init函数,在部署期间初始化合约,创建WeatherOracle的新实例并公开共享它,同时创建AdminCap的新实例并将其转移到发送者。

fun init(otw: WEATHER, ctx: &mut TxContext) {
    package::claim_and_keep(otw, ctx);

    let cap = AdminCap { id: object::new(ctx) };
    transfer::share_object(WeatherOracle {
        id: object::new(ctx),
        address: tx_context::sender(ctx),
        name: string::utf8(b"SuiMeteo"),
        description: string::utf8(b"A weather oracle for posting weather updates (temperature, pressure, humidity, visibility, wind metrics and cloud state) for major cities around the world. Currently the data is fetched from https://openweathermap.org. SuiMeteo provides the best available information, but it does not guarantee its accuracy, completeness, reliability, suitability, or availability. Use it at your own risk and discretion."),
    });
    transfer::public_transfer(cap, tx_context::sender(ctx));
}

add_city公共函数,允许AdminCap的所有者通过提供geoname_id(地理位置名称ID)、name(名称)、country(国家)、latitude(纬度)和longitude(经度)向预言机服务添加新的城市。该函数创建一个带有默认天气数据的CityWeatherOracle新实例,并将其作为动态字段添加到预言机中,使用geoname_id作为key。

public fun add_city(
    _: &AdminCap, 
    oracle: &mut WeatherOracle, 
    geoname_id: u32,
    name: String,
    country: String,
    latitude: u32,
    positive_latitude: bool,
    longitude: u32,
    positive_longitude: bool,
    ctx: &mut TxContext
) {
    dof::add(&mut oracle.id, geoname_id, 
        CityWeatherOracle {
            id: object::new(ctx),
            geoname_id,
            name, 
            country, 
            latitude, 
            positive_latitude, 
            longitude, 
            positive_longitude,
            weather_id: 0,
            temp: 0,
            pressure: 0,
            humidity: 0,
            visibility: 0,
            wind_speed: 0,
            wind_deg: 0,
            wind_gust: option::none(),
            clouds: 0,
            dt: 0
        }
    );
}

remove_city公共函数,允许AdminCap的所有者通过提供geoname_ID从预言机服务中删除现有城市。该函数从预言机的动态字段中移除相应的CityWeatherOracle实例并删除对象。

public fun remove_city(_: &AdminCap, oracle: &mut WeatherOracle, geoname_id: u32) {
    let CityWeatherOracle { id, geoname_id: _, name: _, country: _, latitude: _, positive_latitude: _, longitude: _, positive_longitude: _, weather_id: _, temp: _, pressure: _, humidity: _, visibility: _, wind_speed: _, wind_deg: _, wind_gust: _, clouds: _, dt: _ } = dof::remove(&mut oracle.id, geoname_id);
    object::delete(id);
}

update公共函数,允许预言机所有者通过提供geoname_ID和新的天气数据来更新现有城市的天气数据。该函数使用新的天气数据改变相应的CityWeatherOracle实例。

public fun update(
    _: &AdminCap,
    oracle: &mut WeatherOracle,
    geoname_id: u32,
    weather_id: u16,
    temp: u32,
    pressure: u32,
    humidity: u8,
    visibility: u16,
    wind_speed: u16,
    wind_deg: u16,
    wind_gust: Option<u16>,
    clouds: u8,
    dt: u32
) {
    let city_weather_oracle_mut = dof::borrow_mut<u32, CityWeatherOracle>(&mut oracle.id, geoname_id);
    city_weather_oracle_mut.weather_id = weather_id;
    city_weather_oracle_mut.temp = temp;
    city_weather_oracle_mut.pressure = pressure;
    city_weather_oracle_mut.humidity = humidity;
    city_weather_oracle_mut.visibility = visibility;
    city_weather_oracle_mut.wind_speed = wind_speed;
    city_weather_oracle_mut.wind_deg = wind_deg;
    city_weather_oracle_mut.wind_gust = wind_gust;
    city_weather_oracle_mut.clouds = clouds;
    city_weather_oracle_mut.dt = dt;
}

集成Sui天气预言机

在Move项目中使用Sui天气预言机需要将其作为依赖项添加到项目的Move.toml文件中:

[package]
name = "..."version = "..."

[dependencies]
Sui = { git = "<https://github.com/MystenLabs/sui.git>", subdir = "crates/sui-framework/packages/sui-framework", rev = "..." }
oracle = { git = "<https://github.com/MystenLabs/apps>", subdir = "weather-oracle", rev = "db04fbd17d6ba91ade45c32f609b949fb47d209b" }

[addresses]
...
oracle = "0x8378b3bd39931aa74a6aa3a820304c1109d327426e4275183ed0b797eb6660a8"

创建这个依赖项使得开发者可以在Move代码中导入oracle::weather模块,并利用天气预言机及其函数。Sui天气预言机为全球不同城市提供实时天气数据,如温度、湿度和风速。city_weather_oracle_temp函数通过给定geoname_ID,检索该城市以开尔文为单位乘以1,000的温度。

例如,以下代码获取法国巴黎(2988507)当前的温度:

use oracle::weather::{WeatherOracle};

fun get_temp(weather_oracle: &WeatherOracle): u32 {
    let geoname_id = 2988507; // Paris, France
    oracle::weather::city_weather_oracle_temp(weather_oracle, geoname_id)
}

将数据桥接到Sui

过去几十年中大数据的崛起创造了庞大的数据库,代表了各种真实世界的现象和活动,从海洋洋流到曼哈顿的交通流。对这些数据的负责使用会产生对人们生活有积极影响的应用程序,无论是帮助预测森林火灾危险还是以公平方式提供热门音乐会门票。

在Sui上预言机的传播将增加应用程序与人们日常生活的相关性,使得该网络成为现代数字基础设施中不可或缺的一部分。


关于 Sui Network

Sui是基于第一原理重新设计和构建而成的L1公有链,旨在为创作者和开发者提供能够承载Web3中下一个十亿用户的开发平台。Sui上的应用基于Move智能合约语言,并具有水平可扩展性,让开发者能够快速且低成本支持广泛的应用开发。获取更多信息:https://linktr.ee/sui_apac

官网|Twitter|Discord|英文电报群|中文电报群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1264585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OPENWRT解决配置pppoe后无法光猫路由管理界面

一、新建一个wan口 二、设置流量转发 设置完成后保存应用即可

【论文阅读笔记】Prompt-to-Prompt Image Editing with Cross-Attention Control

【论文阅读笔记】Prompt-to-Prompt Image Editing with Cross-Attention Control 个人理解思考基本信息摘要背景挑战方法结果 引言方法论结果讨论引用 个人理解 通过将caption的注意力图注入到目标caption注意力中影响去噪过程以一种直观和便于理解的形式通过修改交叉注意力的…

深入了解MD5加密技术及其应用与局限

一、MD5简介 MD5&#xff08;Message Digest Algorithm 5&#xff09;是一种单向散列函数&#xff0c;由美国密码学家罗纳德李维斯特&#xff08;Ronald Linn Rivest&#xff09;于1991年发明。它主要用于将任意长度的消息映射成固定长度的摘要&#xff0c;从而实现消息的完整…

优雅编写测试代码:在pytest中利用Fixture实现自动化测试!

什么是固件 Fixture 翻译成中文即是固件的意思。它其实就是一些函数&#xff0c;会在执行测试方法/测试函数之前&#xff08;或之后&#xff09;加载运行它们&#xff0c;常见的如接口用例在请求接口前数据库的初始连接&#xff0c;和请求之后关闭数据库的操作。 我们之前已经…

Cookie要怎么测试?

Cookie是一种用于在Web应用程序中存储用户特定信息的方法&#xff0c;可以让网站服务器把少量数据存储到客户端的硬盘或内存&#xff0c;或是从客户端的硬盘读取数据。Cookie的测试是指对Cookie的功能、性能、安全性、兼容性等方面进行验证的过程。 Cookie的测试包括以下几个方…

存在即合理,低代码的探索之路

目录 一、前言 二、低代码迅速流行的原因 三、稳定性和生产率的最佳实践 四、程序员用低代码开发应用有哪些益处&#xff1f; 1、提升开发价值 2、利于团队升级 一、前言 低代码的热潮至今未消停&#xff0c;从阿里钉钉跨平台协作方式&#xff0c;再到飞书上的审批流程&#xf…

Java —— 泛型

目录 1. 什么是泛型 2. 泛型背景及其语法规则 3. 泛型类的使用 3.1 语法 3.2 示例 3.3 类型推导(Type Inference) 4. 裸类型(Raw Type) 4.1 说明 5. 泛型如何编译的 5.1 擦除机制 5.2 为什么不能实例化泛型类型数组 6. 泛型的上界 6.1 上界语法产生的背景 6.2 语法 6.3 示例 6.…

高级JVM

一、Java内存模型 1. 我们开发人员编写的Java代码是怎么让电脑认识的 首先先了解电脑是二进制的系统&#xff0c;他只认识 01010101比如我们经常要编写 HelloWord.java 电脑是怎么认识运行的HelloWord.java是我们程序员编写的&#xff0c;我们人可以认识&#xff0c;但是电脑不…

【数值计算方法(黄明游)】常微分方程初值问题的数值积分法:欧拉方法(向前Euler)【理论到程序】

文章目录 一、数值积分法1. 一般步骤2. 数值方法 二、欧拉方法&#xff08;Euler Method&#xff09;1. 向前欧拉法&#xff08;前向欧拉法&#xff09;a. 基本理论b. 典例解析c. 算法实现 常微分方程初值问题的数值积分法是一种通过数值方法求解给定初始条件下的常微分方程&am…

Cenos7系统通过链接一键安装LAMP项目环境(linux,apache,mysql,php)

前言&#xff1a;嫌装环境麻烦&#xff0c;以下介绍自动安装环境的方法 一.环境配置 根据自己需要选择 操作系统&#xff1a;CenOS 7.x以上Web服务器&#xff1a;Apache 2.4数据库&#xff1a;MySQL 5.7开发框架&#xff1a;ThinkPHP 5.0&#xff08;PHP5.0以上&#xff09;…

模拟退火算法应用——求解TSP问题

仅作自己学习使用 一、问题 旅行商问题(TSP) 是要求从一个城市出发&#xff0c;依次访问研究区所有的城市&#xff0c;并且只访问一次不能走回头路&#xff0c;最后回到起点&#xff0c;求一个使得总的周游路径最短的城市访问顺序。 采用模拟退火算法求解TSP问题&#x…

fiddler测试弱网别再去深山老林测了,这样做就能达到弱网效果了!

弱网测试 概念&#xff1a;弱网看字面意思就是网络比较弱&#xff0c;我们通称为信号差&#xff0c;网速慢。 意义&#xff1a;模拟在地铁、隧道、电梯和车库等场景下使用APP &#xff0c;网络会出现延时、中断和超时等情况。 添加图片注释&#xff0c;不超过 140 字&#xf…

WPF中DataGrid解析

效果如图&#xff1a; 代码如下&#xff1a; <DataGrid Grid.Row"1" x:Name"dataGrid" ItemsSource"{Binding DataList}" AutoGenerateColumns"False"SelectedItem"{Binding SelectedItem,UpdateSourceTriggerPropertyChange…

【软件测试】性能测试相关指标

性能测试 了解性能测试相关指标 1.什么是做性能测试 1.1 生活中遇到的软件性能问题 软件用着用着就不能用了&#xff0c;一看热搜&#xff0c;发现该软件的服务器崩崩溃了。 1.2 性能测试定义 测试人员借助性能测试工具&#xff0c;模拟系统在不同场景下&#xff0c;对应…

QT6 Creator编译KDDockWidgets并部署到QT

为什么使用KDDockWidgets 为什么使用KDDockWidgets呢&#xff1f; 首先它是一个优秀的开源dock库&#xff0c;弥补QDockWidget的不足&#xff0c;详情见官网。 其次它支持QML&#xff0c;这是我最终选择这个dock库的主要原因&#xff0c;因为最近在考虑将前端界面用QML做&…

[Linux ] sed文本处理和免交互

一、sed 1.1 sed是什么 sed 是一种流编辑器&#xff08;stream editor&#xff09;&#xff0c;用于对文本数据进行文本转换和处理。它通常被用于在命令行中执行文本编辑任务&#xff0c;可以对输入的文本进行搜索、替换、删除等操作&#xff0c;并将结果输出。sed 是一个非交…

项目中的svg图标的封装与使用

1.安装 npm install vite-plugin-svg-icons -D2.在vite.config.ts中配置 **所有的svg图标都必须放在assets/icons // 引入svg import { createSvgIconsPlugin } from vite-plugin-svg-iconsexport default defineConfig({plugins: [vue(),createSvgIconsPlugin({iconDirs: [p…

Java第十二篇:连接安全版kafka(Kerberos认证)出现的问题解答

Could not find a ‘KafkaClient’ entry in the JAAS configuration 问题现象 问题原因 原因没有找到&#xff0c;怎么引起的倒是很清楚。原因就是找到不到指定路径下的kafka_client_jaas.conf文件&#xff0c;别看我的路径带了两个//&#xff0c;但没问题的&#xff0c;等同…

实战中使用的策略模式,使用@ConditionalOnProperty实现根据环境注册不同的bean

场景复现 举个例子&#xff0c;针对不同的设备的内存的不同加载一些资源的时候需要采取不同的策略&#xff0c;比如&#xff0c;在内存比较大的设备&#xff0c;可以一次性加载&#xff0c;繁殖需要使用懒加载&#xff0c;这个时候我们就可以采用配置文件配置中心去控制了 Cond…