预言机(Oracle)
文章目录
- 一、概述
- 1.1、为什么需要
- 1.2、应用场景
- 1.3、现有的预言机产品
- 1.4、基本原理
- 二、蚂蚁区块链 BaaS 平台–外部数据源服务
- 三、主流预言机:Oraclize
- 3.1 使用举例
- 3.2 数据源
- 3.3 收费
- 3.4 真实性:
- 3.5 解析助手
- 3.6 加密查询
- 3.7 原理
- 四、参考
一、概述
受限于区块链的共识模型,智能合约只能调用内部合约,无法直接与外部系统进行交互。将智能合约与外部系统打通,有助于区块链技术更进一步扩展应用场景。
区块链预言机(Oracle)是区块链与外部世界交互的一种实现机制,它在区块链与外部世界间建立一种可信任的桥接机制,使得外部数据可以安全可靠地进入区块链。
1.1、为什么需要
区块链上的智能合约和去中心化应用(Dapp)对外界数据拥有交互需求
当智能合约的触发条件取决于区块链外信息时,这些信息需先写入区块链内记录。此时需要通过此机制来提供这些区块链外的信息
1.2、应用场景
适用于以下任意场景:
- 智能合约需要可信访问 Web 数据。
- 智能合约通过调用 Open API 使用互联网服务。
- 智能合约需要与外部系统交互。
- 智能合约依赖公共现实事件,如天气、赛事信息、航班信息等。
具体的:
金融衍生品交易平台
衍生品交易平台提供金融类的智能合约,允许用户做空或者做多背后的资产,例如Market Protocol, Decentralized Derivatives Association, DyDx Protocol 等都提供类似的服务。这类智能合约需要实时从链外获取资产价格,来确定参与各方的收益和损失,以及触发平仓交易等。
稳定货币
稳定货币是一种和法币有稳定兑换率的加密货币,稳定货币可以作为价值的储藏和交易的中间媒介,因此又被誉为数字货币世界里的圣杯。 这里的稳定货币并不是指tether或者digix那种由一个中心化机构发行的货币,而应该是一种去中心化的被算法自动控制的加密货币,包括bitUSD, Dai等以加密资产抵押物为基础的稳定货币,和Basecoin, kUSD等以算法银行为基础的稳定货币。所有的稳定货币都需要Oralce的帮助来获取外部世界稳定货币本身和锚定资产的兑换率等数据
借贷平台
SALT Lending, ETHlend等去中心化P2P借贷平台允许匿名的用户用区块链上的加密资产抵押,来借贷出法币或者加密资产。 这类应用需要使用Oracle在贷款生成时提供价格数据, 并且能监控加密抵押物的保证金比率,在保证金不足的时候发出警告并触发清算程序。 借贷平台也能用Oracle来导入借款人的社交和信用和身份信息来确定不同的贷款利率
保险应用
Etherisc正在建立一个高效透明低消耗的去中心化的保险应用平台, 包括航空延误险, 农作物保险等等。用户以ether支付保费,购买保险,并根据保险协议得到自动赔付。Oracle能为这类应用引入外部数据源和事件, 帮助去中心化的保险产品作出赔付的决定,并能安排未来的自动赔付
赌场应用
由于区块链技术保证的透明, 即时的安全转账,以及相对传统线上赌场高达15%的零庄家优势, 涌现了一大批如Edgeless, DAO.Casino, FunFair等去中心化赌场。任何在线赌场游戏的核心是产生不可预测的,可验证的随机数。 但是在链内纯确定性的环境下, 随机数的生成是很困难的。 Oracle可以从链外注入一个安全可靠的无偏的可验证随机熵源给赌场合约使用。
预测市场
去中心化的预测市场比如Augur, Gnosis等等,他们应用了群体的智慧来预测真实世界的结果, 比如总统选举和体育结果竞猜。在投票结果被用户质疑的时候,需要Oracle提供真实的最终结果。
无信任环境下如何验证身份
很多区块链应用需要通过Oracle从链外获取用户的身份数据,信用数据,或者社交媒体数据等。
快递追踪和IoT应用
真实世界中的快递寄送或到达信息可以通过Oracle被传递到链上,触发链上智能合约的自动付款。对于区块链上的IoT应用, 也需要Oracle把链外的传感信息传到链上,让智能合约验证并触发下一步的行为。
1.3、现有的预言机产品
1.4、基本原理
外部数据源服务在区块链上部署了区块链预言机合约,提供异步查询互联网数据接口供用户合约使用。正常情况下,用户合约调用预言机合约发起查询请求后,预言机合约在 1~3 个区块内就能得到外部数据源服务取回的数据,然后回调用户合约传入数据。
二、蚂蚁区块链 BaaS 平台–外部数据源服务
参见:https://tech.antfin.com/docs/2/108575
外部数据源服务会在智能合约平台部署一个外部数据源服务合约,用户合约通过调用该服务合约发送外部数据源请求,链下的 TEE 外部数据源服务对接该服务合约,监听用户的请求,然后去对应的外部数据源取数据,最后将结果返回给用户合约。
智能合约分为:用户合约和预言机合约
OracleInterface.sol 中定义了用户合约与预言机合约的通信接口,其中用户通过 curlRequest 接口调用预言机合约。用户合约需要实现 oracleCallbackCurlResponse 接口,用于接收预言机合约的请求结果回调。
interface OracleInterface {/*** function: 发送 CURL 请求* parameters:* _biz_id :用户自定义的业务请求 ID* _curl_cmd :CURL 命令,参考 CURL 命令使用文档进行构造* _if_callback :是否需要预言机将请求结果回调用户合约* _callback_identity :预言机请求结果回调的合约 ID,可以是发送请求的合约,也可以是其他合约* _delay_time :该特性未激活,填 0 即可* return value :预言机请求 ID,是预言机合约为本次请求生成的唯一请求 ID*/function curlRequestDefault(bytes32 _biz_id, string _curl_cmd, bool _if_callback, identity _callback_identity, uint256 _delay_time) external returns (bytes32);/*** function: oracleCallbackCurlResponse* parameters:* _request_id :预言机合约请求 ID(在发送请求时预言机合约会返回此 ID)* _biz_id : 用户合约的业务请求 ID* _error_code :请求结果码,如果值是 0,则表示预言机请求处理成功;如果是其他值,则为请求处理失败,详见合约错误码表* _resp_status :HTTP 响应的状态码,一般 200 表示 HTTP 请求处理成功,5xx 表示服务端处理错误,调用者可根据自己的使用场景做判断* _resp_header :HTTP 响应的 header,如果 CURL 中指定了要返回 HTTP 响应的 header,则回调时会返回对应的值* _resp_body :HTTP 响应的 body* _call_identity :发起该请求的合约 ID* return value : 无*/function oracleCallbackCurlResponse (bytes32 _request_id, bytes32 _biz_id, uint32 _error_code, uint32 _resp_status, bytes _resp_header, bytes _resp_body, identity _call_identity) external returns (bool);
}
三、主流预言机:Oraclize
3.1 使用举例
举例1:查询获得的Json数据(http://api.k780.com/?app=finance.globalindex&inxno=000001&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json),在oraclize query中用 “.result.yesy_price” 可以取到yesy_price数据:
{"success": "1","result": {"inxid": "1","typeid": "hs","inxno": "000001","inxnm": "上证指数","yesy_price": "3136.63","open_price": "3147.05","last_price": "3131.11","change_price": "-5.52","change_price_per": "-0.18%","high_price": "3163.34","low_price": "3128.87","amplitude_price_per": "1.10%","uptime": "2018-04-04 15:34:58"}
}
使用方式如下:
pragma solidity ^0.4.21;
import "github.com/oraclize/ethereum-api/oraclizeAPI.sol";contract oraclizeJson is usingOraclize{event logString(string);event logUint(uint);string public str = strConcat("http://119.28.70.201:8792/getprice/?index=","DJI","&date=",uint2str(17623));function strConcat(){// oraclize解析json数据bytes32 queryId = oraclize_query("URL", "json(http://api.k780.com/?app=finance.globalindex&inxno=000001&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json).result.yesy_price"); }function __callback(bytes32 myid, string result, bytes proof) public{emit logString(result);uint i = parseInt(result,3); //string to uint转换,emit logUint(i+1);}
}
举例2:查看Youtube某个视频的观看人数
/*Youtube video viewsThis contract keeps in storage a views counterfor a given Youtube video.
*/pragma solidity ^0.4.0;
import "github.com/oraclize/ethereum-api/oraclizeAPI.sol";contract YoutubeViews is usingOraclize {string public viewsCount;event newOraclizeQuery(string description);event newYoutubeViewsCount(string views);function YoutubeViews() {update();}function __callback(bytes32 myid, string result) {if (msg.sender != oraclize_cbAddress()) throw;viewsCount = result;newYoutubeViewsCount(viewsCount);// do something with viewsCount. like tipping the author if viewsCount > X?}function update() payable {newOraclizeQuery("Oraclize query was sent, standing by for the answer..");oraclize_query('URL', 'html(https://www.youtube.com/watch?v=9bZkp7q19f0).xpath(//*[contains(@class, "watch-view-count")]/text())');}}
3.2 数据源
Orcalize的数据源有:
- URL:互联网中的连接。
- computation:它允许抓取应用的链下执行结果。在退出前,该应用必须在最后一行打印查询结果(在标准输出栏)
- nested:nested数据源是一个元数据源,它不提供访问其他服务的权限。它用来提供简单相加逻辑,允许单个查询在任何可用数据源的基础上进行子查询,并产生一个单独字符串作为结果。
- IPFS:文件传输系统中的数据
- blockchain:blockchain数据源允许用户访问其他区块链的数据。可以提交给blockchain 数据源的查询包括bitcoin blockchain height、litecoinhashrate、bitcoin difficulty、1NPFRDJuEdyqEn2nmLNaWMfojNksFjbL4S balance等
- WolframAlpha:WolframAlpha是开发计算数学应用软件的沃尔夫勒姆研究公司开发出的新一代的搜索引擎,能根据问题直接给出答案的网站,于 2009年5月15日晚7点(美国中部当地时间,北京时间5月16日上午8点)提前上线,用户在搜索框键入需要查询的问题后,该搜索引擎将直接向用户返回答案,而不是返回一大堆链接。
3.3 收费
3.4 真实性:
Oraclize提供了的TLSNotary Proof来证明返回的结果是没有经过任何人修改的。TLS是一个网络传输协议,利用可信机构颁发的CA来保证传输正确。TLSNotary是TLS的改进,能够证明Oraclize提供给合约的数据就是某个特点时间点的正确数据。
参见:https://github.com/Oraclize/proof-verification-tool
3.5 解析助手
HTTP请求返回的结果可以是HTML、JSON、XML或二进制等格式。在Solidity中,解析结果是很困难的,且代价很高。Oraclize提供了解析助手,在服务端上处理解析,最终得到的结果就是用户需要的那部分。
3.6 加密查询
为了满足一些场景:比如用户不想暴露自己的查询地址,参数等信息。Oraclize提供了一个加密查询的方法。
参见:https://github.com/Oraclize/encrypted-queries
3.7 原理
Oraclize在以太坊上部署了一个名为usingOraclize的智能合约,如果需要其数据访问服务,只需要在自己的智能合约中引用该智能合约,然后根据API文档中描述的方法进行相关的调用即可。
四、参考
- Oraclize:https://provable.xyz/
- 去中心化的预言机:全面概览:https://medium.com/@liyunlong518/去中心化的预言机-全面概览-2487b5d97926
- 什么是区块链预言机(BlockChain Oracle):https://juejin.im/post/5c236f456fb9a049c965b9e4
- 区块链落地的必需工具——预言机(Oracle):https://blog.csdn.net/weixin_43761479/article/details/85067727
预言机(Oracle)相关推荐
- Injective Protocol官方文档翻译(十) -预言机(Oracle)
文章目录 一.预言机(Oracle) 1. 一般概念 2. 资金费 (Funding Fee) VWAP(Volume Weighted Average Price 成交量加权平均价格) Future ...
- 蚂蚁区块链第18课 区块链预言机(ORACLE)的定义及在蚂蚁BAAS中的使用
1,摘要 本文主要讲解外部预言机ORACLE定义和原理,并讲解蚂蚁BAAS系统如何通过ORACLE预言机方式使用外部数据源的方法. 2,外部预言机ORACLE定义和原理 2.1 预言机(Oracle) ...
- 什么是区块链预言机(BlockChain Oracle)
预言机 Oracle 是区块链中非常重要的一个功能,但我发现很少有人讨论,也可能很多人对此并不了解.而网上关于预言机的文章很少,很多也没有讲明白,甚至有些还是错误的.所以我整理了一篇详细的文章,分享给 ...
- 区块链Oracle预言机实现教程【含代码】
区块链本身是封闭的.区块链的确定性模型基于这样一个事实:在交易执行时区块链不能执行任何来自外部的逻辑,所有的外部数据只能通过交易进入到系统中.预言机/Oracle就是通过交易为智能合约提供可信数据的服 ...
- 以太坊智能合约预言机
2019独角兽企业重金招聘Python工程师标准>>> 什么是预言机(oracle)?和以太坊智能合约开发是什么关系?在区块链去中心化的条件下如何实现预言机?面对这些疑惑首先来了解下 ...
- BCH区块链上的预言机项目——Oracles
近日,加密开发人员cgcardona在r/btc论坛发布了一个由个人开发的BCH相关项目,项目命名为Oracles(预言),它可用于预测市场.无信任下注等,目的是为了提供一种快速引导Oracles数据 ...
- 预言机 - 区块链的触角
在保险.金融.随机预测.物联网等各个场景中,预言机在区块链中已经展现出其不可替代的价值:作为区块链延伸的触角,搭建了链内与链外之间的可信桥梁,构建相互融合的价值生态. 本文将从预言机的起源.定义.原理 ...
- 基于区块链的自动抽奖系统从0到1实现探析预言机与跨链技术的融合发展
可信接入外部服务之预言机Truora介绍 区块链预言机 (oracle mechanism)一般指帮助区块链系统访问链外信息的一种机制. 预言机和跨链有不少相似之处,都是为了打破区块链平台壁垒,以链接 ...
- 微众银行开源联盟链可信预言机Truora,搭建数据可信上链桥梁
在区块链应用中,大家往往希望业务逻辑可以尽可能在智能合约上自动执行,以降低信任成本,实现业务流程智能化和自动化.因此,智能合约需要将更多互联网世界的数据上链,以满足复杂多变的应用场景.由于区块链共识机 ...
- Oracle预言机项目发展概览
预言机项目发展概览 今年涌现了不少专注做Oracle预言机的项目,作为与现实世界与区块链数据交互的入口逐渐在区块链的架构体系中发挥更加重要的作用. 常见的应用诸如博彩.游艺,但是,预言机真正发挥价值的 ...
最新文章
- 【笔记篇】C#笔记1
- 数据结构——Java Stack 类
- c#如何使用反射去创建一个委托_【自学C#】|| 笔记 37 创建线程
- 数据结构排序2-希尔,快速,归并排序
- Machine Learning(CF-940F)
- js室内地图开发_如何组件化开发WebGIS系统
- JavaScript学习(三十)—事件对象
- php中时间戳和正常日期的相互转化
- 23. Yii 组件事件
- mysql5.1查询分析语句_MySQL 查询数据_mysql 查询语句_SELECT语句
- go test生成html测试报告
- 零基础搭建完全免费个人静态博客
- 少女长期与宠物睡觉 遭“宠物虫”噬骨导致瘫痪
- 漫步数学分析十九——介值定理
- 7-14 直捣黄龙 (30 分)
- 【云计算小知识】什么是云计算?云计算特点是什么?
- 孔明锁(2)——球形孔明锁、太极锁
- Jetpack系列:喜新厌旧的程序员~KTX篇
- 用jQuery制作视频弹幕
- 石英晶体参数详解及负载电容计算
热门文章
- html dom onblur,html的DOM中Event对象onblur事件用法实例
- python excel表格的导入和excel中插入折线图
- exe msdt 无法上网_msdt.exe文件下载
- 『.NET Core CLI工具文档』dotnet-publish
- Java网络爬虫(一)--使用HttpClient请求资源并抓取响应
- Unity 动态修改材质球
- 从PowerDesigner概念设计模型(CDM)中的3种实体关系说起
- oracle logged on,ORA-01012:not logged on的解决办法
- 关于 ORA-01012: not logged on
- eclipse下载及安装(清华镜像源)