QuickNode:Web3 基礎設施的高性能解決方案

QuickNode:Web3 基礎設施的高性能解決方案
作者: Calpa Liu
字數:1542
出版:2025年3月26日
分類: Web3 TypeScript QuickNode

在區塊鏈開發加速的當今時代,選擇正確的基礎設施提供商對項目成功至關重要。QuickNode 為開發者提供高性能節點和 API 服務,使構建 dApp 變得更加簡單高效。本文將探討 QuickNode 的優勢,並詳細介紹如何使用 TypeScript 通過 QuickNode API 獲取以太坊的費用歷史數據。

QuickNode 的核心優勢

全球分佈的區塊鏈基礎設施

與僅限於單一區域的提供商不同,QuickNode 在 14 多個區域和 5 多個獨特的雲和金屬提供商上運營。QuickNode 還採用智能路由層,將請求路由到最近位置,這種分佈式架構顯著減少了網絡延遲——例如,將 600 毫秒的響應降低到 100 毫秒,確保 dApp 保持高響應性,提升用戶體驗。

此外,這種多家庭、冗餘的網絡設計大幅提高了可靠性。在檢測到性能問題後的幾秒鐘內,系統能夠將流量重新路由到不同提供商或區域,最大化正常運行時間。

多客戶端實現

QuickNode 採用多客戶端運營模式。以以太坊為例,它有多個節點客戶端 (Geth、Erigon、Besu、Nethermind 等),每個都有獨特優勢。

與限制用戶使用單一客戶端不同,QuickNode 為用戶提供多客戶端設置的優勢。這使開發者能夠根據特定需求選擇最合適的客戶端,充分利用各種實現的特點。

其他關鍵優勢

  • 實時數據和監控:提供實時區塊鏈數據、交易監控和地址追蹤功能
  • 智能合約分析:支持智能合約和代幣分析工具
  • 多鏈支持:覆蓋 30 多個區塊鏈平台,包括 Ethereum、Avalanche、Solana 等
  • 可擴展性:基礎設施允許無限擴展,確保在高需求期間平穩運行
  • 開發者工具:提供全面的開發者工具集,簡化 Web3 應用開發

使用 TypeScript 和 QuickNode API 獲取 ETH 費用歷史

在以太坊開發中,了解 gas 費用的歷史趨勢對優化交易非常重要。下面我們將使用 TypeScript 通過 QuickNode API 獲取以太坊的費用歷史。

設置環境

首先,我們需要創建一個專案並安裝必要的依賴:

mkdir eth-gas-tracker
cd eth-gas-tracker
npm init -y
npm install --save-dev typescript ts-node @types/node
npm install axios dotenv

接著,創建.env文件存儲 QuickNode API 端點:

QUICKNODE_HTTP_URL=https://your-endpoint-name.quiknode.pro/your-auth-token/

使用.env文件是 TypeScript 開發的最佳實踐,它使我們能夠安全管理敏感信息如 API 密鑰。

定義類型

為了確保類型安全,我們需要定義eth_feeHistory請求和響應的介面:

// types.ts
// eth_feeHistory 請求類型
interface FeeHistoryRequest {
  method: string;
  params: [string | number, string, number[]];
  id: number;
  jsonrpc: string;
}

// eth_feeHistory 響應類型
interface FeeHistoryResponse {
  jsonrpc: string;
  id: number;
  result: {
    oldestBlock: string;
    reward: string[][];
    baseFeePerGas: string[];
    gasUsedRatio: number[];
    baseFeePerBlobGas?: string[];
    blobGasUsedRatio?: number[];
  };
}

實現 API 調用

下面是使用 TypeScript 實現 QuickNode API 調用獲取費用歷史的代碼:

// getFeeHistory.ts
import axios from "axios";
import * as dotenv from "dotenv";

// 加載環境變量
dotenv.config();

// 獲取 QuickNode HTTP URL
const QUICKNODE_HTTP_URL = process.env.QUICKNODE_HTTP_URL;

if (!QUICKNODE_HTTP_URL) {
  throw new Error("QUICKNODE_HTTP_URL is not defined in .env file");
}

// 創建 API 調用函數
async function getFeeHistory(
  blockCount: number,
  newestBlock: string,
  rewardPercentiles: number[]
): Promise {
  try {
    // 創建請求數據
    const requestData: FeeHistoryRequest = {
      method: "eth_feeHistory",
      params: [blockCount, newestBlock, rewardPercentiles],
      id: 1,
      jsonrpc: "2.0",
    };

    // 發送 HTTP POST 請求到 QuickNode API 端點
    const response = await axios.post(QUICKNODE_HTTP_URL, requestData, {
      headers: {
        "Content-Type": "application/json",
      },
    });

    return response.data;
  } catch (error) {
    console.error("獲取費用歷史時出錯:", error);
    throw error;
  }
}

export default getFeeHistory;

調用示例及分析響應

// main.ts
import getFeeHistory from "./getFeeHistory";

async function main() {
  try {
    // 獲取最近 5 個區塊的費用歷史,包括第 10、50、90 百分位的獎勵
    const feeHistory = await getFeeHistory(5, "latest", [10, 50, 90]);

    console.log("費用歷史結果:");
    console.log(JSON.stringify(feeHistory, null, 2));

    // 分析回應數據
    console.log("最舊區塊:", feeHistory.result.oldestBlock);
    console.log(
      "Base Fee 變化:",
      feeHistory.result.baseFeePerGas.map((fee) => parseInt(fee, 16))
    );
    console.log("Gas 使用率:", feeHistory.result.gasUsedRatio);

    // 分析獎勵數據
    console.log("各百分位獎勵:");
    feeHistory.result.reward.forEach((blockRewards, index) => {
      console.log(`區塊 ${index} 獎勵:`);
      blockRewards.forEach((reward, percentileIndex) => {
        const percentile = [10, 50, 90][percentileIndex];
        console.log(`  ${percentile}%: ${parseInt(reward, 16)} wei`);
      });
    });
  } catch (error) {
    console.error("執行失敗:", error);
  }
}

main();

響應示例

執行上述代碼後,您將獲得類似以下的 JSON 回應:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "oldestBlock": "0x151ab15",
    "reward": [
      ["0xd1e037", "0x5f5e100", "0x1dcd6500"],
      ["0x989680", "0x193d92cc", "0xb05c8c44"],
      ["0x989680", "0x4b571c0", "0x1dcd6500"],
      ["0xa7d8c0", "0xecef4fb", "0x3b9aca00"],
      ["0x989680", "0xc5dd80b", "0x2dad59a4"]
    ],
    "baseFeePerGas": [
      "0x165c9395",
      "0x17d2efc0",
      "0x17e816d1",
      "0x1652d34f",
      "0x17656df5",
      "0x16db3e53"
    ],
    "gasUsedRatio": [
      0.7615809241983782, 0.5138729692943922, 0.2351256063675857,
      0.6922047026967882, 0.4077133611111111
    ],
    "baseFeePerBlobGas": ["0x1", "0x1", "0x1", "0x1", "0x1", "0x1"],
    "blobGasUsedRatio": [1, 0, 0.16666666666666666, 0, 0.3333333333333333]
  }
}

了解 eth_feeHistory 參數和響應

參數說明

eth_feeHistory方法需要三個參數:

  1. blockCount(必需):請求範圍內的區塊數量,可請求 1 到 1024 個區塊
  2. newestBlock(必需):請求範圍內的最高區塊,格式為十六進制或特殊標籤(latestearliest等)
  3. rewardPercentiles(必需):請求特定百分位數的獎勵值列表

響應字段解析

響應包含以下關鍵字段:

  1. oldestBlock:返回範圍內最早區塊的編號(十六進制)
  2. baseFeePerGas:每個區塊的基本費用數組(十六進制)
  3. gasUsedRatio:每個區塊的 gas 使用率(0-1 之間的小數)
  4. reward:每個區塊按百分位的有效優先費用數組
  5. baseFeePerBlobGas:Blob 交易的基本費用(EIP-4844 相關)
  6. blobGasUsedRatio:Blob gas 的使用率

使用 QuickNode SDK 的替代方法

除了直接使用 HTTP API 外,QuickNode 還提供 SDK 支持多種語言。對於 TypeScript 開發者,可以使用 QuickNode SDK 簡化 API 調用:

npm install @quicknode/sdk

然後我們可以使用 QuickNode SDK 調用 eth_feeHistory 方法:

import { Core } from "@quicknode/sdk";

const core = new Core({
  endpointUrl: process.env.QUICKNODE_HTTP_URL,
});

// 直接調用 RPC 方法
core.client
  .request({
    method: "eth_feeHistory",
    params: [5, "latest", [10, 50, 90]],
  })
  .then((feeHistory) => console.log(feeHistory));

結論

QuickNode 作為領先的 Web3 基礎設施提供商,通過全球分佈式架構、多客戶端支持和強大的 API 服務,為區塊鏈開發者提供了重要的競爭優勢。使用 TypeScript 和 QuickNode API 獲取以太坊費用歷史等數據,開發者可以構建更智能、更高效的去中心化應用程序。

採用.env文件管理 API 端點和密鑰是 TypeScript 開發的最佳實踐,它不僅提升了代碼的安全性,還增強了項目的可移植性和可維護性。無論您是構建 DeFi 應用、NFT 平台還是其他 Web3 解決方案,QuickNode 都能提供穩定、高性能的基礎設施支持,幫助您的項目取得成功。

參考資源

感謝您閱讀我的文章。歡迎隨時分享你的想法。
關於 Calpa

Calpa 擅長使用 TypeScriptReact.jsVue.js 建立 Responsive Website。

他積極參與開源社區,曾在 2019 年的香港開源大會上擔任講者,提供工作經驗和見解。此外,他也在 GitHub 上公開分享個人博客程式碼,已獲得超過 300 顆星星和 60 個分支的支持。

他熱愛學習新技術,並樂意分享經驗。他相信,唯有不斷學習才能跟上快速演變的技術環境。