Web3智能合约:预言机(Oracle)使用入门

admin 2025年1月16日08:35:44评论9 views字数 3071阅读10分14秒阅读模式

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. 1. 编译
  2. Web3智能合约:预言机(Oracle)使用入门
  3. 2. 部署
    这里使用metamask并确保你的钱包中在Sepolia测试网上有一定的Link
  4. Web3智能合约:预言机(Oracle)使用入门
  5. 3.  单击getChainlinkDataFeedLatestAnswer按钮,可以看到结果,注意这里获取到的结果是个int整数,实际的结果是需要考虑小数位的,具体多少个小数位可以在docs.chain.link/data-feeds/price-feeds/addresses?network=ethereum&page=1[5]点击更多细节后查看。
    这里的话是8个小数位,所以结果大概在$96582.56723691,也即大概9万6千,也就是一个btc对应9.6万美金。
  6. Web3智能合约:预言机(Oracle)使用入门

引用链接

[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)使用入门

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月16日08:35:44
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Web3智能合约:预言机(Oracle)使用入门https://cn-sec.com/archives/3634284.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息