区块链与预言机(Oracle)

在《经济学人》杂志中对区块链的定义:“区块链是信任的机器”。

区块链最大的核心创新在于去中心化的解决信任问题,不需要再去信任和依靠第三方机构的情况下进行价值转移。其中,智能合约起到了重要的作用。它是一套数字形式定义的合约,帮助合约参与方执行完成任务的协议,节省了时间和繁琐的步骤。

但是万万没有想到。。。。
高大上的区块链居然无法主动获取现实世界的数据!!!

1,区块链为什么需要预言机?

区块链上的智能合约和去中心化应用(Dapp)对外界数据拥有交互需求。

当智能合约的触发条件取决于区块链外信息时,这些信息需先写入区块链内记录。此时需要通过此机制来提供这些区块链外的信息。比如,一些像是股票或者币价的实时价格数据,天气预报,市场预测等其他数据。

那么,这里就引出了预言机(oracle) 这样一个概念。

2,什么是预言机?

预言机就是一种单向的数字代理,可以查找和验证真实世界的数据,并以加密的方式将信息提交给智能合约。预言机就好比区块链世界中的一个第三方数据代理商。

 

 

举例来说,假设现实世界中的“数据源”和区块链中的“数据接口”,是两个使用不同语言的国家,预言机就是中间的翻译官。通过预言机智能合约就可以和链外数据进行无障碍交流。

在实际使用智能合约中,需要预言机对数据进行验证。因为区块链也是基于共识的系统,所运行的智能合约也要求一定要是确定性的程序。预言机对数据验证这一步骤是为了契合共识机制,使最后反馈给智能合约的数据也是“确定性”的。

预言机的运行原理:当区块链上的某个智能合约有数据交互需求时,预言机在接收到需求后,帮助智能合约在链外收集外界数据,验证后再将获取的数据反馈回链上的智能合约。

3,预言机工作原理

 

这就是理想中预言机的工作流程,即用户的智能合约把请求给链上 Oracle 合约,通过链下的 API 接口获得外部数据,更确切的说是外部把数据给链上的 Oracle 合约,然后 Oracle 合约再把数据给用户的智能合约。

或许很难理解,因为在互联网中,调用数据是非常容易的,只需要在程序中写调用的代码就可以了。但是区块链与外部世界的数据交互,确实不能进行这样的操作。

4,预言机应用场景有哪些?

适用于以下任意场景:

智能合约需要可信访问 Web 数据。
智能合约通过调用 Open API 使用互联网服务。
智能合约需要与外部系统交互。
智能合约依赖公共现实事件,如天气、赛事信息、航班信息等。

具体的:

金融衍生品交易平台
衍生品交易平台提供金融类的智能合约,允许用户做空或者做多背后的资产,例如Market Protocol, Decentralized Derivatives Association, DyDx Protocol 等都提供类似的服务。这类智能合约需要实时从链外获取资产价格,来确定参与各方的收益和损失,以及触发平仓交易等。

稳定货币
稳定货币是一种和法币有稳定兑换率的加密货币,稳定货币可以作为价值的储藏和交易的中间媒介,因此又被誉为数字货币世界里的圣杯。 这里的稳定货币并不是指tether或者digix那种由一个中心化机构发行的货币,而应该是一种去中心化的被算法自动控制的加密货币,包括bitUSD, Dai等以加密资产抵押物为基础的稳定货币,和Basecoin, kUSD等以算法银行为基础的稳定货币。所有的稳定货币都需要Oralce的帮助来获取外部世界稳定货币本身和锚定资产的兑换率等数据

快递追踪和IoT应用
真实世界中的快递寄送或到达信息可以通过Oracle被传递到链上,触发链上智能合约的自动付款。对于区块链上的IoT应用, 也需要Oracle把链外的传感信息传到链上,让智能合约验证并触发下一步的行为。

借贷平台
SALT Lending, ETHlend等去中心化P2P借贷平台允许匿名的用户用区块链上的加密资产抵押,来借贷出法币或者加密资产。 这类应用需要使用Oracle在贷款生成时提供价格数据, 并且能监控加密抵押物的保证金比率,在保证金不足的时候发出警告并触发清算程序。 借贷平台也能用Oracle来导入借款人的社交和信用和身份信息来确定不同的贷款利率

保险应用
Etherisc正在建立一个高效透明低消耗的去中心化的保险应用平台, 包括航空延误险, 农作物保险等等。用户以ether支付保费,购买保险,并根据保险协议得到自动赔付。Oracle能为这类应用引入外部数据源和事件, 帮助去中心化的保险产品作出赔付的决定,并能安排未来的自动赔付

赌场应用
由于区块链技术保证的透明, 即时的安全转账,以及相对传统线上赌场高达15%的零庄家优势, 涌现了一大批如Edgeless, DAO.Casino, FunFair等去中心化赌场。任何在线赌场游戏的核心是产生不可预测的,可验证的随机数。 但是在链内纯确定性的环境下, 随机数的生成是很困难的。 Oracle可以从链外注入一个安全可靠的无偏的可验证随机熵源给赌场合约使用。

预测市场
去中心化的预测市场比如Augur, Gnosis等等,他们应用了群体的智慧来预测真实世界的结果, 比如总统选举和体育结果竞猜。在投票结果被用户质疑的时候,需要Oracle提供真实的最终结果。
无信任环境下如何验证身份
很多区块链应用需要通过Oracle从链外获取用户的身份数据,信用数据,或者社交媒体数据等。

5,现有的预言机产品

1) Oraclize

Oraclize是一个为以太坊提供中心化数据传输预言机服务的项目,其依托亚马逊AWS服务和TLSNotary证明技术,提供预言机的服务。

在区块链环境下,Oraclize把获取的信息返回链上且保证保证数据与数据源相同,用户可以自行抓取数据。Oraclize不干涉信息源的选取和信息源本身的准确度

2)Augur

不同于Oracle的中心化,Augur是一个去中心化的预测市场平台。Augu的核心是预测市场,主要是通过利益驱动的投票机制来确定结果

用户可以用数字货币进行预测和下注,依靠群体智慧来预判事件的发展结果。用户可以选择围绕任何未来事件创建预测市场,参与者可以押注该事件的结果。参与者根据创建的未来事件的实际结果赢钱或者输钱。平台本身无法验证事件的真实结果是什么,因此Augur依靠用户和复杂的结果报告系统来鼓励诚实的结果报告行为。本身也可以作为其他应用的输入源,但是它们的输出结果需要很长时间的延迟和大量用户的参与。

3)Chainlink

Chainlink是第一个去中心化的预言机。比起Oraclize的中心化,Chainlink更符合区块链去中心化的准则。Chainlink主要提供用于帮助智能合约访问关键链外资源、网站API和传统银行账户支付的预言机服务。

链下节点来提供数据,chainlink的链上部分会收集数据请求的需求,然后收集合适的节点的回答,在加权得到结论后反馈给信息请求方。chainlink也拥有一个对节点的信誉评价体系,信息需求方可以选择特定信誉级别的节点,每次信息反馈之后也会更新每个节点的信誉评分。

4)DOS Network

 

DOS Network是一个提供去中心化的预言机服务的网络。它可以连接智能合约和链外互联网世界,同时也为区块链提供无限的且可验证的计算力。Dos Network在链上监测用户数据请求,链下监控和接收数据请求,再通过链下随机选一组节点来提供数据,一旦收集来的数据通过组内51%节点共识被视为“正确答案”,最后链下再将获取的答案反馈给链上信息请求方。DOS 设立一个对于诚实节点的奖励机制:除了给节点的数据处理费,30%总供应量的虚拟采矿奖励,持续十年。

DOS Network在性能上可支持多条链,且数据结果接近实时,同时DOS Network分片的网络结构设计,可以并行处理请求,达到高性能和可扩展性。帮助扩展智能合约的处理能力和应用场景的二层(layer 2)网络解决方案。

DOS与Chainlink类似,也有许多不同和优化。Chainlink对每个节点返回的结果在区块链上进行聚合和共识,而DOS在链下对结果进行共识,性能和可扩展性更好。Chainlink在 选取工作节点时基于信誉系统,而DOS则是完全随机的在去中心化网络中选取工作节点,有更好的抵御攻击的能力,安全性更好,也更公平。

6,关于预言机的几个判断和思考

1、无论如何,预言机市场无法摆脱对于少数权威信息源的依赖,只是说尽可能的可以通过程序公正、事后追责、分布式容错的思路来尽量降低这种依赖。

2、目前各家预言机项目的解决方案各有利弊。

短期来看: Oraclize虽然是中心化的项目,但具有很强的的应用性,用户可随机抓取自定义信息。Augur对于预测市场方向也可以说是简单实用,但是涉及到人工投票,速度可能不快。

长期来看:Chainlink和DOS Network这两种去中心化的预言机网络选取方案和多信息源对比的思路在架构上会更加安全可靠。

 7,蚂蚁区块链 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);
}

 

https://blog.csdn.net/weixin_43761479/article/details/85067727

https://blog.csdn.net/hello2mao/article/details/96275418

https://www.zhihu.com/search?type=content&q=%E9%A2%84%E8%A8%80%E6%9C%BA

 

posted @ 2020-01-07 16:37  xdyixia  阅读(1730)  评论(0编辑  收藏  举报