Web3智能合约:预言机(Oracle)使用入门
预言机(Oracle)
在区块链上,链上数据是无法和链下(现实世界)数据做交互的,比如:在链上你无法获取美元汇率,但是在智能合约中,经常会遇到需要和现实世界信息做交互的场景,比如当法币和虚拟币的交易的时候,就需要去获取法币和虚拟币之间的转换关系。而且需要对信息来源做保障验证,对数据隐私等也要做好保护。预言机就是为了解决类似上述需要链上链下做数据交互的场景而存在的。
目前预言机龙头厂商是国外的Chainlink[1],这次就以他的测试网上的喂价服务(获取虚拟币与法币的转换关系),做学习演示。
合约代码
根据官方文档,你需要引入他的datafeed接口:import {AggregatorV3Interface} from "@chainlink/[email protected]/src/v0.8/shared/interfaces/AggregatorV3Interface.sol";
接下来你需要获取该喂价服务 Sepolia 测试网合约地址,因为我们要使用他的喂价服务,需要支付一定的费用,Chainlink预言机费用,默认使用官方的名为Link的代币,我们做测试的话,可以领一些test Link.
测试网的话,可以从他的水龙头获取一下: faucets.chain.link[2]
我们这里以获取比特币和美元直接的转换关系。对应的测试网合约地址查询地址:docs.chain.link/data-feeds/price-feeds/addresses?network=ethereum&page=1[3]
我这里查询的地址为0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43
接下来,实现他的接口并使用上述预言机合约地址:
AggregatorV3Interface internal dataFeed;
constructor() {
dataFeed = AggregatorV3Interface(
0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43
);
}
然后我们可以调用实例dataFeed对象的latestRoundData函数,用于获取结果,我们只想获取精准的价格数据,不要其他的时间戳等信息(这个函数会有很多返回值),代码可以这么写:
( ,int answer, , , ) = dataFeed.latestRoundData();
不需要反返回的结果用逗号占位即可。
完整代码:docs.chain.link/data-feeds/getting-started[4]
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import {AggregatorV3Interface} from "@chainlink/[email protected]/src/v0.8/shared/interfaces/AggregatorV3Interface.sol";
/**
* THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED
* VALUES FOR CLARITY.
* THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE.
* DO NOT USE THIS CODE IN PRODUCTION.
*/
/**
* If you are reading data feeds on L2 networks, you must
* check the latest answer from the L2 Sequencer Uptime
* Feed to ensure that the data is accurate in the event
* of an L2 sequencer outage. See the
* https://docs.chain.link/data-feeds/l2-sequencer-feeds
* page for details.
*/
contract DataConsumerV3 {
AggregatorV3Interface internal dataFeed;
/**
* Network: Sepolia
* Aggregator: BTC/USD
* Address: 0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43
*/
constructor() {
dataFeed = AggregatorV3Interface(
0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43
);
}
/**
* Returns the latest answer.
*/
function getChainlinkDataFeedLatestAnswer() public view returns (int) {
// prettier-ignore
(
/* uint80 roundID */,
int answer,
/*uint startedAt*/,
/*uint timeStamp*/,
/*uint80 answeredInRound*/
) = dataFeed.latestRoundData();
return answer;
}
}
部署
-
1. 编译 -
-
2. 部署
这里使用metamask并确保你的钱包中在Sepolia测试网上有一定的Link -
-
3. 单击getChainlinkDataFeedLatestAnswer按钮,可以看到结果,注意这里获取到的结果是个int整数,实际的结果是需要考虑小数位的,具体多少个小数位可以在docs.chain.link/data-feeds/price-feeds/addresses?network=ethereum&page=1[5]点击更多细节后查看。
这里的话是8个小数位,所以结果大概在$96582.56723691,也即大概9万6千,也就是一个btc对应9.6万美金。 -
引用链接
[1]
Chainlink: https://chain.link/[2]
faucets.chain.link: https://faucets.chain.link/sepolia[3]
docs.chain.link/data-feeds/price-feeds/addresses?network=ethereum&page=1: https://docs.chain.link/data-feeds/price-feeds/addresses?network=ethereum&page=1#sepolia-testnet[4]
docs.chain.link/data-feeds/getting-started: https://docs.chain.link/data-feeds/getting-started[5]
docs.chain.link/data-feeds/price-feeds/addresses?network=ethereum&page=1: https://docs.chain.link/data-feeds/price-feeds/addresses?network=ethereum&page=1
原文始发于微信公众号(黑晶):Web3智能合约:预言机(Oracle)使用入门
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论