区块链 预言机 Oracle是什么 例子

本文探讨了智能合约在当前面临的数据封闭问题,指出获取链外数据的重要性,特别是在保险等行业的应用。Oracle作为链外数据层,负责为智能合约提供外部数据。通过示例展示了Oracle合约和业务合约如何交互,实现数据查询和响应。这种方式有望扩大智能合约的使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Oracle - 读取链外数据

 

目前,链上的智能合约生态相对封闭,无法获取链外数据,影响了智能合约的应用范围。

 

链外数据可极大扩展智能合约的使用范围,比如在保险业中,如果智能合约可读取到现实发生的意外事件,就可自动执行理赔。

 

获取外部数据会通过名为Oracle的链外数据层来执行。

 

当业务方的合约尝试获取外部数据时,会先将查询请求存入到某个Oracle专用合约内;

Oracle会监听该合约,读取到这个查询请求后,执行查询,并调用业务合约响应接口使合约获取结果。

 

图片

 

下面定义了一个Oracle合约

contract Oracle {    address oracleSource = 0x123; // known source
    struct Request {        bytes data;        function(bytes memory) external callback;    }
    Request[] requests;    event NewRequest(uint);    modifier onlyByOracle() {        require(msg.sender == oracleSource); _;    }
    function query(bytes data, function(bytes memory) external callback) public {        requests.push(Request(data, callback));        emit NewRequest(requests.length - 1);    }
    //回调函数,由Oracle调用    function reply(uint requestID, bytes response) public onlyByOracle() {        requests[requestID].callback(response);    }}

 

业务方合约与Oracle合约进行交互:

contract BizContract {    Oracle _oracle;
    constructor(address oracle){        _oracle = Oracle(oracle);    }
    modifier onlyByOracle() {        require(msg.sender == address(_oracle));         _;    }
    function updateExchangeRate() {        _oracle.query("USD", this.oracleResponse);    }
    //回调函数,用于读取响应    function oracleResponse(bytes response) onlyByOracle {    // use the data    }}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

软件工程小施同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值