在區塊鏈開發加速的當今時代,選擇正確的基礎設施提供商對項目成功至關重要。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
方法需要三個參數:
- blockCount(必需):請求範圍內的區塊數量,可請求 1 到 1024 個區塊
- newestBlock(必需):請求範圍內的最高區塊,格式為十六進制或特殊標籤(
latest
、earliest
等) - rewardPercentiles(必需):請求特定百分位數的獎勵值列表
響應字段解析
響應包含以下關鍵字段:
- oldestBlock:返回範圍內最早區塊的編號(十六進制)
- baseFeePerGas:每個區塊的基本費用數組(十六進制)
- gasUsedRatio:每個區塊的 gas 使用率(0-1 之間的小數)
- reward:每個區塊按百分位的有效優先費用數組
- baseFeePerBlobGas:Blob 交易的基本費用(EIP-4844 相關)
- 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 都能提供穩定、高性能的基礎設施支持,幫助您的項目取得成功。
參考資源
- QuickNode 官方文檔:https://www.quicknode.com/docs
- eth_feeHistory 方法文檔:https://www.quicknode.com/docs/ethereum/eth_feeHistory