原文链接:https://blog.chain.link/fetch-current-crypto-price-data-solidity/
原文题目:_How to Fetch the Current Price of Ethereum, Bitcoin, and Other Cryptocurrencies in Solidity_
原文作者:Harry Papacharissiou

在Solidity智能合约中获取价格数据是DeFi利用的常见需要。在Solidity中为了获取ETH,BTC或者其余加密货币的价格,你能够通过上面两种形式之一实现:

  • 应用Chainlink的喂价获取价格数据
  • 通过Chainlink预言机应用内部API获取价格数据

在本技术教程中,咱们将具体解说这两种办法,并分享代码案例帮忙你构建、部署并测试智能合约。首先,咱们疾速理解一下为智能合约提供内部数据时,数据品质和端到端去中心化的重要性。

智能合约对精确、牢靠的价格数据的需要

往年DeFi协定呈爆发式增长,DeFi的总锁定价值从一月份6.8亿美金激增到当初的140亿美金。这些DeFi协定依赖内部价格数据作为数据源,因为区块链不能在本地间接拜访内部数据。此外这些利用须要提供数据保障来爱护利用免遭破绽利用,如价格预言机攻打等攻打。

Chainlink喂价可能升高这些攻打的危险,实现办法是提供聚合自多种高质量数据提供商的数据,并通过Chainlink网络上的去中心化预言机将数据输出到链上。Chainlink的去中心化预言机机制能确保最终的价格数据反映宽泛的市场信息笼罩,这意味着最终的价格数据是在汇总整个市场上各种不同的价格数据之后确定的,而不只是一小部分信息,同时也会思考到其余因素,如成交量和流动性等。

当初咱们了解了Solidity智能合约对精确、牢靠的价格数据的需要以及Chainlink喂价预言机所表演的重要角色,上面咱们将具体解读应用Chainlink喂价获取最新的以太坊价格数据的案例。上面的步骤也能利用到比特币以及其余加密货币。

在以太坊上应用Chainlink喂价

Chainlink喂价应用多种高质量的数据输出,并通过Chainlink预言机的去中心化网络聚合这些数据,将价格数据输出到参考合约中,这些数据后果会在聚合器(Aggregator)智能合约中聚合成为最新的价格数据作为可信答案。应用多种节点聚合的多种数据源,咱们可能确保咱们的价格数据达到最高品质,并且不会蒙受破绽利用或者价格预言机攻打。

创立智能合约

第一步是获取测试网的ETH作为智能合约的gas费。在取得一些ETH后,构建一个用上Chainlink喂价的智能合约的最简略的形式是从规范的价格消费者合约开始。这是用于启动对Chainlink喂价申请的根本合约。这部分基于演示目标,咱们将应用曾经定义在规范的价格消费者合约中的ETH/USD喂价,然而咱们将具体解释这部分的代码,便于你理解它的工作原理。

首先,咱们能够看到AggregatorV3Interface合约接口被导入。这样咱们的智能合约就能够援用部署在Kovan测试网络的喂价合约。接着,咱们创立一个合约实例并保留到本地变量中。

import "https://github.com/smartcontractkit/chainlink/blob/master/evm-contracts/src/v0.6/interfaces/AggregatorV3Interface.sol";
AggregatorV3Interface internal priceFeed;

接下来,咱们能够看到喂价参考合约在构造函数中被初始化。Kovan测试网上的ETH/USD喂价参考合约部署在地址为_0x9326BFA02ADD2366b30bacB125260Af641031331_上。

priceFeed = AggregatorV3Interface(0x9326BFA02ADD2366b30bacB125260Af641031331);

而后咱们看到一个曾经定义好的函数用于从喂价聚合合约中获取最新的价格数据,该合约在下面提到的构造函数中实例化。为了获取价格,咱们定义一个新的函数从聚合器(Aggregator)合约中调用latestRoundData函数。 这是返回聚合器(Aggregator)合约以后状态的函数,在本例中,咱们取出以后价格并将其返回到生产函数中。

function getLatestPrice() public view returns (int) {        (            uint80 roundID,             int price,            uint startedAt,            uint timeStamp,            uint80 answeredInRound        ) = priceFeed.latestRoundData();        return price;    }

部署和测试智能合约

当初咱们筹备部署和测试咱们的合约。在Remix中编译合约,而后在“部署”选项上,将环境更改为“Injected Web3”,并确保上面的钱包地址是你的MetaMask钱包中蕴含后面取得ETH的钱包地址,点击部署按钮,而后依照步骤操作即可。最终后果是你将智能合约部署到了Kovan测试网。须要记录一下通过Remix控制台中的事务输入记录的已部署的合约地址。

部署后,咱们只须要执行“getLatestPrice”函数。 后果应该是该函数从ETH/USD聚合器(Aggregator)合约返回的最新价格,而后能够在咱们的智能合约中链上调用这个数据。留神咱们不须要为申请发送任何LINK代币,也不应用任何ETH,该交易纯正是读取链上ETH-USD 聚合器(Aggregator)合约中的数据。


ETH/USD喂价后果

在Solidity中获取其余价格数据

Chainlink喂价提供了大量的位于头部的DeFi价格对的价格数据。如果你须要在你的智能合约中获取的资产价格数据没有被现有的喂价合约笼罩到,比方特定的股票的价格,你能够自定义Chainlink预言机以调用任何的内部API。应用Chainlink预言机获取内部价格数据的最简略办法是从规范Chainlink的APIConsumer合约开始。这是通过Chainlink预言机来启动对外部数据申请的标准化合约。

实现创立APIConsumer合约后,就能够去找到想要从中获取价格数据的API。如,你能够应用Alpha Vantage API查找IBM股票的以后价格。

有了API端点后,你只须要在合约中设置正确的参数并将申请发送给Chainlink预言机。能够在Chainlink文档中找到无关此内容以及如何应用规范APIConsumer合约的更多信息。

请记住在生产环境中,你将会心愿把这种应用办法去中心化,或者从喂价合约自身获取此特定数据。

总结

Chainlink喂价提供了一种牢靠的办法来获取高质量的比特币、以太坊以及其余加密货币价格数据到Solidity智能合约中。此外,Chainlink的预言机框架还提供了能够疾速、轻松地获取其余价格数据的灵活性,如股票、商品和其余资产的价格数据。

如果你是开发者,想要疾速为你的利用连贯到Chainlink的价格参考数据,拜访开发者文档,并接入Discord技术探讨。
English channels
Website | Twitter | Reddit | YouTube | Telegram | Events | GitHub | Price Feeds | DeFi
中文渠道
中武官网 | 知乎 | SegmentFault | CSDN |