新的 Sui Weather Oracle 为建构者提供了全球 1,000 多个城市的天气数据,并作为独特的随机生成器,适用于需要可靠随机结果的游戏和博彩应用程式。由基于 Sui 的智慧合约和从 OpenWeather API 提取天气资料的后端服务组成,任何人都可以将天气资料整合到他们的应用程式中。

SUI Weather Oracle 提供其支援的任何城市的温度、湿度和风力等资讯。预言机可供其他智慧合约或应用程式使用,这些智慧合约或应用程式需要可靠且去中心化的天气资讯以用于各种目的,例如旅行、保险、农业、赌博或游戏。

Sui Weather Oracle 支援使用 OpenWeather API 资料进行天气追踪和其他应用程式。

然而,利用天气的随机性提供了一个有趣的用例。天气是自然界中最难预测、最复杂的现象之一。在大多数情况下,天气预报员在预测降雨或晴天方面做得非常出色,但诸如具体温度或风速之类的细节超出了当前科学的范围。 

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

应用程式中的 Oracle 数据

Sui 和其他区块链上的预言机充当链下数据的管道,包括体育比分、股票价格和天气。最明显的用途是直接在应用程式中显示这些数据,让开发人员可以创建股票投资组合管理工具、天气追踪器和即时足球排名。当然,以这种方式使用数据可能会变得更加复杂,例如应用程式使用体育比分来通知梦幻联赛。 

游戏可能直接基于预言机数据。例如,预言机可以提供体育比赛、政治选举或彩票抽奖等竞赛的各种投注的赔率和结果。然后,玩家可以根据预言机提供的赔率对结果进行投注。 

当建构者使用提供不可预测资料的预言机来产生随机性时,事情会变得更加有趣。例如,预言机可以使用现实世界的事件(例如天气数据、体育比赛结果或股票价格)来为游戏创建随机结果。或者,预言机可以使用加密方法(例如杂凑函数或数位签章)来产生安全且可证明的随机数。事实上,预言机数据来自独立于应用程式的可验证来源,这使得随机性结果值得信赖。

天气资料可以用作随机性的种子,以确定游戏中角色动作的结果。 (图片来源:RPGMaker)

基于来自预言机的不可预测数据的随机性可以纳入游戏机制中。例如,在角色扮演游戏中,神谕可以决定角色行动的成功或失败,例如施展咒语、入侵电脑或说服 NPC。神谕还可以影响游戏世界,例如改变天气、生成敌人或触发事件。游戏可以利用预言机的数据来创造公平一致的随机性,不受游戏开发者或玩家的影响。

隋气像神谕

预言机将在 Sui 上启用新一代应用程序,将现实世界的数据连接到其高效能平台。鉴于 OpenWeather API 的可访问性及其数据的实用性,天气预言机是 Sui 的一个很好的补充。 

用例

Sui Weather Oracle 对于许多需要天气资料的应用程式很有用,例如:

  • 随机性:天气资料可用作各种目的的随机性来源,例如产生随机数字、选择获胜者或创建独特的 NFT。例如,随机数产生器。可以使用特定时间、特定位置的温度、湿度或风速作为种子。

  • 投注与游戏:应用程式可以使用 Sui Weather Oracle 资料来实现天气预报投注、天气主题游戏或基于天气的奖励。例如,游戏可以让用户对某个城市的天气进行投注,或者应用程式可以根据不同地点的天气向用户提供 NFT。

  • 其他用例:保险、旅行、教育或研究应用程式可以使用天气资料。例如,应用程式可以考虑天气数据来计算自然灾害的风险、规划旅行行程、向学生传授天气模式或帮助设定科学实验。

结构

Sui Weather Oracle 为全球 1,000 个城市提供最新的天气讯息,由三个元件组成:外部服务、内部服务和智慧合约。外部服务 OpenWeather API 提供来自各种来源的当前天气资料。内部服务是天气预言机后端,它每 10 分钟从 OpenWeather API 获取天气资料并更新每个城市的天气状况。该智能合约是 Sui Weather Oracle 合约,它将天气数据储存在 Sui 区块链上,并让用户以安全、透明的方式存取它。用户还可以利用天气数据进行各种依赖天气的去中心化应用程序,例如游戏。

赚取存储回扣

Sui Weather Oracle 透过储存回扣机制降低了在网路上储存即时资料的成本。 Sui 透过在其 Gas 费用中添加储存费用来支援其基础设施和代币经济模型中的链上储存。储存费创建的资金有助于偿还网路营运商维护储存资​​料和处理交易的硬体的费用。作为控制链上资料数量的一种手段,删除链上资料可以获得储存资金回扣。 

Sui Weather Oracle 在区块链上储存和更新天气资料。管理员支付一次性费用来建立 CityWeatherOracle 物件的初始列表,并因更新每个城市的天气资料而获得回扣。返利与更新资料量和更新频率成正比。这样,管理员可以以较低的成本在区块链上储存和更新天气资料。

利用 Sui 物件显示

Sui Weather Oracle 使用 Sui 物件显示标准根据目前天气状况动态更新每个城市的图标,例如显示雨云或太阳。 Sui 物件显示标准是一个范本引擎,允许对任何类型物件的链下显示进行链上管理。它使用可以替换为物件资料的模板字串,例如城市的天气 ID。链下显示由后端服务处理,该服务为 Sui 浏览器提供每个受支援城市的图示。该图标是从一组预先定义的图标中选择的,这些图标代表不同的天气条件,例如晴天、阴天、雨天和下雪。

可以利用 Sui 物件显示标准来提供代表不同天气条件的图示。 (图片来源:coolvector on Freepik)Sui Weather Oracle 智能合约 

Sui Weather Oracle 智慧合约提供全球 1,000 个地点的即时和历史天气数据,并支援根据城市的天气数据铸造天气 NFT。该智能合约还使用了 Sui Object Display 标准,可以在区块链上动态且可自订地显示天气资料和天气 NFT。智能合约有四个主要功能:

添加城市

、remove_city、update 和 mint。 

甲骨文::天气

模组定义如下:

管理帽

,一个表示 oracle 所有者的管理员能力的结构。

struct AdminCap 有密钥,储存 { id: UID }

天气

,一个设定发布者的结构。

struct WEATHER 已删除 {}

天气甲骨文

是一个结构体,代表预言机本身。它有字段id、address、name和description,分别储存oracle的识别码、拥有者的位址、名称和描述。

struct WeatherOracle 有键 {     id: UID,     位址: 位址,     名称: String,     说明: String, }

城市天气甲骨文

,表示特定城市的天气资料的结构。它具有栏位 id、geoname_id、name、country、latitude、positive_latitude、longitude、positive_longitude、weather_id、temp、气压、湿度、能见度、wind_speed、wind_deg、wind_gust、clouds 和 dt,储存城市的唯一 ID、geoname ID国家、纬度、经度、天气ID、温度、压力、湿度、能见度、风速、风向、阵风、云量和时间戳。

struct CityWeatherOracle 有 key, store {     id: UID,     geoname_id: u32,     name: String,     度: u32,     positive_longitude: bool,     weather_id: u16,  温度:u32,    压力:u32 ,     湿度: u8,     能见度: u16,     风速: u16,     wind_deg: u @  

一个

在部署期间初始化合约的函数,建立 WeatherOracle 的新实例并公开共享,以及建立 AdminCap 的新实例并将其传输给发送者。

fun init(otw: WEATHER, ctx: &mut TxContext) {     package::claim_and_keep(otw, ctx);     让 cap = AdminCap { id: object::new(ctx) };     传送::share_object(WeatherOracle {         id: object::new(ctx),           id: object::new(ctx),         位址: tx_context::sender(ctx),      位址: tx_context::sender(ctx),      位址:     描述: string::utf8(b"A天气预言机用于发布世界各地主要城市的天气更新(温度、压力、湿度、能见度、风力指标和云状态),目前数据是从https://openweathermap.org 获取的,但提供了最佳的可用资讯。     传输::public_transfer(cap, tx_context::sender(ctx)); }

添加城市

公共函数,它允许 AdminCap 的所有者透过提供其 geoname_ID、名称、国家/地区、纬度和经度来将新城市添加到 oracle 服务。此函数使用预设天气资料建立 CityWeatherOracle 的新实例,并将其作为动态栏位新增至 oracle,使用 geoname_ID 作为键。

public fun add_city(     _: &AdminCap,      oracle: &mut WeatherOracle,      geoname_id: u32,     正纬度: bool,     经度: u32,     正经度: bool,     ctx: &mut TxContext ) {     自由度:: add(&mut oracle.id, geoname_id,          CityWeatherOracle {          _id,             名词,              ‧国家/地区,                   经度,              正_经度,       : 0,             气压: 0           以湿度:0 ,       speed: 0,             wind_deg: 0,            wind_gust: option::      dt: 0        }     ); }

删除城市

公共函数,它允许 AdminCap 的所有者透过提供其 geoname_ID 从 oracle 服务中删除现有城市。此函数从 oracle 的动态栏位中删除对应的 CityWeatherOracle 实例并删除该物件。

public fun remove_city(_: &AdminCap, oracle: &mut WeatherOracle, geoname_id: u32) {     let CityWeatherOracle { id, geoname_id: _, 名称: _, 国家: _, 纬度 : _, 正纬度经度 7_, 正纬度: _ ,weather_id:_,温度:_,压力:_,湿度:_,能见度:_,风速:_,wind_deg:_,wind_gust:_,云:_,dt:_ } = dof::remove(&mut oracle. id,geoname_id);     物件::删除(id); }

更新

公共函数,它允许预言机所有者透过提供其 geoname_ID 和新的天气资料来更新现有城市的天气资料。此函数使用新的天气资料改变 CityWeatherOracle 的对应实例。

公共乐趣更新(     _: &AdminCap,     oracle: &mut WeatherOracle,     geoname_id: u32,     weather_ ,     能见度: u16,     wind_speed: u16,     风_deg:u16,    wind_gust:选项<u16 >,     云: u8,     dt: u32 ) {     let city_weather_oracle_mut = dof::borrow_mut<u32, CityWeatherOracle>(&mut = dof::borrow_mut<u32, CityWeatherOracle>(&mut oranamecle.id, geoname_idut);     city_weather_oracle_mut.weather_id=weather_id;     city_weather_oracle_mut.temp = 暂时;     city_weather_oracle_mut.Pressure = 压力;     city_weather_oracle_mut.humidity = 湿度;     city_weather_oracle_mut.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 = 云;     city_weather_oracle_mut.dt = dt; }

集成 Sui 天气预言机

在 Move 专案中使用 Sui Weather Oracle 需要将其新增为专案的依赖项

Move.toml

文件:

[package] name = "..."version = "..." [依赖] Sui = { git = "<https://github.com/MystenLabs/sui.g​​it>", subdir = " crates/sui- Framework/packages/sui-framework", rev = "..." } oracle = { git = "<https://github.com/MystenLabs/apps>", subdir = "weather-oracle", rev = "db04fbd17d6ba91ade45c32f609b949fb47d209b " } [地址] ... oracle = "0x8378b3bd39931aa74a6aa3a820304c1109d32746eaa74a6aa3a820304c1109d327426eaa74a6aa3a820304c1109d327426eaa74a6aa3a820304c1109d32746eaa74a6

创建这种依赖关系可以让建构者导入

甲骨文::天气

将模组整合到 Move 程式码中并使用 Wea​​ther Oracle 及其功能。 Sui Weather Oracle提供全球不同城市的即时天气数据,例如温度、湿度、风速。 city_weather_oracle_temp 函数根据给定的 geoname_ID 检索城市的开尔文温度乘以 1,000。

例如,以下程式码检索法国巴黎 (2988507) 的当前温度:

使用 oracle::weather::{WeatherOracle};有趣的 get_temp(weather_oracle: &WeatherOracle): u32 {     让 geoname_id = 2988507; // 法国巴黎     oracle::weather::city_weather_oracle_temp(weather_oracle, geoname_id) }

将资料桥接至 Sui

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

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