Oracle - 读取链外数据

 

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

 

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

 

获取外部数据会通过名为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    }}