6 * 个中getResponse暗示回调要领名,可自界说;
12 (bool success,) = callbackAddr.call.gas(CALLBACK_GAS)(abi.encodeWithSignature(callbackFUN, queryId, stateCode, respData));
4 * @param callbackAddr 回调的合约地点
3 * @param queryId 查询请求id
1// 查询事件,,oracle后端处事会订阅该事件
5 * @param callbackFUN 回调合约的要领及参数
· 对付用户请求的数据范例,本文今朝实现了uint256和bytes两种范例的回调。
一、Oracle简介
18 */
Oracle处事分为中心化和去中心化,其焦点区别是对数据的获取和审核上。去中心化的Oracle处事会有一套机制可以或许保障推送给用户合约的数据是可信的。而无论是中心化照旧去中心化,用户合约挪用Oracle合约和Oracle处事将获取到的功效数据推送给用户合约的底层逻辑都是一样的。
· Oracle处事(靠山处事)通过订阅Oracle合约的Event事件,获取到用户的请求
7 * bytes32范例参数指请求id,回调时会原值返回;
20}
· Oracle处事按照用户请求获取外部数据
9 * 第三个参数暗示Oracle处事回调支持uint256/bytes两种范例的参数
https://github.com/six-days/ethereum-contracts/blob/master/oracle/Oracle.sol
20 require(address(this).balance > CALLBACK_GAS, “Insufficient balance!”);
16 require(queryData.length > 0, “Invalid queryData!”);
7 * @param respData 查询功效
通过上面临Oracle处事流程的阐明,总结到一个Oracle合约至少需要包括两个要领和一个事件:
18 emit QueryInfo(queryId, msg.sender, msg.value, callbackAddr, callbackFUN, queryData);
下篇我们将先容Oracle处事(后端处事)如何订阅查询事件以及将获取到的数据返回给合约,详细实现代码将以golang语言给出。
3. 可以或许供Oracle处事订阅的用户请求事件
9 */
4 * @param callbackAddr 回调的合约地点
2 * @dev 吸收客户端请求
https://learnblockchain.cn/people/4361. 可以或许吸收用户合约请求的要领2event QueryInfo(bytes32 queryId, address requester, uint fee, address callbackAddr, string callbackFUN, bytes queryData);
下篇:抽奖合约挪用Oracle处事示例
· Oracle合约吸收到用户查询请求后将相关数据写入Event事件中
14}
11 require(address(this).balance > CALLBACK_GAS, “Insufficient balance!”);
· 可以或许供Oracle处事订阅的用户请求事件
Oracle(预言机)是链接链上与链下的桥梁,可以或许将链下数据推送给链上。正是由于Oracle的存在,使得从关闭走向开放,布满无限大概。
22 require(success);
本文将通过上、中、下三篇文章教育各人一步步开拓实现一其中心化的Oracle处事,并通过一个抽奖合约演示如何利用我们的Oracle处事。文章内容布置如下:
接下来,我将实现一个通用的Oracle合约。
10 * @param queryData 请求数据,json名目,如{“url”:”https://ethgasstation.info/api/ethgasAPI.json”,”responseParams”:[“fast”]}
8 * @return bool true请求乐成,false请求失败
· 思量到通用性,用户请求的数据来历由用户自界说。假如是一个专类的Oracle处事(如只提供随机数处事),可以不需要请求数据字段。
· Oracle处事挪用Oracle合约响应要领,传入获取的外部数据
19function responseUint256(bytes32 queryId, address callbackAddr, string calldata callbackFUN, uint64 stateCode, uint256 respData) payable external isOwner returns(bool) {
整体流程如下图所示。
13 require(success,”call back failed!”);19 return true;
12 */
中篇:利用go语言开拓Oracle处事
23}
如需相识Oracle基本常识,这里推荐阅读孙孝虎的《什么是区块链预言机(BlockChain Oracle)》
· 思量到节减用户的请求用度,加之自己就是一其中心化的Oracle处事,不存在作弊问题,因此query要领并没有变动任何状态变量,用户请求数据直接写入到日志中。
6 * @param stateCode 查询功效状态码,1暗示查询乐成,0暗示失败
8 * uint64范例参数暗示oracle处事状态码,1暗示乐成,0暗示失败;
一、文章布局
1 /**
· 用户合约挪用Oracle合约的查询要领
· 用户合约收到Oracle合约通报的数据,继承本身的业务。
5 * @param callbackFUN 回调合约的要领及参数,如getResponse(bytes32,uint64,uint256/bytes),
3 * @param queryId 请求id,回调时原值返回
2 * @dev 将查询获得的功效(bytes范例)发送给客户端
17 * @dev 将查询获得的功效(uint256范例)发送给客户端
上篇:Oracle简介及合约实现
21 (bool success,) = callbackAddr.call.gas(CALLBACK_GAS)(abi.encodeWithSignature(callbackFUN, queryId, stateCode, respData));
16/**
15 require(bytes(callbackFUN).length > 0, “Invalid callbackFUN!”);
作者主页:
14 require(msg.value >= MIN_FEE, “Insufficient handling fee!”);
11 * @return bool true请求乐成,false请求失败
13function query(bytes32 queryId, address callbackAddr, string calldata callbackFUN, bytes calldata queryData) external payable returns(bool) {
2. 可以或许回挪用户合约的要领
1/**
三、Oracle合约
15
· 用户合约会多次请求Oracle处事,获取数据, queryId请求ID参数可以让用户合约对请求做标识。
事件将用户请求的相关参数都记录下来,Oracle处事通过订阅该事件,一旦有用户请求时,Oracle处事就可以或许获取到用户的请求数据。
17 // 记录日志
· 让用户传callbackAddr回调地点参数,而不是直接通过msg.sender获取挪用者地点,是思量到挪用Oracle合约(付费方)和吸收数据方有大概不是一个地点。
一个完整的中心化Oracle处事请求流程为:
· Oracle合约响应要领挪用用户合约的回调要领,将数据通报给用户合约
需要说明的处所:
完整代码地点:
10function responseBytes(bytes32 queryId, address callbackAddr, string calldata callbackFUN, uint64 stateCode, bytes calldata respData) payable external isOwner returns(bool) {
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。