400ミリ秒のファイナリティで毎秒65,000トランザクションを処理できるブロックチェーンアプリケーションを構築できるとしたらどうでしょう?SolanaのAPIはこれを可能にし、バリデータインフラストラクチャを自分で管理することなく、アカウントのクエリ、トランザクションの送信、リアルタイム更新の購読を可能にするJSON-RPCインターフェースを提供します。
従来のブロックチェーン開発では、速度と分散化のどちらかを選択する必要がありました。Ethereumの15 TPSは、ネットワークが混雑するとボトルネックを生み出します。レイヤー2ソリューションは複雑さを増します。Solanaは、Proof-of-HistoryコンセンサスとProof-of-Stakeを組み合わせることでこのトレードオフを解消し、Web3の保証を備えたWeb2のパフォーマンスを提供します。これにより、検閲耐性を維持しながら、瞬時に感じられるアプリケーションを構築できます。
目次:
- Solanaのアーキテクチャを理解する
- 開発環境のセットアップ
- コアRPC APIメソッド
- Web3.jsでトランザクションを構築する
- ベストセキュリティプラクティス
- 結論
Solanaのアーキテクチャを理解する
Solanaは、Solana Program Library(SPL)と高スループットのランタイムを中心とした独自のアーキテクチャを使用しています。これらの基本を理解することは、効率的なAPIコールを記述するのに役立ちます。
Proof of History (PoH)
PoHは、コンセンサス前にすべてのトランザクションに対して暗号化されたタイムスタンプを作成します。これにより、ノードが時刻について合意する必要がなくなり、レイテンシが劇的に短縮されます。API経由でトランザクションを送信すると、すぐにタイムスタンプが付与され、処理のためにリーダーのキューに入ります。
アカウントとプログラム
コードストレージを持つEthereumのアカウントベースモデルとは異なり、Solanaはコード(プログラム)とデータ(アカウント)を分離しています。プログラムはステートレスであり、実行可能なロジックのみを含みます。アカウントはデータを保存し、どのプログラムがそれらを所有しているかを指定します。このアーキテクチャにより、重複しないアカウントが同時に実行できるため、並行トランザクション処理が可能になります。
すべてのアカウントは、Ed25519公開鍵から派生した一意の32バイトアドレスを持ちます。アカウントはオンチェーンに留まるために、ランプポート(1 SOL = 10^9ランプポート)で家賃を支払います。家賃免除アカウント(少なくとも2年分の家賃を保持しているアカウント)は、減衰することなく無期限に存続します。
コミットメントレベル
Solanaは3つの確認レベルを提供します。
- Processed(処理済み): 現在のリーダーによって処理されたが、まだ確認されていないトランザクション。最速の応答、最も低い確実性。
- Confirmed(確認済み): クラスターによって確認されたトランザクション。平均約5〜10秒。
- Finalized(最終確定済み): トランザクションがルート化され、ロールバックできない状態。約12〜15秒。
ファイナリティ保証と速度のバランスを取るために、APIコールでコミットメントレベルを指定します。

開発環境のセットアップ
キー管理とデプロイのためのSolana CLI、ブロックチェーンアクセス用のRPCエンドポイント、アプリケーション統合用のJavaScript SDKという3つのコンポーネントが必要です。
Solana CLIのインストール
公式CLIツールをインストールします。
sh -c "$(curl -sSfL https://release.solana.com/stable/install)"
インストールを確認します。
solana --version
Devnet(テスト用)またはMainnet(本番用)用に環境を設定します。
# 開発用
solana config set --url https://api.devnet.solana.com
# 本番用
solana config set --url https://api.mainnet-beta.solana.com
ウォレットの作成
トランザクション署名用の新しいキーペアを生成します。
solana-keygen new --outfile ~/.config/solana/id.json
CLIは、公開アドレスと12単語のシードフレーズを出力します。ウォレットを復元するためにシードフレーズを安全に保管してください。JSONファイルには秘密鍵が含まれています。ファイル権限(chmod 600)で保護してください。
残高を確認します。
solana balance
Devnetウォレットに無料のSOLを供給します。
solana airdrop 2
Devnetのエアドロップは、リクエストごとに2 SOLを提供し、10秒ごとに1リクエストに制限されています。Mainnetでは、取引所を通じてSOLを購入する必要があります。
RPCプロバイダーの選択
Solanaは公開のRPCエンドポイントを提供していますが、本番アプリケーションには専用のインフラストラクチャが必要です。オプションには以下が含まれます。
- Helius:
https://mainnet.helius-rpc.com/?api-key=YOUR_KEY - QuickNode:
https://solana-mainnet.g.alchemy.com/v2/YOUR_KEY - Chainstack: エンタープライズグレードの専用ノード
無料ティアは通常、月間100,000リクエストを許可します。有料プランでは、より高い制限、トランザクション着地のためのステーキングされた接続、および優先料金APIが提供されます。
Web3.jsのインストール
SolanaのJavaScript SDKには2つの主要なバージョンがあります。バージョン2.0は、関数型プログラミングパターン、ツリーシェイキング、ゼロ依存性を備えた完全な書き換えです。
バージョン2.0をインストールします。
npm install @solana/web3.js@2 @solana-program/system @solana-program/compute-budget
バージョン1.xとの互換性のため:
npm install @solana/web3.js
ヒントApidogSolana
コアSolana RPC APIメソッド
SolanaのJSON-RPC APIは、クエリ用のHTTPエンドポイントとサブスクリプション用のWebSocketエンドポイントを提供します。すべてのリクエストはJSON-RPC 2.0仕様に準拠しています。

アカウント操作
アカウント情報と残高を取得します。
curl https://api.devnet.solana.com \
-X POST \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "getAccountInfo",
"params": [
"vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36zEGQp",
{"encoding": "base58"}
]
}'
複数のアカウントを効率的に取得します。
curl https://api.devnet.solana.com \
-X POST \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "getMultipleAccounts",
"params": [
[
"vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36zEGQp",
"4fYNw3dojWGPgVMtUU7ziPwq1r2VMGrhCrKZC9EQTbkV"
],
{"encoding": "base64"}
]
}'
ブロックとトランザクションのクエリ
トランザクション構築のための最新のブロックハッシュを取得します。
curl https://api.devnet.solana.com \
-X POST \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "getLatestBlockhash",
"params": [{"commitment": "confirmed"}]
}'
トランザクションステータスをクエリします。
curl https://api.devnet.solana.com \
-X POST \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "getSignatureStatuses",
"params": [
[
"5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpEz7CmGVZxhEHppBrGK"
],
{"searchTransactionHistory": true}
]
}'
WebSocketサブスクリプション
アカウントの変更をリアルタイムで監視します。
import { createSolanaRpcSubscriptions } from "@solana/web3.js";
const rpcSubscriptions = createSolanaRpcSubscriptions(
"wss://api.devnet.solana.com"
);
const abortController = new AbortController();
await rpcSubscriptions.accountNotifications(
"vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36zEGQp",
{ commitment: "confirmed" },
(notification) => {
console.log("Account changed:", notification);
},
{ abortSignal: abortController.signal }
);
// Stop listening after 60 seconds
setTimeout(() => abortController.abort(), 60000);
WebSocket接続は、アクティブな状態を維持するために30〜60秒ごとに定期的なpingを必要とします。本番アプリケーションでは再接続ロジックを実装してください。
プロのヒントApidogSolana
Web3.jsでトランザクションを構築する
Solanaトランザクションは、特定のプログラムを対象とする1つ以上の命令で構成されます。各命令は、プログラム、それが相互作用するアカウント、およびシリアライズされたデータを指定します。
送金トランザクションの作成
バージョン2.0 SDKを使用してアカウント間でSOLを送金します。
import {
airdropFactory,
createKeyPairSignerFromBytes,
createSolanaRpc,
createSolanaRpcSubscriptions,
generateKeyPairSigner,
lamports,
sendAndConfirmTransactionFactory,
pipe,
createTransactionMessage,
setTransactionMessageFeePayer,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstruction,
signTransactionMessageWithSigners,
getSignatureFromTransaction,
} from "@solana/web3.js";
import { getTransferSolInstruction } from "@solana-program/system";
const LAMPORTS_PER_SOL = BigInt(1_000_000_000);
// Setup RPC connections
const rpc = createSolanaRpc("https://api.devnet.solana.com");
const rpcSubscriptions = createSolanaRpcSubscriptions("wss://api.devnet.solana.com");
const sendAndConfirmTransaction = sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions });
// Generate sender and recipient
const sender = await generateKeyPairSigner();
const recipient = await generateKeyPairSigner();
// Fund sender with airdrop
await airdropFactory({ rpc, rpcSubscriptions })({
recipientAddress: sender.address,
lamports: lamports(2n * LAMPORTS_PER_SOL),
commitment: "confirmed",
});
// Get latest blockhash
const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
// Build transaction using pipe
const transactionMessage = pipe(
createTransactionMessage({ version: 0 }),
(msg) => setTransactionMessageFeePayer(sender.address, msg),
(msg) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, msg),
(msg) => appendTransactionMessageInstruction(
getTransferSolInstruction({
amount: lamports(LAMPORTS_PER_SOL / BigInt(2)),
destination: recipient.address,
source: sender,
}),
msg
)
);
// Sign and send
const signedTransaction = await signTransactionMessageWithSigners(transactionMessage);
console.log("Transaction signed");
await sendAndConfirmTransaction(signedTransaction, {
commitment: "confirmed",
maxRetries: 0n,
skipPreflight: true,
});
console.log("Confirmed:", getSignatureFromTransaction(signedTransaction));
pipe関数は、各ステップでトランザクションメッセージを変換する関数チェーンを作成します。このパターンにより、ミュータブルな状態が排除され、トランザクション構築が宣言的になります。
優先手数料による最適化
ネットワークが混雑している間、優先手数料はトランザクションの組み込みを保証します。Helius APIから推奨手数料を取得します。
import { getBase64EncodedWireTransaction } from "@solana/web3.js";
const base64Transaction = getBase64EncodedWireTransaction(signedTransaction);
const response = await fetch("https://mainnet.helius-rpc.com/?api-key=YOUR_KEY", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: "priority-fee-request",
method: "getPriorityFeeEstimate",
params: [{
transaction: base64Transaction,
options: { recommended: true }
}]
})
});
const { result } = await response.json();
const priorityFee = result.priorityFeeEstimate;
// Add priority fee instruction
import { getSetComputeUnitPriceInstruction } from "@solana-program/compute-budget";
const optimizedMessage = pipe(
transactionMessage,
(msg) => appendTransactionMessageInstruction(
getSetComputeUnitPriceInstruction({ microLamports: priorityFee }),
msg
)
);
優先手数料は、コンピュートユニットあたりのマイクロランプポートで指定されます。手数料が高いほど、混雑時のトランザクションの優先度が高まります。
エラー処理
Solanaは、一般的な失敗に対して特定のエラーコードを返します。
import { isSolanaError, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE } from "@solana/web3.js";
try {
await sendAndConfirmTransaction(signedTransaction);
} catch (error) {
if (isSolanaError(error)) {
switch (error.contextErrorCode) {
case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE:
console.error("Preflight failed:", error.message);
break;
default:
console.error("Solana error:", error);
}
}
}
一般的なエラーには、資金不足(0x1)、無効なブロックハッシュ(期限切れ)、アカウント使用中(トランザクションの競合)などがあります。
ベストセキュリティプラクティス
Solanaの高いスループットは、独自のセキュリティ上の考慮事項をもたらします。アプリケーションとユーザーを保護するために、これらの対策を実装してください。
キー管理
秘密鍵をバージョン管理にコミットしないでください。環境変数を使用します。
# .env
SOLANA_PRIVATE_KEY="[1,2,3,...]"
アプリケーションでキーを安全にロードします。
import { createKeyPairSignerFromBytes } from "@solana/web3.js";
import { getBase58Encoder } from "@solana/codecs";
const secretKey = JSON.parse(process.env.SOLANA_PRIVATE_KEY);
const signer = await createKeyPairSignerFromBytes(
new Uint8Array(secretKey)
);
ブラウザアプリケーションの場合、秘密鍵を直接処理するのではなく、ウォレットアダプター(Phantom、Solflareなど)を統合してください。ユーザーはウォレット拡張機能を通じてトランザクションに署名し、鍵を安全に保ちます。
トランザクションシミュレーション
エラーを早期に検出するために、送信前に常にトランザクションをシミュレートしてください。
const simulationResult = await rpc.simulateTransaction(signedTransaction).send();
if (simulationResult.value.err) {
console.error("Simulation failed:", simulationResult.value.err);
// Handle error without wasting fees
}
シミュレーションは、変更をコミットすることなく、現在の状態に対してトランザクションを実行します。これにより、論理エラー、アカウント不足、計算予算違反が明らかになります。
リプレイ保護
Solanaトランザクションには、約90秒後に期限切れになる最近のブロックハッシュが含まれています。これにより、同じトランザクションを複数回送信するリプレイ攻撃を防ぎます。べき等な操作の場合、トランザクションごとに一意の命令データまたはアカウントを生成します。
レート制限
公開RPCエンドポイントは、厳格なレート制限(通常、10秒あたり100リクエスト)を実装しています。指数バックオフを実装してください。
async function withRetry(fn, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
return await fn();
} catch (error) {
if (error.status === 429) {
await new Promise(r => setTimeout(r, 1000 * Math.pow(2, i)));
continue;
}
throw error;
}
}
}
本番環境では、専用のRPCノードまたはより高い制限を持つ有料プロバイダーティアを使用してください。
プログラム検証
サードパーティのプログラムと対話する前に、SolanaFMやSolscanのようなエクスプローラーでそのソースコードを検証してください。デプロイされたバイトコードがオープンソースリポジトリと一致することを示す検証済みバッジを探してください。未検証のプログラムには、ユーザーの資金を吸い上げる悪意のあるロジックが含まれている可能性があります。
結論
SolanaのAPIは、現代のアプリケーションが要求するパフォーマンス(1秒未満のファイナリティ、高スループット、予測可能な手数料)を提供します。JSON-RPCを介してアカウントの状態をクエリし、WebSocketを介してリアルタイム更新を購読し、関数型Web3.js 2.0 SDKを使用してトランザクションを構築します。アカウントベースのアーキテクチャは並列実行を可能にし、コミットメントレベルによりセキュリティと速度のトレードオフを選択できます。
金銭的なリスクなしで実験するためにDevnetから始めましょう。Mainnetが混雑しているときは優先手数料を使用してください。ユーザー向けのアプリケーションをデプロイする前に、シミュレーションと適切なキー管理を実装してください。Solanaのエコシステムはツールを提供し、アプリケーションロジックが価値を決定します。
今日からApidogを始めましょう—Solana APIエンドポイントを数秒でインポートし、ゼロ設定でテストを開始できます。
