区块链 预言机 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    }}

猜你喜欢

转载自blog.csdn.net/u013288190/article/details/113000593