quicknode について
Quicknodeは、ブロックチェーンアプリ開発者向けにSolana RPC、アセット照会、リアルタイムストリーム、データパイプラインを提供します。80以上のネットワークにも対応しています。
主な機能
- 01Solana RPCとWebSocketエンドポイント
- 02DASデジタルアセット照会API
- 03Yellowstone gRPCリアルタイムデータストリーム
- 04Streamsのフィルタリングと配信パイプライン
- 05オンチェーンイベントのWebhook通知
- 06エンドポイント管理と使用量API
活用シーン
- 01NFT、トークン、圧縮NFTアセットの照会
- 02アカウント、トランザクション、ブロックのリアルタイム監視
- 03オンチェーンのインデックス作成と分析パイプライン構築
- 04チェーンイベントに応じたアプリ通知
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ sendaifun/ skills --skill quicknodeインストール後、Claude Code で/quicknodeを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
docs/troubleshooting.mdexamples/basic-rpc/README.mdexamples/das-api/README.mdexamples/streaming/README.mdexamples/streams-webhooks/README.mdresources/das-api-reference.mdmarketplace-addons.mdrpc-reference.mdstreams-reference.mdwebhooks-reference.mdyellowstone-grpc-reference.mdtemplates/quicknode-setup.ts詳細
Quicknode Solana インフラストラクチャ
Quicknode を使って、高性能な Solana アプリケーションを構築しましょう。Quicknode は、低レイテンシの RPC エンドポイント、DAS API、Yellowstone gRPC ストリーミング、リアルタイムデータパイプライン、開発者を第一に考えた API を提供する、80 以上のチェーンに対応したブロックチェーンインフラストラクチャプロバイダーです。
概要
Quicknode が提供する機能:
- RPC エンドポイント:URL に認証情報が埋め込まれた、低レイテンシの Solana アクセス
- DAS API:NFT とトークンを統一的にクエリ。標準 NFT、圧縮 NFT(cNFT)、代替可能トークン、MPL Core Assets、Token 2022 に対応
- Yellowstone gRPC:Geyser プラグイン経由のリアルタイム Solana データストリーミング
- 優先手数料 API:トランザクションの着地に必要な手数料を推定
- Streams:JavaScript フィルタリングに対応したリアルタイムおよび履歴データのパイプライン
- Webhooks:イベント駆動型のブロックチェーン通知
- Metis:Jupiter Swap API との統合
- IPFS:分散型ファイルストレージ
- Key-Value Store:Streams のサーバーレス状態永続化
- Admin API:プログラムからのエンドポイント管理
- x402:USDC マイクロペイメントによる従量課金型 RPC(API キー不要)
- マルチチェーン:Ethereum、Polygon、Arbitrum、Base、BSC、Avalanche、Bitcoin など、80 以上のネットワーク
クイックスタート
エンドポイントを取得する
- quicknode.com/endpoints にアクセスします
- Solana とネットワーク(Mainnet / Devnet)を選択します
- エンドポイントを作成します
- HTTP URL と WSS URL をコピーします
環境設定
# .env file
QUICKNODE_RPC_URL=https://your-endpoint.solana-mainnet.quiknode.pro/your-token/
QUICKNODE_WSS_URL=wss://your-endpoint.solana-mainnet.quiknode.pro/your-token/
QUICKNODE_API_KEY=your_console_api_key # Optional: for Admin API
@solana/kit を使った基本設定
import { createSolanaRpc, createSolanaRpcSubscriptions } from "@solana/kit";
const rpc = createSolanaRpc(process.env.QUICKNODE_RPC_URL!);
const rpcSubscriptions = createSolanaRpcSubscriptions(process.env.QUICKNODE_WSS_URL!);
// Make RPC calls
const slot = await rpc.getSlot().send();
const balance = await rpc.getBalance(address).send();
認証
Quicknode エンドポイントでは、URL に認証情報が含まれています:
https://{ENDPOINT_NAME}.solana-mainnet.quiknode.pro/{TOKEN}/
セキュリティをさらに強化するには、Quicknode ダッシュボードで JWT 認証または IP 許可リストを有効にしてください。
RPC エンドポイント
Solana エンドポイント
| ネットワーク | URL パターン |
|---|---|
| Mainnet | https://{name}.solana-mainnet.quiknode.pro/{token}/ |
| Devnet | https://{name}.solana-devnet.quiknode.pro/{token}/ |
| WebSocket | wss://{name}.solana-mainnet.quiknode.pro/{token}/ |
@solana/kit での使用
import {
createSolanaRpc,
createSolanaRpcSubscriptions,
address,
lamports,
} from "@solana/kit";
const rpc = createSolanaRpc(process.env.QUICKNODE_RPC_URL!);
const rpcSubscriptions = createSolanaRpcSubscriptions(process.env.QUICKNODE_WSS_URL!);
// Account balance
const balance = await rpc.getBalance(address("E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk")).send();
// Account info
const accountInfo = await rpc.getAccountInfo(address("E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk"), {
encoding: "base64",
}).send();
// Recent blockhash
const { value: blockhash } = await rpc.getLatestBlockhash().send();
// Token accounts
const tokenAccounts = await rpc.getTokenAccountsByOwner(
address("E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk"),
{ programId: address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA") },
{ encoding: "jsonParsed" },
).send();
レガシー web3.js での使用
import { Connection, PublicKey } from "@solana/web3.js";
const connection = new Connection(process.env.QUICKNODE_RPC_URL!);
const balance = await connection.getBalance(new PublicKey("E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk"));
レート制限とプラン
| プラン | リクエスト/秒 | クレジット/月 |
|---|---|---|
| 無料トライアル | 15 | 10M |
| Build | 50 | 80M |
| Accelerate | 125 | 450M |
| Scale | 250 | 950M |
| Business | 500 | 2B |
DAS API(Digital Asset Standard)
Solana のデジタルアセット(標準 NFT、圧縮 NFT(cNFT)、代替可能トークン、MPL Core Assets、Token 2022 Assets)をクエリするための包括的な API です。Marketplace アドオン(Metaplex DAS API)として利用できます。
オーナー別にアセットを取得する
const response = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "getAssetsByOwner",
params: {
ownerAddress: "E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk",
limit: 10,
options: { showFungible: true, showCollectionMetadata: true },
},
}),
});
const { result } = await response.json();
// result.total — total assets
// result.items — array of asset metadata
// result.cursor — for pagination
アセットを検索する
const response = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "searchAssets",
params: {
ownerAddress: "E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk",
tokenType: "fungible",
limit: 50,
},
}),
});
アセットの証明を取得する(圧縮 NFT)
const response = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "getAssetProof",
params: { id: "compressed_nft_id" },
}),
});
DAS メソッドリファレンス
| メソッド | 説明 |
|---|---|
getAsset | 単一のアセットのメタデータを取得 |
getAssets | 複数のアセットのメタデータを取得 |
getAssetProof | 圧縮アセットの Merkle 証明を取得 |
getAssetProofs | 複数のアセットの Merkle 証明を取得 |
getAssetsByAuthority | authority 別にアセットを一覧表示 |
getAssetsByCreator | 作成者別にアセットを一覧表示 |
getAssetsByGroup | グループ(例:コレクション)別にアセットを一覧表示 |
getAssetsByOwner | ウォレットのオーナー別にアセットを一覧表示 |
getAssetSignatures | 圧縮アセットのトランザクション署名 |
getTokenAccounts | mint またはオーナー別にトークンアカウントを取得 |
getNftEditions | マスター NFT のエディション詳細 |
searchAssets | 柔軟なフィルターでアセットを検索 |
Yellowstone gRPC(Solana Geyser)
gRPC 経由でリアルタイムのブロックチェーンデータをストリーミングする、高性能な Solana Geyser プラグインです。Marketplace アドオンとして利用できます。
セットアップ
import Client, { CommitmentLevel } from "@triton-one/yellowstone-grpc";
// Derive gRPC URL from HTTP endpoint:
// HTTP: https://example.solana-mainnet.quiknode.pro/TOKEN/
// gRPC: https://example.solana-mainnet.quiknode.pro:10000
const client = new Client(
"https://example.solana-mainnet.quiknode.pro:10000",
"TOKEN",
{}
);
const stream = await client.subscribe();
stream.on("data", (data) => {
if (data.transaction) {
console.log("Transaction:", data.transaction);
}
if (data.account) {
console.log("Account update:", data.account);
}
});
// Subscribe to transactions for a specific program
stream.write({
transactions: {
txn_filter: {
vote: false,
failed: false,
accountInclude: ["PROGRAM_PUBKEY"],
accountExclude: [],
accountRequired: [],
},
},
accounts: {},
slots: {},
blocks: {},
blocksMeta: {},
transactionsStatus: {},
entry: {},
accountsDataSlice: [],
commitment: CommitmentLevel.CONFIRMED,
});
フィルターの種類
| フィルター | 説明 |
|---|---|
| accounts | pubkey、owner、またはデータパターンによるアカウントデータの変更 |
| transactions | vote/failure/account フィルターを使用したトランザクションイベント |
| transactionsStatus | 軽量なトランザクションステータス更新 |
| slots | スロットの進行状況とステータスの変更 |
| blocks | オプションでトランザクションやアカウントを含められる完全なブロックデータ |
| blocksMeta | 完全な内容を含まないブロックメタデータ |
| entry | PoH エントリーの更新 |
gRPC のベストプラクティス
- gRPC 接続にはポート 10000 を使用します
- ほとんどの用途ではコミットメントを CONFIRMED に設定し、不可逆性が必要な場合は FINALIZED に設定します
- 帯域幅を削減するため、zstd 圧縮を有効にします
- 接続を維持するため、10 秒ごとにキープアライブ ping を送信します
- 指数バックオフを使った再接続ロジックを実装します
- データ量を最小限に抑えるため、絞り込んだフィルター(特定のアカウントやプログラム)を使用します
優先手数料 API
トランザクションを最適に取り込むための優先手数料を見積もります。
// Get recommended priority fees
const response = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
method: "qn_estimatePriorityFees",
params: {
last_n_blocks: 100,
account: "YOUR_ACCOUNT_PUBKEY",
},
}),
});
トランザクションでの優先手数料の使用
import {
pipe,
createTransactionMessage,
setTransactionMessageFeePayer,
setTransactionMessageLifetimeUsingBlockhash,
prependTransactionMessageInstructions,
appendTransactionMessageInstruction,
} from "@solana/kit";
import {
getSetComputeUnitLimitInstruction,
getSetComputeUnitPriceInstruction,
} from "@solana-program/compute-budget";
// 1. Get fee estimate
const feeResponse = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
method: "qn_estimatePriorityFees",
params: { last_n_blocks: 100, account: payer.address },
}),
});
const feeData = await feeResponse.json();
const priorityFee = feeData.result.per_compute_unit.high;
// 2. Build transaction with compute budget
const tx = pipe(
createTransactionMessage({ version: 0 }),
(tx) => setTransactionMessageFeePayer(payer.address, tx),
(tx) => setTransactionMessageLifetimeUsingBlockhash(blockhash, tx),
(tx) => prependTransactionMessageInstructions([
getSetComputeUnitLimitInstruction({ units: 200_000 }),
getSetComputeUnitPriceInstruction({ microLamports: BigInt(priorityFee) }),
], tx),
(tx) => appendTransactionMessageInstruction(mainInstruction, tx),
);
Metis — Jupiter Swap API
DEX アグリゲーション向けの Quicknode ホスト版 Jupiter Swap API です。Marketplace のアドオンとして利用できます。
import { createJupiterApiClient } from "@jup-ag/api";
const jupiterApi = createJupiterApiClient({
basePath: process.env.QUICKNODE_METIS_URL!,
});
// Get swap quote
const quote = await jupiterApi.quoteGet({
inputMint: "So11111111111111111111111111111111111111112", // SOL
outputMint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", // USDC
amount: 1_000_000_000, // 1 SOL
slippageBps: 50,
});
// Get swap transaction
const swapResult = await jupiterApi.swapPost({
swapRequest: {
quoteResponse: quote,
userPublicKey: "YourPubkey...",
},
});
Streams
ブロックチェーンデータをリアルタイムおよび履歴から取得し、フィルタリング、変換して配信先に届けるデータパイプラインです。
ストリームの種類
| 種類 | データ | 用途 |
|---|---|---|
| Block | 完全なブロックデータ | ブロックエクスプローラー、分析 |
| Transaction | トランザクションの詳細 | トランザクションの監視、インデックス作成 |
| Logs | コントラクトイベント | DeFi の追跡、トークンの転送 |
| Receipt | トランザクションレシート | ステータスの追跡 |
セットアップ
- Quicknode ダッシュボードでストリームを作成します
- Solana とデータタイプを選択します
- フィルター関数(JavaScript)を追加します
- 配信先(webhook、S3、PostgreSQL、Azure)を設定します
フィルター関数の例
function main(data) {
// Filter for transactions involving a specific program
const PROGRAM_ID = "YOUR_PROGRAM_ID";
const hasProgram = data.transaction?.message?.accountKeys?.some(
(key) => key === PROGRAM_ID
);
if (!hasProgram) return null;
return data;
}
Streams と Webhooks の比較
| 機能 | Streams | Webhooks |
|---|---|---|
| 複雑さ | 設定項目が多い | 簡単にセットアップ可能 |
| フィルタリング | カスタム JavaScript | テンプレートベース |
| 配信先 | Webhook、S3、Postgres、Azure、Snowflake | HTTP エンドポイントのみ |
| 処理 | 完全な変換 | 限定的 |
| 用途 | 複雑なパイプライン | シンプルなアラート |
Webhooks
Solana ブロックチェーンのアクティビティに関するイベント駆動型通知です。
Webhook のセットアップ
Quicknode ダッシュボードまたは Admin API を使用して Webhook を作成すると、特定のオンチェーンイベントの発生時に通知を受け取れます。
API の例と設定については、resources/webhooks-reference.md を参照してください。
IPFS ストレージ
Quicknode の IPFS ゲートウェイを介した分散型ファイルストレージです。
// Upload file to IPFS
const formData = new FormData();
formData.append("file", fileBuffer);
const response = await fetch("https://api.quicknode.com/ipfs/rest/v1/s3/put-object", {
method: "POST",
headers: { "x-api-key": process.env.QUICKNODE_API_KEY! },
body: formData,
});
const { pin } = await response.json();
// Access via: https://quicknode.quicknode-ipfs.com/ipfs/{pin.cid}
一般的な用途
- NFT メタデータの保存
- コレクション用アセットのホスティング
- 分散型コンテンツの永続化
キー値ストア
リストとキー値セット向けのサーバーレスストレージです。qnLib ヘルパーライブラリを介して Streams のフィルター関数からアクセスできます。
ストリームとの統合(qnLib)
// In a Streams filter function:
// List operations — manage address watchlists
await qnLib.qnAddListItem("my-watchlist", "E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk");
const isWatched = await qnLib.qnContainsListItems("my-watchlist", [data.from]);
// Set operations — store key-value pairs
await qnLib.qnAddSet("token-prices", { key: "SOL", value: "150.25" });
const price = await qnLib.qnGetSet("token-prices", "SOL");
リスト操作
qnLib.qnUpsertList— リストを作成または更新しますqnLib.qnAddListItem— リストに項目を追加しますqnLib.qnRemoveListItem— リストから項目を削除しますqnLib.qnContainsListItems— 複数項目の一括メンバーシップ確認を行いますqnLib.qnDeleteList— リストを削除します
セット操作
qnLib.qnAddSet— キー値セットを作成しますqnLib.qnGetSet— キーで値を取得しますqnLib.qnBulkSets— セットを一括で作成または削除しますqnLib.qnDeleteSet— セットを削除します
Quicknode SDK
Quicknode サービス向けの公式 JavaScript/TypeScript SDK です。
npm install @quicknode/sdk
import { Core } from "@quicknode/sdk";
const core = new Core({
endpointUrl: process.env.QUICKNODE_RPC_URL!,
});
// Token API
const balances = await core.client.qn_getWalletTokenBalance({
wallet: "E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk",
});
// NFT API
const nfts = await core.client.qn_fetchNFTs({
wallet: "E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk",
page: 1,
perPage: 10,
});
Admin API
Quicknode エンドポイント、使用状況、レート制限、セキュリティ、請求をプログラムから管理するための REST API です。
認証
すべての Admin API リクエストでは、https://api.quicknode.com/v0/ に対して x-api-key ヘッダーを使用します。
const QN_API_KEY = process.env.QUICKNODE_API_KEY!;
// List all endpoints
const res = await fetch("https://api.quicknode.com/v0/endpoints", {
headers: { "x-api-key": QN_API_KEY },
});
const endpoints = await res.json();
// Get usage metrics
const usage = await fetch("https://api.quicknode.com/v0/usage/rpc", {
headers: { "x-api-key": QN_API_KEY },
});
クイックリファレンス
| リソース | メソッド | エンドポイント |
|---|---|---|
| チェーン | GET | /v0/chains |
| エンドポイント | GET, POST, PATCH, DELETE | /v0/endpoints |
| メトリクス | GET | /v0/endpoints/{id}/metrics |
| レート制限 | GET, POST, PUT | /v0/endpoints/{id}/rate-limits |
| 使用状況 | GET | /v0/usage/rpc |
| 請求 | GET | /v0/billing/invoices |
x402(リクエストごとの支払いによる RPC)
Base 上で USDC のマイクロペイメントを利用した、リクエストごとの支払いによる RPC アクセスです。API キーは不要です。
import { wrapFetch } from "@x402/fetch";
import { createWalletClient, http } from "viem";
import { privateKeyToAccount } from "viem/accounts";
import { base } from "viem/chains";
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);
const walletClient = createWalletClient({
account,
chain: base,
transport: http(),
});
// Wrap fetch to auto-handle 402 payments
const x402Fetch = wrapFetch(fetch, walletClient);
// Use like normal fetch — payments handled automatically
const response = await x402Fetch("https://x402.quicknode.com/solana-mainnet", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
method: "getSlot",
params: [],
id: 1,
}),
});
マルチチェーン対応
Quicknode は Solana 以外にも 80 以上のブロックチェーンネットワークに対応しています。
| カテゴリ | ネットワーク |
|---|---|
| EVM | Ethereum, Polygon, Arbitrum, Optimism, Base, BSC, Avalanche, Fantom, zkSync, Scroll, Linea, HyperEVM |
| 非 EVM | Solana, Bitcoin, NEAR, Stacks, Cosmos, Sei, Aptos, Sui, TON, Hyperliquid |
全リスト:quicknode.com/chains
マルチチェーンのセットアップ
import { Core } from "@quicknode/sdk";
const chains = {
solana: new Core({ endpointUrl: process.env.QUICKNODE_SOL_RPC! }),
ethereum: new Core({ endpointUrl: process.env.QUICKNODE_ETH_RPC! }),
polygon: new Core({ endpointUrl: process.env.QUICKNODE_POLYGON_RPC! }),
};
安全なデフォルト設定
- ネットワークが指定されていない場合は、デフォルトで devnet を使用します
- リソースを作成する前に、読み取り専用の操作とドライランを優先します
- 秘密鍵やシークレットキーを尋ねたり、受け取ったりしないでください
- Streams、Webhooks、または IPFS アップロードを作成する前に、明示的な確認を求めます
エラー処理
try {
const response = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "getSlot", params: [] }),
});
if (!response.ok) {
if (response.status === 401) console.error("Invalid endpoint URL or token");
if (response.status === 429) console.error("Rate limited — upgrade plan or reduce requests");
if (response.status >= 500) console.error("Server error — retry with backoff");
}
} catch (error) {
console.error("Network error:", error);
}
一般的なエラーコード
| コード | 意味 | 解決策 |
|---|---|---|
| 401 | 認証が無効です | エンドポイント URL とトークンを確認してください |
| 429 | レート制限に達しました | プランをアップグレードするか、遅延を追加してください |
| 500+ | サーバーエラー | 指数バックオフを使用して再試行してください |
ベストプラクティス
API キーのセキュリティ
- エンドポイント URL や API キーを git にコミットしないでください
- 環境変数を使用してください
- 本番環境では IP 許可リストを有効にしてください
- 機密性の高い操作には JWT 認証を使用してください
- 認証情報を定期的にローテーションしてください
パフォーマンス
- リアルタイムデータには WebSocket サブスクリプションを使用してください
- RPC リクエストをバッチ処理して API 呼び出しを減らしてください
- データが頻繁に変化しない場合は、レスポンスをキャッシュしてください
- 最低レイテンシのストリーミングには Yellowstone gRPC を使用してください
- 適切なコミットメントレベルを設定してください(ほとんどの場合は
confirmed、不可逆性が必要な場合はfinalized)
信頼性
- 指数バックオフを使用した再試行ロジックを実装してください
- バックオフを用いてレート制限を適切に処理してください
- 信頼性の高いイベント処理には Streams を使用してください(自動再試行)
- Admin API のメトリクスを通じてエンドポイントの健全性を監視してください
リソース
- Quicknode ドキュメント
- Solana 専用ドキュメント
- DAS API リファレンス
- Yellowstone gRPC
- Streams ドキュメント
- Quicknode SDK
- Admin API
- Key-Value Store
- x402
- LLM 向けに最適化されたドキュメント(llms.txt)
- ガイド
- マーケットプレイス
- サンプルアプリ
- ガイドのサンプルリポジトリ
スキルの構成
quicknode/
├── SKILL.md # This file
├── resources/
│ ├── rpc-reference.md # RPC methods and WebSocket patterns
│ ├── das-api-reference.md # DAS API methods and parameters
│ ├── yellowstone-grpc-reference.md # gRPC streaming reference
│ ├── streams-reference.md # Streams filter functions and destinations
│ ├── webhooks-reference.md # Webhook configuration
│ └── marketplace-addons.md # Token API, NFT API, Metis, Priority Fees
├── examples/
│ ├── basic-rpc/ # Basic RPC calls
│ ├── das-api/ # DAS API queries
│ ├── streaming/ # Yellowstone gRPC examples
│ └── streams-webhooks/ # Streams and webhook setup
├── templates/
│ └── quicknode-setup.ts # Starter template
└── docs/
└── troubleshooting.md # Common issues and solutions