http://www.7klian.com

Chainlink预言机入门根基道理(三)

require(gasleft() >= MINIMUM_CONSUMER_GAS_LIMIT, "Must provide consumer enough gas");

function sendChainlinkRequestTo(address _oracle, Chainlink.Request memory _req, uint256 _payment)
bytes4 callbackFunctionId,
_callbackAddress.call(_callbackFunctionId, _requestId, _data);
{
external
req.addInt("times", 100);
address _callbackAddress,
return requestId;


_req.nonce = requests;

requests += 1;

* @param _expiration 请求者可以打消之前节点应响应的到期时间
* @dev 提交的参数必需是`oracleRequest`要领所记录的哈希参数
bytes32 _data
)
{
returns (bool)

我们以Chainlink提供的TestnetConsumer合约中的一个requestEthereumPrice 要领为例来简朴讲一下请求响应的流程。这个函数界说如下:
onlyOwner
bytes32 indexed specId,
address callbackAddr,
* @notice 向指定的oracle地点建设一个请求
* @dev 建设并存储一个请求ID, 增加当地的nonce值, 并利用`transferAndCall` 要领发送LINK,
public

_payment,
* @param _payment 请求发送的LINK数量
require(link.transferAndCall(_oracle, _payment, encodeRequest(_req)), "unable to transferAndCall to oracle");

总结

delete commitments[_requestId];
* @dev 将token和特别数据一起转移给一个合约地点
bytes32 paramsHash = keccak256(
* @param _requestId 请求ID必需与请求者所匹配
emit ChainlinkRequested(requestId);
}
* @param _value 转移数量
/**
event Transfer(address indexed from, address indexed to, uint value, bytes data);

function requestEthereumPrice(address _oracle, string _jobId)
_callbackAddress,


Oracle合约在收到转账之后,会触发onTokenTransfer要领,该要了解查抄转账的有效性,并通过发出OracleRequest事件记录更为具体的数据信息:
returns (bool success)
/**
* @param _req 完成初始化的Chainlink请求
*/
);
event OracleRequest(
}
bytes32 requestId,
这个日志会在oracle合约的日志中找到,如图中下方所示。链下的节点会订阅该主题的日志,在获取到记录的日志信息之后,节点会理会出请求的详细信息,通过网络的API挪用,,获取到请求的功效。之后通过提交事务的方法,挪用Oracle合约中的fulfillOracleRequest要领,将数据提交到链上。fulfillOracleRequest界说如下:
* @param _oracle 发送请求至的oracle地点
* @return 外部挪用乐成的状态值
uint256 dataVersion,

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。