当前位置:主页 > 建站知识 > 软件开发 >

‘金年会在线入口’Chainlink预言机基本原理(三)

发布时间:2022-10-23 00:38   浏览次数:次   作者:金年会在线入口
本文摘要:以Chainlink取得的TestnetConsumer合同的requestEthereumPrice方法为例,简单说明促使呼吁的过程。

金年会在线入口

以Chainlink取得的TestnetConsumer合同的requestEthereumPrice方法为例,简单说明促使呼吁的过程。此函数是functionrequestethereumprice (address _ Oracle,string _ jobid ) Publiconlyowner { chain link.requestmemoryreq=Buildchainle req.add('get ',' https://MIN-API fsym=ETHtsyms=USD ' ); req.add('path ',' USD ' ); req.addInt('times ',100 ); sendChainlinkRequestTo(_oracle,req,ORACLE_PAYMENT ); 建立注册的API(cryptocompare )提供ETH/USD交易价格的功能。函数起源的参数是注册的oracle地址和jobId。对几个佩的催促参数进行分组时,调用sendChainlinkRequestTo方法会提示接收。

sendChainlinkRequestTo是在Chainlink获取的库中定义的模块方法,/** * @notice在注册的oracle地址中提示建立* @dev,存储催促ID,本地nonce *建立目标oracle合同地址的催促收到了ChainlinkRequested事件. * @param _oracle发送催促目标oracle地址* @param _req完成初始化的Chainlink的催促@param _req @return是id */functionsendchainlinkrequestto (address _ Oracle, 提示Chainlink.Request memory _req ),UINT 256 _ Payment ) Internal returns (byte S32 request ID ) { request ID=KEC CAK 256 (BI.Encod pending requests [ request id ]=_ Oracle; emitchainlinkrequested (request id ) require (link.transferandcall (_ Oracle,_payment,encodeRequest(_req ) ),' unabletotransfeee 返回请求id; 其中link.transferAndCall方法是ERC677中定义的token帐户方法,与ERC20的transfer方法相比,增加了一个data字段,可以与帐户同时加载数据。在这里,我把以前包好的催促数据放在data字段里,根据账户发送给oracle合同。transferAndCall方法被定义为/** * @dev将token连同附加数据移动到一个合同地址* @param _to的目标地址* @param _value移动到数量*@param。

functiontransferandcall (address _to,uint _value,bytes _ data ) public returns (bool success ) { sing transfer (MSG.sender,_ to,) if (is contract (_ to ) ) { contract fallback (_ to,_value,_data; }return true; 其中的Transfer(msg.sender,_to,_value,_data ); 我收到了一个名为event transfer (addressindexedfrom,address indexed to,uint value,bytes data )的事件日志。记录这次账户的详细信息(发送地址、交接地址、金额、数据)。Oracle合同收到账户后,在互联网新闻网络上不检查账户的有效性,而是接收OracleRequest事件,从而获得更详细的数据信息Eventoraclerequest (byte ST address requester,bytes32 requestId,uint256 payment,address callbackAddr,bytes4 callbackFunctionId,uint256canceed此日志是图中下右图的链下的节点不订阅该主题的日志,在提供记录的日志信息后,节点不解析有催促的明确信息,而是通过网络的API调用提供催促的结果。然后,通过传递事务来调用Oracle合同的fulfillOracleRequest方法,并将数据传递给链。

金年会在线入口

在fulfillOracleRequest中,/** * @notice从Chainlink节点调用的促使* @dev分发的参数是由' oracleRequest '方法记录的散列参数*调用消息传递地址使节点能够取得报酬的* @param _requestId催促ID必须发送请求者给出的* @param _payment为Oracle支付的金额(以wei为单位) * @ Param _ Callback Address @ Param _ Callback Functionid完成方法的消息传递函数* @param _expiration请求者是以前节点不应调用的到期时间* @ Param _。functionfulfilloraclerequest (byte s32 _ request id,uint256 _payment,address _callbackAddress, bytes4) byte s32 _ data ) externalonlyauthorizednodeisvalidrequest (_ request id ) returns (bool ) { byte s32 params hash require (commitmitme ) withdrawabletokens=withdrawabletokens.add (_ Payment ); delete commitments[_requestId]; require (gas left ()=minimum _ consumer _ gas _ limit,' Must provide consumer enough gas ' ); return _ callback address.call (_ callback functionid,_requestId,_data ); //sol hint-disable-line avoid-low-level-calls }此方法在展开一系列检查后,不通过以前记录的消息地址和消息传递函数,而是通过消费者合同: _callbacce 这样一次催促就全部完成了。本文从成就机的概念入手,通过非常简单地提供ETH价格的例子,介绍了催促/呼吁模式的Chainlink成就机的基本过程,以期有助于解读成就机和Chainlink的运营原理。


本文关键词:‘,金年会,金,年会,在线,入口,’,Chainlink,以,金年会在线入口

本文来源:金年会在线入口-www.gzshugu.com