7*24快訊如何在前端...

如何在前端顯示加密貨幣和法幣價格

Web3 開發人員通常選擇在前端顯示平台或協議的本機加密貨幣,而不是顯示轉換為法定貨幣。但是,雖然很容易關注本國貨幣,但顯示法定貨幣兌換可能是更好的選擇。加密貨幣的定價假設了解貨幣的當前價值,該價值往往會波動,並且還會為新用戶創造不那麼受歡迎的體驗,其中許多人更願意參考美元或他們的本國貨幣。

幸運的是,在ETH 和USD 等貨幣之間進行轉換很簡單 Chainlink 數據饋送,這意味著開發人員只需幾個簡單的步驟即可為用戶提供更好的體驗。本技術教程分解瞭如何使用ETH / USD Chainlink 價格饋送在前端顯示加密和法定價格。

什麼是Chainlink 數據源?

Chainlink 數據饋送是一組智能合約,可提供對安全可靠的現實世界數據源的訪問。它們由獨立、信譽良好且地理分佈的節點運營商提供支持,這有助於確保返回數據的可靠性。這 以太幣/美元 例如,feed 目前使用31 個獨立的預言機或信息源來確定當前以美元計價的ETH 價格的可信答案。

為什麼我們需要31 個來源來獲取相同的信息?使用多個源來聚合經過驗證的響應意味著不會出現單點故障並防止數據篡改。

關於提供者的說明

與智能合約交互時,需要有一個Web3 連接的提供者。通常,這將通過用戶的錢包連接獲得。如果這不可用,或者您不需要連接用戶的錢包,您可以通過以下方式完成相同的功能

const provider = new ethers.providers.JsonRpcProvider('RPC_URL_HERE');

RPC_URL_HERE 可以從節點提供商處獲得,例如 煉金術, 英富拉, 莫拉利斯, 或者 快速節點. 提供商是我們通往區塊鏈的“門戶”。

本教程的另一個要求是以太坊JavaScript 庫。在這個例子中,我使用 醚類. 您需要安裝它才能使示例正常工作。

npm install --save ethers

使用JavaScript 部署ETH / USD 轉換

現在,您需要在前端顯示ETH / USD 價格饋送的代碼。

如果您想跟隨,此示例的代碼可以在 示例回購. 按照README.md 中的說明在本地運行此示例。這個例子使用 苗條,但相同的概念應該適用於任何前端JavaScript 框架,例如React 或Vue。您還可以在SmartContract 中使用其他幾個入門工具包 GitHub 倉庫.

此代碼可以通過import 語句在前端使用

import { getETHPrice } from '../utils/getETHPrice';

然後,將結果存儲為ETH 的USD 價值

value = await getETHPrice();

假設使用此值從ETH 變為USD ethAmount 是要轉換的ETH 數量。

usdValue = Number(ethAmount * value).toFixed(2);

這是完整的文件:

~/utils/getEthPrice.js

import { ethers } from 'ethers';


export async function getETHPrice() {
    const provider = new 
ethers.providers.JsonRpcProvider('RPC_URL_HERE');

    // This constant describes the ABI interface of the contract, which will provide the price of ETH
    // It looks like a lot, and it is, but this information is generated when we compile the contract
    // We need to let ethers know how to interact with this contract.
    const aggregatorV3InterfaceABI = [
        {
            inputs: [],
            name: 'decimals',
            outputs: [{ internalType: 'uint8', name: '', type: 'uint8' }],
            stateMutability: 'view',
            type: 'function'
        },
        {
            inputs: [],
            name: 'description',
            outputs: [{ internalType: 'string', name: '', type: 'string' }],
            stateMutability: 'view',
            type: 'function'
        },
        {
            inputs: [{ internalType: 'uint80', name: '_roundId', type: 'uint80' }],
            name: 'getRoundData',
            outputs: [
                { internalType: 'uint80', name: 'roundId', type: 'uint80' },
                { internalType: 'int256', name: 'answer', type: 'int256' },
                { internalType: 'uint256', name: 'startedAt', type: 'uint256' },
                { internalType: 'uint256', name: 'updatedAt', type: 'uint256' },
                { internalType: 'uint80', name: 'answeredInRound', type: 'uint80' }
            ],
            stateMutability: 'view',
            type: 'function'
        },
        {
            inputs: [],
            name: 'latestRoundData',
            outputs: [
                { internalType: 'uint80', name: 'roundId', type: 'uint80' },
                { internalType: 'int256', name: 'answer', type: 'int256' },
                { internalType: 'uint256', name: 'startedAt', type: 'uint256' },
                { internalType: 'uint256', name: 'updatedAt', type: 'uint256' },
                { internalType: 'uint80', name: 'answeredInRound', type: 'uint80' }
            ],
            stateMutability: 'view',
            type: 'function'
        },
        {
            inputs: [],
            name: 'version',
            outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
            stateMutability: 'view',
            type: 'function'
        }
    ];
    // The address of the contract which will provide the price of ETH
    const addr = '0x8A753747A1Fa494EC906cE90E9f37563A8AF630e';
    // We create an instance of the contract which we can interact with
    const priceFeed = new ethers.Contract(addr, aggregatorV3InterfaceABI, provider);
    // We get the data from the last round of the contract 
    let roundData = await priceFeed.latestRoundData();
    // Determine how many decimals the price feed has (10**decimals)
    let decimals = await priceFeed.decimals();
    // We convert the price to a number and return it
    return Number((roundData.answer.toString() / Math.pow(10, decimals)).toFixed(2));
}

aggregatorV3InterfaceABI 或者ABI 構成了我們需要的大部分代碼。這是我們將與之交互的合約的數據結構,我們需要讓 醚類 知道關於。通常,您可以將這些存儲在前端項目中的單獨JSON 文件中。在這種情況下,它包含在util 文件中以將所有內容放在一起。

// The address of the contract which will provide the price of ETH
    const addr = '0x8A753747A1Fa494EC906cE90E9f37563A8AF630e';

該合約地址將根據網絡或價格對而變化; 你可以使用其中任何一個 數據饋送合同地址.

// We get the data from the last round of the contract 
    let roundData = await priceFeed.latestRoundData();
    // Determine how many decimals the price feed has (10**decimals)
    let decimals = await priceFeed.decimals();
    // We convert the price to a number and return it
    return Number((roundData.answer.toString() / Math.pow(10, decimals)).toFixed(2));

與合同的交互很簡單。我們得到 latestRoundData,它返回:

  • roundId: 回合ID。
  • answer: 價格。
  • startedAt:回合開始時的時間戳。
  • updatedAt:更新回合的時間戳。
  • answeredInRound:計算答案的回合的回合ID。我們感興趣 answer. 這將是帶有一個小警告的ETH 價格。我們需要知道響應中包含的小數位數。那是哪裡 decimals 進來。它返回要包含的小數位數。

我們使用 answerdecimal 返回一個ETH 的值:

return Number((roundData.answer.toString() / Math.pow(10, decimals)).toFixed(2));

使用價值

一旦我們有了一個ETH 的價值,我們就可以用它輕鬆地將ETH 轉換為美元。在以下示例中, rawETH 是從合約餘額返回的字符串。

<!-- Display the raw ETH -->
{Number(rawETH).toFixed(8)} ETH
<!-- Display the ETH converted to USD -->
$ {(Number(rawETH) * value).toFixed(2)} USD

Chainlink 數據饋送 為使用安全方法將我們的價值從ETH 轉換為美元提供可靠的解決方案。

使用Solidity

到目前為止,在前端應用程序中創建實用函數似乎很簡單。但是,如果我們可以消除前端開發人員擔心定價的需要並為他們處理呢?

通過對您的合同進行一些更改,您可以向最終用戶提供當前價格數據——他們需要擔心的只是連接到您的合同。這簡化了所需的前端工作。讓我們看一個示例合同。

pragma solidity ^0.8.0;
// Import the chainlink Aggregator Interface
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

// Create the contract
contract YourAwesomeContract { 
// Declare the priceFeed as an Aggregator Interface
    AggregatorV3Interface internal priceFeed;

    constructor() {
/** Define the priceFeed
* Network: Rinkeby
    * Aggregator: ETH/USD
      * Address: 0x8A753747A1Fa494EC906cE90E9f37563A8AF630e
      */
        priceFeed = AggregatorV3Interface(
            0x8A753747A1Fa494EC906cE90E9f37563A8AF630e
        );
    } 

// OTHER CONTRACT LOGIC HERE

    /**
    * Returns the latest price and # of decimals to use
    */
    function getLatestPrice() public view returns (int256, uint8) {
// Unused returned values are left out, hence lots of ","s
        (, int256 price, , , ) = priceFeed.latestRoundData();
        uint8 decimals = priceFeed.decimals();
        return (price, decimals);
    }
}

首先,我們導入我們在上面的前端版本中使用的相同聚合器接口。

import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

然後我們需要讓聚合器知道我們感興趣的價格饋送合約的地址。

priceFeed = AggregatorV3Interface(
            0x8A753747A1Fa494EC906cE90E9f37563A8AF630e
        );

在我們的 getLatestPrice() 函數,我們稱 priceFeed.latestRoundData(). priceFeed 引用的是我們在 getETHPrice 上面的實用程序。它返回:

  • roundId: 回合ID。
  • answer: 價格。
  • startedAt:回合開始時的時間戳。
  • updatedAt:更新回合的時間戳。
  • answeredInRound:計算答案的回合的回合ID。

這裡的代碼可能看起來有點奇怪。我們感興趣的唯一值是 answer. 因此,我們不會將其他值分配給變量。將它們關閉可防止存儲未使用的數據。

(, int256 price, , , ) = priceFeed.latestRoundData();

前端的變化

現在該值已包含在您的智能合約中,我們只需要在前端從合約中訪問該值即可。

    async function getETHPrice() {
        let [ethPrice, decimals] = await 
yourAwesomeContract.getLatestPrice();
        ethPrice = Number(ethPrice / Math.pow(10, 
decimals)).toFixed(2);
        return ethPrice;
    }

這將為我們合約的消費者創建一個更簡單的界面,因為他們不需要了解預言機或導入單獨的ABI。

概括

在本技術教程中,我們展示了將Chainlink 數據饋送集成到您的dApp 中是多麼容易,使用戶能夠輕鬆參考美元/ ETH 價格轉換。有大量適用於加密貨幣和法定貨幣的Chainlink 價格饋送,為開發人員提供了使用他們的選擇來調整這些步驟的機會。

通過訪問了解有關Chainlink 的更多信息 鏈環 或閱讀文檔 docs.chain.link. 要討論集成,請聯繫專家。

Source Link

最受歡迎

繼續閱讀

長期持有者持有的比特幣(BTC)供應量達到最高水平

根據Glassnode 的估計,比特幣的長期持有者(LTH)目前擁有1452 萬枚BTC,創歷史新高,只剩下25% 留給短期持...

抓住Web3 遊戲的先發優勢:成功策略

Web3和區塊鏈技術的出現徹底改變了遊戲行業,為開發者和企業家提供了前所未有的機遇。 Web3 遊戲的去中心化性質為創新遊戲貨幣化模式、玩家所有權和社區參與打...

現在讀

$COOKIE, the Cookie3 Mark...

Tallinn, Estonia, March 26th, 2024...

長期持有者持有的比特幣(BTC)供應量達到最高水平...

根據Glassnode 的估計,比特幣的長期持有者(LTH)目前擁有1452 萬枚BTC,創歷史新高,只剩下25% 留給短期持有者和投機者。 儘管BTC 的價格在過去一個月中保持相對平穩,範圍在約29,000 美元至31,000 美元之間,但人們還是開始瘋狂囤積。 ...

Caldera 宣布與Espresso Syste...

Caldera 開發人員可以利用Espresso Sequence...

抓住Web3 遊戲的先發優勢:成功策略

Web3和區塊鏈技術的出現徹底改變了遊戲行業,為開發者和企業家提供了前所未有的機遇。 Web3 遊戲的去中心化性質為創新遊戲貨幣化模式、玩家所有權和社區參與打開了大門。對於那些尋求利用Web3 遊戲巨大潛力的人來說,確保先發優勢至關重要。 了解Web3 遊戲生態系統在深入研究Web3 遊戲之前,有...

Taapsee Pannu 推出NFT 平台,介紹...

企業家貢獻者表達的意見是他們自己的。 您正在閱讀《企業家印度》,這是企業家媒體的國際特許經營刊物。 女演員Taapsee Pannu 最近推出了“taapseeclub.com”,這是她自己的非同質代...

比特幣(BTC) 地址休眠超過11 年,轉移310...

經過11 年多的閒置之後,一個包含3100 萬美元BTC 的休眠比特幣地址最近突然活躍起來。 2023年7月22日,地址 轉入 將其全部餘額轉移到新地址。 早期BTC 地址復活 比特幣自2009 年以來就已經存在,因此存在多年來不活躍的休眠地址,其中包含大量BTC。這種加密貨幣的一些早期採用者能夠...

加密貨幣死了嗎?當今加密貨幣的現狀

您之前可能聽說過加密貨幣正在消亡(或比特幣已消亡)。在這篇文章中,我們將研究加密貨幣的狀態,並嘗試回答這個問題:加密貨幣現在已經死了嗎? 在我們開始之前,我們想澄清一下,本文指的是最廣泛意義上的“加密貨幣行業”; 在裡面 網絡3 感覺。該定義包括加密資產市場; 但它還包括其他非財務用例。 隨著近來加...

Chancer 可能成為體育和社交博彩領域的下一個...

加密貨幣 隨著企業財報季節的繼續,本週股市表現好壞參半。在Ne...

以太坊(ETH) 創下兩個月來CEX 流入最高紀錄...

過去一周,以太坊(ETH)流入中心化交易所(CEX)的資金量創下了過去兩個月來的最高水平。這些重大的資產變動表明ETH 的價格可能會下跌。 CoinGecko 數據顯示,第二大加密貨幣的價格一直在小幅下跌,過去一周價值下跌了2.5%。截至撰寫本文時,以太幣易手價格為1,892.65 美元,過去24...

新的DeFi 法案有“不可行的義務”

加密貨幣創新委員會表示,新的反洗錢法案沒有為DeFi 中的非法金融...

幣安大幅削減成本,瑞波幣為美國銀行和加密貨幣風險投...

美國證券交易委員會(SEC)對加密貨幣公司的打擊似乎嚴重影響了幣安的業務。據報導,在過去幾週內,該加密貨幣交易所解雇了1,000 多名員工,並削減了一些福利。 幣安表示,“當前的市場環境和監管環境”導致利潤下降,這表明可能正在進行更多削減。一位發言人告訴Cointelegraph,該公司將考慮縮減“...

Automata 雙週更新:第48 期| 通過自動...

迎接新的季度意味著設定我們的意圖並為團隊規劃下一步的行動。幕後醞釀的一切——合作、產品功能和營銷發布——很難抑制我們的興奮。我們一開始就在1RPC(2 個備受期待的第2 層主網)上添加了對Linea 和Base 的支持。科技載體更新頁腳以顯示界面版本平滑的用戶體驗 USDC CCTP 支持 關於仲裁...