比特币

区块链研究实验室|如何从以太坊智能合约调用 chainlink 的 API

[ad_1]

由于区块链生态系统的性质,从链上智能合约中访问链外数据是不可能的。然而,Chainlink 为区块链 oracle 提供了一个平台,区块链 oracle 是网络上充当链上和链下数据之间桥梁的节点。oracle 使智能合约能够从外部世界检索数据。

每个 oracle 节点都可以配置为执行范围广泛的任务,具体取决于它支持的适配器。其中一些适配器包括 httpget、httppost、JSON Parse、Multiply 等的实现。

如何使用 Chainlink Oracle

注意:在此示例中,我们使用的是 Ropsten 测试网。

假设我们要创建一个智能合约,该合约以以太坊的美元价格为准,这是根据受欢迎的价格分析网站 CoinGecko 的报道得出的。我们知道,我们的智能合约没有本地方法可以调用外部 HTTP API,但是 oracle 节点可以。

使用请求和响应周期,我们的智能合约可以从 oracle 节点请求数据,该节点被配置为执行 HTTP GET 请求,并为 oracle 实现回调函数以响应。

图 1:请求和接收数据流

我们不能简单地使用任何 Oracle,因为每个 Oracle 被配置为执行特定的任务,具体取决于它们支持的适配器。为了找到适合我们需求的高品质 Oracle,我们必须使用诸如 Chainlink Market 之类的挂牌服务进行搜索。

Chainlink market

列表服务使我们能够找到可以满足我们要求的 Oracle。常用的 API 通常具有预先配置的对某些端点的请求的 oracle 实现,这使我们的开发更加容易。我们可以通过转到 Chainlink Market 主页并在搜索栏中键入“ CoinGecko”来确定所需的 CoinGecko 端点是否已由 Oracle 实施。

区块链研究实验室|如何从以太坊智能合约调用 chainlink 的 API

图 2:Chainlink Market 搜索“ CoinGecko”

如图 2 所示,我们得到了一些结果

Nodes 部分上架了已返回搜索字符串结果的 oracle 节点。这可能意味着它们支持从 coingeckoapi 检索数据的作业,在可用的三个节点中,Omniscience-Ropsten 已验证(带圆圈),表明了它的可靠性。它的作业运行次数也最多。

向下滚动,我们可以在 Jobs 标题下看到 ETH-USD CoinGecko。这看起来很完美,因为它似乎可以准确描述我们要检索的内容,并使用经过验证的节点。

区块链研究实验室|如何从以太坊智能合约调用 chainlink 的 API

图 3 显示了节点详细信息页面,该页面为我们提供了有关 Oracle 节点的更多信息。在左侧(红色矩形内)是 oracle 的链上地址。如果要使用此 oracle,则需要记下该地址。

在屏幕的右侧是三个选项卡:Adapters, Feeds 和 Jobs。点击 Jobs 并滚动直到找到 ETH-USD CoinGecko。单击该链接以显示工作信息页面。

区块链研究实验室|如何从以太坊智能合约调用 chainlink 的 API

图 4 向我们显示了 jobs 信息页面,在该页面中,我们可以查看有关 jobs 要求的详细信息。突出显示了作业 ID 和运行此作业的成本(也记下这些)。

页面右侧是“任务列表”。这是作业被调用时执行的操作的列表。每个任务使用一个受支持的适配器,一个接一个地创建一个任务链。让我们遍历列表中的每个任务,以找出作业如何获取所需的数据:

1. HTTP GET Request

区块链研究实验室|如何从以太坊智能合约调用 chainlink 的 API

第一个任务是使用 HTTP GET 调用 CoinGecko API。我们可以从参数中的 URL 确认它发出了正确的 CoinGecko 请求。这将返回 JSON 响应主体。

2. JSON Parse

区块链研究实验室|如何从以太坊智能合约调用 chainlink 的 API

由于任务 1 返回 JSON,因此下一个任务需要解析它以访问目标数据。任务 2 使用 JSON Parse 适配器通过提供的路径遍历返回的 JSON 对象。例如任务 2 路径中的目标数据将位于以下 JSON 结构中:

{
“market_data”:
{
“current_price”:
{
“usd”: “PRICE_HERE”
}
}
}

3. Multiply

区块链研究实验室|如何从以太坊智能合约调用 chainlink 的 API

我们已经从 JSON 中获取了价格,但还没有完全准备好。由于 Solidity 不能处理小数,任务 3 将价格乘以 100000000,以确保它可以表示为整数。

4. ETH Int256

区块链研究实验室|如何从以太坊智能合约调用 chainlink 的 API

然后任务 4 将结果转换为编码的 int256。

5. ETH Transaction

区块链研究实验室|如何从以太坊智能合约调用 chainlink 的 API

最后任务 5 创建一个以太坊事务,将结果发送回原始合约。

智能合约编写

现在我们已经选择了一个可以满足请求的 Oracle,让我们写一个可以提出请求的合约。Chainlink 提供了一个名为 ChainlinkClient 的父合约,我们将对其进行扩展以简化请求和响应周期。

pragma solidity 0.6.0;

import “https://github.com/smartcontractkit/chainlink/evm-contracts/hide/v0.6/ChainlinkClient.sol”;
import “https://github.com/smartcontractkit/chainlink/evm-contracts/hide/v0.6/vendor/Ownable.sol”;

contract ExampleOracleClient is ChainlinkClient, Ownable {
address constant private ORACLE = 0x83dA1beEb89Ffaf56d0B7C50aFB0A66Fb4DF8cB1;
string constant private JOB_ID = “93547cb3c6784ec08a366be6211caa24”;
uint256 constant private ORACLE_PAYMENT = 1 * LINK / 10;

uint256 public currentPrice;

event RequestEthereumPriceFulfilled(
bytes32 indexed requestId,
uint256 indexed price
);

constructor() public Ownable() {
setPublicChainlinkToken();
}

function requestEthereumPrice() public onlyOwner {
Chainlink.Request memory req = buildChainlinkRequest(stringToBytes32(JOB_ID), address(this), this.fulfillEthereumPrice.selector);
sendChainlinkRequestTo(ORACLE, req, ORACLE_PAYMENT);
}

function fulfillEthereumPrice(bytes32_requestId, uint256_price) public recordChainlinkFulfillment(_requestId) {
emit RequestEthereumPriceFulfilled(_requestId,_price);
currentPrice =_price;
}

function withdrawLink() public onlyOwner {
LinkTokenInterface link = LinkTokenInterface(chainlinkTokenAddress());
require(link.transfer(msg.sender, link.balanceOf(address(this))), “Unable to transfer”);
}

function stringToBytes32(string memory source) private pure returns (bytes32 result) {
bytes memory tempEmptyStringTest = bytes(source);
if (tempEmptyStringTest.length == 0) {
return 0x0;
}

assembly { // solhint-disable-line no-inline-assembly
result := mload(add(source, 32))
}
}
}

图 5 向我们展示了 ExampleOracleClient 合约。它具有使用通过 Chainlink Market 找到的 Oracle 向 CoinGecko 请求以太坊的最新美元价格的功能。让我们逐行浏览:

第 7 行:节点详细信息页面上的图 3 中找到的 Oracle 地址

第 8 和 9 行:图 4 中找到的工作 ID 和价格

第 11 行:currentPrice 是将由执行请求的 oracle 填充的字段。

第 19 行:setPublicChainlinkToken ()是 ChainlinkClient 父合约中可用的函数,该函数设置当前网络上 LINK 令牌的地址。

第 22–25 行:requestEthereumPrice ()使用 Oracle 地址,作业 ID,价格和回调函数构建 Chainlink 请求。然后它使用 sendChainlinkRequestTo ()请求数据,这是父 ChainlinkClient 合约提供的另一个功能。

第 27 行:Oracle 用于完成请求的回调函数

第 32 行:使所有者能够从合约中提取 LINK 令牌的函数

第 37 行:用于构建请求的实用程序功能

尝试将此合约粘贴到 Remix IDE 中并部署到 Ropsten 测试网。部署后,将一些 Ropsten LINK 发送到其地址(你可以在此处找到 Ropsten LINK 水龙头)。然后当该事务成功完成后,在你可用的功能列表中单击 requestEthereumPrice。几秒钟 / 分钟后,单击 currentPrice 按钮,你应该会看到一个价格

区块链研究实验室|如何从以太坊智能合约调用 chainlink 的 API

结论

Chainlink oracle 是强大的工具,可实现外部世界与区块链之间的互操作性。诸如 Chainlink Market 之类的清单服务是一种有用的目录服务,用于查找最适合你的智能合约需求的 Oracle。

在我们的示例中,我们发现了一个 oracle 作业,该作业已配置为从目标终端请求数据。如果这样的工作不存在,或者你找不到它,也可以。Oracle 还支持接受 GET 请求 URL 作为参数并从中获取数据的作业。这意味着你可以使用 Chainlink oracle 从任何外部 API 检索数据。

相关文章阅读:

区块链研究实验室|如何使用 JavaScript 为 DeFi 协议提供资产数据

区块链研究实验室|如何从 DeFi 协议获取交易数据

加密货币区块链数据库详解(第二部分)

区块链研究实验室 |Hyperledger Fabric 最佳实践-使用 Chaincode 加密货币状态数据库#2

区块链研究实验室|如何从以太坊智能合约调用 chainlink 的 API

描下放二维码添加我,拉你进入技术交易所群

区块链研究实验室|如何从以太坊智能合约调用 chainlink 的 API

来源链接:mp.weixin.qq.com

声明:以上内容采集自互联网,作品版权归原创作者所有内容均以传递信息为目的,不代表本站同意其观点,不作为任何投资指导。币圈有风险,投资需谨慎

[ad_2]
0X簡體中文版:区块链研究实验室|如何从以太坊智能合约调用 chainlink 的 API