helius について
Helius の Solana インフラを利用する開発者向けのスキルです。RPC、アセット・トランザクション API、ストリーミング、Webhook、ZK Compression を扱い、オンチェーンデータや取引処理の例を紹介します。
主な機能
- 01Solana RPC エンドポイント
- 02DAS による NFT・トークンメタデータ取得
- 03解析済みトランザクションデータ
- 04LaserStream と WebSocket のリアルタイム配信
- 05ブロックチェーン活動の Webhook
- 06ZK Compression
活用シーン
- 01NFT とトークン資産の照会
- 02アカウント変更のストリーミング
- 03取引やプログラムイベントの通知受信
- 04取引の優先手数料の見積もり
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ raintree-technology/ claude-starter --skill heliusインストール後、Claude Code で/heliusを入力して読み込まれたか確認します。
同梱ファイル.gitignore
詳細
Helius Solana インフラストラクチャのエキスパート
Helius は、高性能な Solana RPC、リアルタイムデータストリーミング、開発者向け API を提供しています。
使用する場面
- Solana RPC インフラストラクチャのセットアップ
- NFT/トークンのメタデータのクエリ(DAS API)
- リアルタイムのブロックチェーンデータ(LaserStream、WebSockets、webhooks)
- トランザクションの最適化と優先手数料
- コスト削減のための ZK Compression
クイックスタート
- API キーを取得します:https://dashboard.helius.dev
- RPC URL を使用します:
https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY
curl https://mainnet.helius-rpc.com/?api-key=YOUR_KEY \
-X POST -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"getBalance","params":["YOUR_WALLET"]}'
主なサービス
RPC エンドポイント
// Mainnet
const RPC_URL = `https://mainnet.helius-rpc.com/?api-key=${API_KEY}`;
// Devnet
const DEVNET_URL = `https://devnet.helius-rpc.com/?api-key=${API_KEY}`;
デジタルアセット標準(DAS)API
NFT とトークンのメタデータをクエリします。通常の NFT と圧縮 NFT の両方に対応しています。
単一アセットの取得:
const response = await fetch(RPC_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'getAsset',
params: { id: 'ASSET_MINT_ADDRESS' }
})
});
オーナー別のアセット取得:
const response = await fetch(RPC_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'getAssetsByOwner',
params: {
ownerAddress: 'WALLET_ADDRESS',
page: 1,
limit: 100
}
})
});
DAS メソッド:
| メソッド | 説明 |
|---|---|
getAsset | 単一アセットのメタデータ |
getAssetBatch | アセットの一括取得 |
getAssetsByOwner | ウォレットのすべてのアセット |
getAssetsByCreator | クリエイター別のアセット |
getAssetsByGroup | コレクション内のアセット |
拡張トランザクション API
人が読みやすい形式で、事前に解析されたトランザクションデータを提供します。
const response = await fetch(RPC_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'getTransactionsForAddress',
params: [
'WALLET_ADDRESS',
{
transactionDetails: 'full',
sortOrder: 'desc',
limit: 10
}
]
})
});
優先手数料 API
トランザクションを迅速に確定させるための最適な優先手数料を取得します。
const response = await fetch(RPC_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'getPriorityFeeEstimate',
params: [{
accountKeys: ['PROGRAM_ID', 'ACCOUNT_1', 'ACCOUNT_2']
}]
})
});
const { priorityFeeEstimate } = await response.json();
// Returns: { low, medium, high, veryHigh } in microlamports
LaserStream(リアルタイム gRPC)
超低レイテンシのブロックチェーンストリーミングです。Yellowstone gRPC のドロップイン置き換えとして利用できます。
import { LaserStream } from '@helius-labs/laserstream';
const stream = new LaserStream({
apiKey: 'YOUR_API_KEY',
region: 'fra' // fra, ams, tyo, sg, ewr, pitt, slc, lax, lon
});
// Subscribe to account changes
stream.subscribeAccount('ACCOUNT_ADDRESS', (update) => {
console.log('Account updated:', update);
});
// Subscribe to program transactions
stream.subscribeProgram('PROGRAM_ID', (tx) => {
console.log('Program transaction:', tx);
});
リージョン: FRA、AMS、TYO、SG、EWR、PITT、SLC、LAX、LON
Webhooks
ブロックチェーン上のアクティビティに応じたイベント駆動型通知です。
// Create webhook via API
const webhook = await fetch('https://api.helius.xyz/v0/webhooks', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${API_KEY}`
},
body: JSON.stringify({
webhookURL: 'https://your-server.com/webhook',
transactionTypes: ['NFT_SALE', 'TOKEN_TRANSFER'],
accountAddresses: ['ADDRESS_TO_WATCH']
})
});
Webhook の種類:
- アカウントの変更
- トランザクションの確認
- プログラムイベント
- NFT アクティビティ
ZK Compression
オンチェーンのストレージコストを最大 98%削減します。
// Get compressed account
const response = await fetch(RPC_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'getCompressedAccount',
params: { address: 'COMPRESSED_ACCOUNT' }
})
});
// Get compressed token balances
const balances = await fetch(RPC_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'getCompressedTokenBalancesByOwner',
params: { owner: 'WALLET_ADDRESS' }
})
});
料金とレート制限
| プラン | 料金 | クレジット | レート制限 | DAS 制限 |
|---|---|---|---|---|
| 無料 | $0/mo | 1M | 10 RPS | 2 RPS |
| Developer | $49/mo | 10M | 50 RPS | 10 RPS |
| Business | $499/mo | 100M | 200 RPS | 50 RPS |
| Professional | $999/mo | 200M | 500 RPS | 100 RPS |
機能の提供状況:
| 機能 | 無料 | Developer | Business | Professional |
|---|---|---|---|---|
| 共有 RPC | はい | はい | はい | はい |
| LaserStream(Devnet) | - | はい | はい | はい |
| LaserStream(Mainnet) | - | - | - | はい |
| 拡張 WebSockets | - | - | はい | はい |
エラー処理
try {
const response = await fetch(RPC_URL, { method: 'POST', ... });
// Check rate limits
const remaining = response.headers.get('X-RateLimit-Remaining');
const reset = response.headers.get('X-RateLimit-Reset');
if (response.status === 429) {
// Rate limited - wait and retry
await new Promise(r => setTimeout(r, 1000));
return retry();
}
const data = await response.json();
if (data.error) {
console.error(`RPC Error ${data.error.code}: ${data.error.message}`);
}
return data.result;
} catch (err) {
// Network error - retry with backoff
}
ベストプラクティス
推奨事項:
- より速い応答には
confirmedコミットメントを使用します - NFT のクエリには DAS API を使用します(生の
getAccountInfoは使用しません) - トランザクションを送信する前にシミュレーションします
- 動的な手数料には
getPriorityFeeEstimateを使用します - レート制限のヘッダーを確認します
非推奨事項:
- リアルタイムデータのポーリング(WebSockets/LaserStream を使用します)
- 優先手数料のハードコード
- レート制限の無視
- トランザクションシミュレーションの省略
よくあるパターン
ウォレットのポートフォリオ
async function getWalletPortfolio(wallet) {
// Get all assets (NFTs + tokens)
const assets = await fetch(RPC_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'getAssetsByOwner',
params: { ownerAddress: wallet, page: 1, limit: 1000 }
})
}).then(r => r.json());
// Get SOL balance
const balance = await fetch(RPC_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'getBalance',
params: [wallet]
})
}).then(r => r.json());
return {
solBalance: balance.result.value / 1e9,
assets: assets.result.items
};
}
優先手数料付きトランザクション
async function sendWithPriorityFee(transaction, accounts) {
// Get priority fee estimate
const feeEstimate = await fetch(RPC_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'getPriorityFeeEstimate',
params: [{ accountKeys: accounts }]
})
}).then(r => r.json());
// Add compute budget instruction with priority fee
const priorityFee = feeEstimate.result.priorityFeeEstimate.high;
// Simulate first
const simulation = await fetch(RPC_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'simulateTransaction',
params: [transaction, { commitment: 'confirmed' }]
})
}).then(r => r.json());
if (simulation.result.err) {
throw new Error(`Simulation failed: ${JSON.stringify(simulation.result.err)}`);
}
// Send transaction
return fetch(RPC_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'sendTransaction',
params: [transaction, { skipPreflight: true }]
})
}).then(r => r.json());
}
リソース
- Helius ドキュメント: https://www.helius.dev/docs
- ダッシュボード: https://dashboard.helius.dev
- Discord: https://discord.gg/helius
ローカルドキュメントの取得
pipx install docpull
docpull https://www.helius.dev/docs -o .claude/skills/helius/docs
コメント
Markdown 対応