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
}
}