Solanaウォレットの作り方:技術ガイド
著者: Usman Asim
過去数年間で、Solanaは最もアクティブなブロックチェーンネットワークの一つとして急速に台頭してきました。平均1日あたり120万人のアクティブユーザー、1日あたり6,000万件以上のトランザクション(投票を除く)を記録しています。この活動を支えているのはDeFi、DePIN、機関投資家、企業などで、すべてが超高速かつ1取引あたり1セント未満のコストで実行されています。
Solanaで開発を始め、盛り上がりを見せるこのエコシステムに参入したいなら、ウォレットから始めるのが良い入り口です。ウォレットはどのチェーンとやり取りする上でも入口となるもので、トランザクションの署名、資産の保有、アプリの動作を支えます。
このガイドでは、Alchemyの信頼性の高いRPCエンドポイントを使ってネットワークにシームレスに接続しながら、通常のSolanaウォレットを作成する手順を説明し、その後、通常のウォレットとスマートウォレットを比較します。まずはdevnetから始めて、実際のSOLを使わずに動作を確認できるようにします。
Solanaのウォレット: 基本
Solanaのウォレットは、Ethereumで慣れ親しんだものとは少し異なります。ユーザーが制御する外部所有アカウント(EOA)とスマートコントラクトを厳密に分けるのではなく、Solanaはすべてをアカウントとして扱います。アカウントとは、ブロックチェーン上のデータ保存単位です。ここでの「ウォレット」は、多くの場合、1つ以上のアカウントを制御するためのキーペア(公開鍵と秘密鍵)にすぎません。アカウントはSOLトークンやその他の資産を保持することも、プログラム(Solana版のスマートコントラクト)の実行可能コードを保持することもできます。
この統一されたアプローチにより、プログラム派生アドレス(PDA)のような興味深い機能が実現します。これは、プログラムがアドレスを生成し、ユーザーの秘密鍵を必要とせずにユーザーに代わってトランザクションに署名できるというものです。
これはEthereumのモデルよりも柔軟な仕組みです。Ethereumでは、EOAは署名のみを行い、コントラクトが別途ロジックを処理します。Solanaのアカウントモデルについて詳しくは、アカウントとウォレットに関するSolana公式ドキュメントを参照してください。
Solanaのウォレットは大きく2つに分類されます:
- 通常のウォレット(キーペアベース): トランザクションの署名とアカウント管理のための、そのままの暗号キーペアです。スクリプトやテストには適していますが、キーと手数料を手動で扱う必要があります。
- スマートウォレット(アカウント抽象化あり): キー管理などの細かい部分を隠すことで体験を向上させます。スマートウォレットは、ソーシャル認証(シードフレーズの代わりにメールやパスキーでのサインインなど)、ガス/レントのスポンサーシップ(他者がトランザクション手数料を負担する)、バッチトランザクション(複数のアクションを一度に実行)、さらにはプログラム可能なロジックによる自動化された挙動をサポートします。Solanaの設計により、これらはEthereumのERC-4337がUXの調整に重点を置いているのを超えて、特に強力なものになります。Solanaのアカウント抽象化についてさらに詳しくは、ウォレット管理に関するSolana CookbookとSolanaにおけるERC-4337の詳細解説を参照してください。
このチュートリアルでは、Alchemy RPCエンドポイントを使って通常のウォレットを構築します。これにより、自前でノードを立てることなくSolanaネットワークへの信頼性の高いアクセスが得られます。ソーシャルログインなどのスマートウォレット機能については、ウォレットプロバイダーとAlchemyのインフラを組み合わせてください。
前提条件: Devnet環境のセットアップ
コードに入る前に、準備を整えましょう。このチュートリアルは基本的なJavaScriptに慣れていることを前提としていますが、誰でもついていけるよう概念も説明していきます。必要なものは以下の通りです:
-
Node.js(v16以上)とnpm/yarn: ブラウザ外でJSコードを実行するためのランタイムです。まだの場合はnodejs.orgからダウンロードできます。
-
VS CodeやCursorのようなコードエディタ: コードを書いたりデバッグしたりする場所です。VS Codeは無料で、ブロックチェーン開発に便利な拡張機能が豊富です。セットアップはこちらから。Cursorは、よりクールなAI搭載版のVS Codeのようなものです。こちらから確認できます。
-
基本的なJavaScriptの知識: 例ではNode.jsとSolana web3.jsを使用します。
-
Alchemyアカウント: dashboard.alchemy.comから無料で登録してください。新しいアプリを作成し、Solanaを選択し(テスト用にはdevnet、本番用にはmainnet)、APIキーを取得します。ついでに、Sepoliaのような EVM チェーンも有効にしておくと、クロスチェーンアプリを構築する際にハイブリッドサポートとして便利です。
-
通常のウォレット用: Solana web3.jsライブラリをインストールしてください。これがキー生成、接続、トランザクションを処理します。このライブラリはSolanaプログラムとやり取りする際の定番です。
npm install @solana/web3.js
プロのヒント: まずはすべてをdevnetで構築しましょう。これはmainnetへのデプロイを忠実に模した主要なテスト環境で、コントラクトのテストやフローの確認、動作確認がすべて行えます。自信が持てたら、testnetへのデプロイと十分なテストを経て、mainnetへのデプロイはRPC URLを入れ替えるだけで完了します。コードの変更は不要で、切り替えるだけです。
Solanaのウォレット構造を理解する
ウォレットを生成する前に、一旦立ち止まって、Solanaのウォレットがどのように機能するかについて簡単に説明します。これから行う手順がなぜ理にかなっているのかを理解するのに役立ちます。特にEthereumから来た方には有用です。
- アカウント vs. ウォレット: Solanaでは、ウォレットは本質的にアカウントを 所有する キーペアです。アカウントはデータのバケツのようなもので、SOL残高、トークン、プログラムコードを保存できます。Ethereumでは、EOA(ユーザーアドレス)とコントラクトアドレスが明確に区別されているのに対し、Solanaではその境界が曖昧になっています: すべてがアカウントです。つまり、必要に応じてアカウントを作成し、別々に資金を入れ、PDAを通じてプログラムにそれらを制御させることさえできます。キー生成時に自動的にアカウントが作られるわけではなく、資金を入れることで初期化されます。詳しくはSolanaのコアコンセプトを参照してください。
- 動的なガス手数料の代わりにレント: Solanaは計算単位ごとのEthereum式ガスを使用しません: トランザクションには定額の手数料がかかります(2025年時点で平均0.00025ドルと非常に低額)が、残高が閾値(1KBあたり約0.00089 SOL)を下回ると、アカウントはデータをチェーン上に保存し続けるために「レント」を支払う必要があります。これはストレージのデポジットのようなもので、前払いするか、免除されるだけのSOLを維持する必要があります。これにより、非アクティブなアカウントを整理し、ネットワークを効率的に保ちます。トランザクションには依然として手数料がかかりますが、レントは永続性のための独特の仕組みです。これは、操作ごとに課金され、混雑時に急騰するEthereumのガスと比較できます。Solanaのモデルは代わりに速度を優先しています。詳しくはSolanaのレントに関するドキュメントを参照してください。
- PDAとプログラマビリティ: プログラムは、通常のアドレスのように見えるが鍵ではなくコードによって制御される「プログラム派生アドレス」を導出でき、これにより自動署名などのスマートウォレット機能が可能になります。これはEthereumのコントラクトウォレットよりも、Solanaのコアアーキテクチャに深く組み込まれています。
これらの概念を理解すると、Solanaのウォレットがなぜ標準で「プログラマブル」に感じられるのかがわかります。それはすべて、柔軟なアカウントという概念に帰着します。
通常のSolanaウォレットの作り方: ステップバイステップ
通常のウォレットはエントリーレベルの設定です: トランザクションに署名するためのシンプルなキーペアです。バックエンドスクリプトやテスト、抽象化なしで完全な制御を望む場合に最適です。このチュートリアルでは、@solana/web3.jsを使ってキーペアを生成します。
その後、Alchemy RPCを使ってネットワークに接続します。RPC接続がなければ、ウォレットは残高を照会したりトランザクションを送信したりできません。
ステップ1: キーペアの生成
Solana上でウォレットを生成するということは、新しい暗号キーペア、つまり数学的に連動する一対の鍵を作成することです。公開鍵はSolana上のウォレットアドレスとなり、資金を送りたい人やあなたのアカウントとやり取りしたい人に自由に共有できます。秘密鍵(シークレットキーとも呼ばれる)は、そのアドレスの所有者であることを証明し、トランザクションに署名することを可能にするものです。
Ethereumとの重要な違いがここにあります: Ethereumでは、外部所有アカウント(EOA)を生成すると、それは即座に「準備完了」となり、ブロックチェーン上に存在します。Solanaでは、キーペアを生成するのは暗号鍵を作成するだけで、そのアドレスに誰かが資金を入れるまで、ブロックチェーン上の実際のアカウントは存在しません。これは、アカウントがチェーン上に存続するためにレント免除の残高を必要とするSolanaのアカウントモデルの一部です。
新しいJSファイル(例えば regular-wallet.js)を作成し、次のスニペットを実行します:
import { Keypair } from '@solana/web3.js';
const wallet = Keypair.generate();
console.log('Public Key (Wallet Address):', wallet.publicKey.toString());
console.log('Secret Key:', wallet.secretKey); // Secure this immediately! Never log in production.このスクリプトをnode.jsで実行すれば、完成です: ウォレットができました。
戻ってくる結果は以下の通りです:
- 公開鍵(ウォレットアドレス): これは
7xj9WkvP6Az8vG5nXJh4Fq3qY8kPqT9wXVZN2xMqGnD4のようなbase58エンコードされた文字列です。これは資金を受け取りたいときに他者と共有するものであり、アプリへの接続や残高の確認に使用するものです。銀行口座番号のようなものだと考えてください。公開しても安全です。 - シークレットキー: これは
Uint8Array(64バイトの配列)として返されます。これがあなたの秘密鍵であり、このウォレットを制御していることの暗号学的な証明です。このシークレットキーにアクセスできる人は誰でも、トランザクションに署名してウォレットから資金を移動できます。これを共有したり、バージョン管理にコミットしたりしてはいけません。
シークレットキーに関する重要なセキュリティ対策:
- 本番環境ではログに出力しない: 例にある
console.logはローカルでのテストには問題ありませんが、実際のアプリケーションをデプロイする前に削除してください。 - 環境変数を使用する:
.envファイルに保存し、.gitignoreに追加してください。コード内ではprocess.env.PRIVATE\_KEYでアクセスします。 - ハードウェアウォレットを検討する: 大きな価値を扱う本番アプリケーションでは、秘密鍵を安全なハードウェア内に隔離しておけるLedgerやTrezorのようなハードウェアウォレットを統合してください。
- 保存する場合は暗号化する: シークレットキーをデータベースやファイルに保存する必要がある場合は、まず強力な暗号化ライブラリを使って暗号化してください。
セキュリティのベストプラクティスについては、Solanaのセキュリティガイドを確認してください。
ステップ2: Alchemy RPC経由でネットワークに接続する
次に、RPCエンドポイントを使ってウォレットをSolanaのdevnetに接続します。この「接続」オブジェクトにより、コードがブロックチェーンと通信し、残高を取得したり、トランザクションを送信したりできるようになります。Alchemy RPCはSolanaノードへの強化されたプロキシのようなもので、ロードバランシングを処理し、アプリの応答性を保ちます。
これをスクリプトに追加してください(<YOUR_API_KEY>をAlchemyダッシュボードから取得したキーに置き換えてください):
import { Connection } from '@solana/web3.js';
const connection = new Connection(
'https://solana-devnet.g.alchemy.com/v2/<YOUR_API_KEY>', // Devnet for testing
'confirmed' // Commitment level: 'confirmed' for speed with some finality
);
async function checkBalance(publicKey) {
const balance = await connection.getBalance(publicKey);
console.log('Balance:', balance / 1e9, 'SOL'); // Convert lamports (1 SOL = 1e9 lamports)
}
await checkBalance(wallet.publicKey);この接続により、ウォレットに資金が入っているかを確認したり、アプリとやり取りしたりできます。スクリプトを実行してください。資金が入っていない場合、レスポンスは0 SOLを示します。RPCメソッドの全体像については、SolanaのRPCドキュメントまたはAlchemyのSolana RPCガイドを参照してください。
ステップ3: ウォレットに資金を入れてやり取りする
接続が確立できたので、オンチェーンでのやり取りを行いましょう。ここからが本番です: エアドロップによる資金供給(devnetのみ)、トランザクションの署名などです。これらの基本操作により、SOLの送金、プログラムの呼び出し、簡単なツールの構築ができます。
エアドロップをリクエストする(devnetでの資金供給)
Devnetはテスト用の無料SOLを提供しており、アカウントが空の場合に資金を入れることができますが、1つのIPアドレスあたり1日約24 SOLまでという制限があることに注意してください。
手数料のレント免除のためにアカウントに資金を入れる必要があります。この方法はdevnetでのみ機能します。手数料が実際のSOLで支払われる(テストSOLではない)本番環境では、Coinbaseのような取引所を通じてアカウントを購入/資金補充する必要があります。SolanaのDevnet Solガイドを参照してください。
const airdropSignature = await connection.requestAirdrop(
wallet.publicKey,
1e9 // 1 SOL in lamports
);
await connection.confirmTransaction(airdropSignature);
console.log('Airdrop complete! Check balance again.');ここで行われていることは以下の通りです:
- エアドロップのリクエスト:
connection.requestAirdrop\(\)がdevnetにテストSOLを要求します。ウォレットの公開鍵とlamports単位の金額(1e9= 1 SOL)を受け取り、そのトランザクションの一意の識別子であるトランザクション署名を返します。 - トランザクションの確認:
await connection.confirmTransaction\(\)はネットワークがエアドロップを処理するのを待ちます。これは重要で、確認を待たずにいると、エアドロップがリクエストされたにもかかわらず残高がまだ0 SOLと表示される可能性があります。Solanaはトランザクションを非同期に処理するため、待機が必要です。 - 成功: 確認が取れたら、
checkBalance\(\)をもう一度実行すると、ウォレットに1 SOLが表示されるはずです。
トランザクションに署名して送信する
別のアドレスに0.1 SOLを送金してみましょう。この例はトランザクション署名を示しています。秘密鍵がトランザクションを暗号学的に承認し、あなたが送信元ウォレットの所有者であることを証明します。トランザクションを構築し、キーペアで署名し、RPC経由でネットワークにブロードキャストします。トランザクション手数料(約0.000005 SOL)は残高から自動的に差し引かれます。マルチインストラクショントランザクションやプログラム呼び出しなど、より複雑な操作については、Solanaのトランザクションの基本ドキュメントを参照してください。
SOLを送信するには、このコードを実行します:
import { Transaction, SystemProgram, PublicKey, sendAndConfirmTransaction } from '@solana/web3.js';
const recipient = new PublicKey('recipient_address_here'); // Replace with a real address`
const tx = new Transaction().add(
SystemProgram.transfer({
fromPubkey: wallet.publicKey,
toPubkey: recipient,
lamports: 1e8 // 0.1 SOL
})
);
// Simplest approach - handles blockhash and confirmation automatically
const signature = await sendAndConfirmTransaction(
connection,
tx,
[wallet] // Signers
);
console.log('Transfer signature:', signature);ここで行われていることは以下の通りです:
- 受取人の作成:
new PublicKey\(\)は、base58エンコードされたアドレス文字列をSolanaが扱えるPublicKeyオブジェクトに変換します。'recipient\_address\_here'を実際のSolanaアドレスに置き換えてください(自分自身に送信してテストするため、自分のウォレットの公開鍵を使うこともできます)。 - トランザクションの構築:
new Transaction\(\).add\(\)がトランザクションを作成し、送金命令を追加します。SystemProgram.transfer\(\)の呼び出しでは、送信元(fromPubkey)、受取人(toPubkey)、lamports単位の金額(1e8 = 0.1 SOL)を指定します。 - 送信と確認:
sendAndConfirmTransaction\(\)はヘルパー関数で、3つのステップを1つにまとめて処理します: 最新のブロックハッシュを取得し(すべてのSolanaトランザクションに必須)、ウォレットのキーペアでトランザクションに署名し、ネットワークに送信し、確認を待ちます。\[wallet\]配列には署名者全員が含まれ、この場合はあなたのウォレットのみです。 - トランザクション署名: 返される署名は実行の証明であり、ブロックチェーン上のこの特定のトランザクションの一意の識別子です。
- セキュリティのヒント: シークレットキーをハードコードしないでください。代わりに
process.env.PRIVATE\_KEYを使用してください。本番環境では、他の攻撃ポイントを軽減するためにハードウェアウォレットを統合してください。安全なキー管理についてさらに詳しくは、キー管理とセキュリティのベストプラクティスをご覧ください。
すべてうまくいけば、成功したトランザクション署名が返ってきているはずです!その署名は、トランザクションがSolanaのブロックチェーン上で処理されたことの証明です。Solana Explorerで調べれば、送信元、受取人、支払われた手数料、ブロック確認といった詳細をすべて確認できます。
これが、devnet上でシンプルなSolanaウォレットとやり取りする基本です: キーペアを生成し、RPC経由で接続し、資金を入れ、トランザクションに署名する。これらの構成要素 — キーペアの生成、ネットワーク接続、残高確認、トランザクション署名 — は、あらゆるSolana開発作業の基盤となります。
たった今やり取りした通常のキーペアベースのウォレットは、プログラムによる制御が必要なバックエンドスクリプト、テストと開発、キーを直接管理したい人、基本的な送金やプログラムとのやり取りといったシンプルなユースケースに最適です。しかし、見てきたようにトレードオフも伴います: ユーザーは自分でキーを管理し、自分で手数料を支払い、ブロックチェーンとのやり取りの技術的な複雑さに対処する必要があります。UXが重要な一般消費者向けアプリでは、この摩擦が致命的になることもあります。
そこで登場するのがスマートウォレットです。複雑さを抽象化しつつ、ソーシャルログイン、ガスレストランザクション、セッションキーといった強力な機能を提供します。
通常のウォレット vs. スマートウォレット: 簡単な比較
ユースケースに何が必要かを判断しやすいよう、Solanaにおけるウォレットタイプの主な違いをまとめた表を用意しました。プロジェクトでどちらを使うべきかの参考になります。
ベストプラクティス: 構築時に心がけたいヒント
Solanaウォレットを作る際、安全でスケーラブル、かつユーザーフレンドリーなものにするためのベストプラクティスとヒントを紹介します。
- セキュリティを最優先に: 通常のウォレットでは、mainnetでは常にハードウェアウォレット(LedgerやTrezorなど)を使用し、鍵をオフラインに保管してください。スマートウォレットでは、ウォレットプロバイダーのパスキーや多要素認証を使用し、シードフレーズを避けることでフィッシングリスクを減らしましょう。コード内に秘密情報を露出させず、暗号化されたストレージを使用してください。Solanaのセキュリティガイドのようなツールでセットアップを監査してください。
- 十分にテストする: 常にdevnetまたはtestnetから始め、コストをかけずに反復してください。Alchemyのダッシュボードを使ってRPCの使用状況、トランザクションの失敗、パフォーマンス指標を監視しましょう。ブロックチェーン呼び出し用の組み込みデバッガのようなものです。ネットワーク混雑などのエッジケースをシミュレートし、リトライが機能することを確認してください。
- エラーハンドリングと信頼性: RPC呼び出しをtry-catchブロックで包み、指数バックオフによるリトライを追加してください(例えばp-retryのようなライブラリ経由)。Solanaの速度は競合状態を引き起こす可能性があるため、最大限の安全性のために'finalized'コミットメントでトランザクションを確認してください。これにより、特に高トラフィックのアプリで堅牢性が保たれます。
- スケーラビリティの考慮事項: Alchemyのインフラは高負荷に対して自動的にスケールするため、RPCでボトルネックになることはありません。スマートウォレットの場合、可能な限りバッチ処理を行い、トランザクション数を最小限に抑えてください。予期しないコストを避けるため、レント免除の状況を監視してください。Solscanエクスプローラーのようなツールがこれの追跡に役立ちます。
- さらに詳しく学ぶためのリソース: SDKの変更についてはAlchemyのSolanaドキュメントで最新情報を確認し、UI統合についてはSolana公式のreactウォレットアダプターを参照してください。
まとめ: Solanaで構築を始めよう
以上で、Alchemyの助けを借りて通常のSolanaウォレットを立ち上げる方法と、スマートウォレットとの比較についての知識が身につきました。シンプルな送金をスクリプト化するにせよ、ガスレスログインを備えた優れたdAppを構築するにせよ、Solanaのエコシステムはイノベーションの準備が整っています。今こそ飛び込んで実験を始めるときです。さらに詳しくは、Solana開発者向けリソースの全体像とSolanaドキュメントをご覧ください。開発を楽しんでください — 質問があればAlchemyサポートセンターを訪れてください。オンチェーンでの成果を作りましょう!
よくある質問
Solanaウォレットとは何ですか?
Solanaウォレットとは、Solanaブロックチェーン上のアカウントを制御するためのキーペア(公開鍵と秘密鍵)であり、SOLトークン、その他の資産、実行可能コードを保持できます。EthereumのEOAモデルとは異なり、Solanaはすべてをより柔軟でプログラム可能な構造を持つアカウントとして扱います。
Solanaウォレットの作成にお金はかかりますか?
いいえ、キーペアの生成は無料ですが、Solana上のアカウントはチェーン上に存続するためにレント(1KBあたり約0.00089 SOL)が必要で、トランザクション手数料は平均0.00025ドルです。devnetではエアドロップを通じて無料のテストSOLを取得できますが、mainnetではSOLを購入する必要があります。
通常のSolanaウォレットとスマートSolanaウォレットの違いは何ですか?
通常のウォレットは、手動でキーを管理し手数料を支払う基本的なキーペアで、スクリプトやテストに最適です。スマートウォレットはアカウント抽象化を使用して、ソーシャルログイン、ガススポンサーシップ、バッチトランザクション、プログラム可能なロジックを提供し、ユーザー向けアプリに最適です。
シードフレーズの代わりにソーシャルログインを使用できますか?
はい、多くのスマートウォレットプロバイダーは、シードフレーズを管理する代わりに、メール、Google、パスキーによる認証をユーザーに提供しています。これにより、ユーザーにとって従来のキー管理の手間がなくなります。
devnetでSolanaウォレットに資金を入れるにはどうすればよいですか?
connection.requestAirdrop()を使って、devnetで無料のテストSOLを取得してください(IPアドレスあたり1日約24 SOLに制限されます)。mainnetでは、Coinbaseのような取引所を通じてSOLを購入する必要があります。
Solanaにおけるレントとは何ですか?
レントは、アカウントがオンチェーンでアクティブであり続けるために最低限のSOL残高(1KBあたり約0.00089 SOL)を維持しなければならないストレージデポジットの仕組みです。Ethereumのガス手数料とは異なり、非アクティブなアカウントを整理することでネットワークを効率的に保つのに役立ちます。
スマートウォレットはユーザーのトランザクション手数料をスポンサーできますか?
はい、一部のスマートウォレットプロバイダーはガスとレントのスポンサーシップをサポートしています。これにより、アプリがユーザーの手数料を負担し、ガスレスな体験を実現して、コンバージョンの向上とオンボーディングの簡略化につながります。
自分でSolanaノードを運用する必要がありますか?
いいえ、Alchemyのわ RPCエンドポイントは、自前でノードを運用することなくSolanaネットワークへの信頼性の高いアクセスを提供します。このサービスはロードバランシングとスケーリングを処理し、リアルタイム更新のためのHTTPとWebSocketの両方の接続を提供します。
Alchemy Newsletter
リリース情報をいち早く受け取る
ニュースレターに登録する
Alchemyの最新のプロダクト情報とリソースをお届けします
メールアドレスを入力すると、当社のマーケティング情報およびプロダクト最新情報の受信に同意したことになります。Alchemyが受け取った情報をプライバシー通知に従って取り扱うことに同意するものとします。購読はいつでも解除できます。
関連記事

Glamsterdam: Ethereum開発者のための完全ガイド
GlamsterdamはSepoliaで稼働中です。開発者にとって何を意味するか、Alchemyがネットワークアップグレードにどう備えたかをまとめた完全ガイドです。

トレーディングチームが低レイテンシーRPCにAlchemyを選ぶ理由
トレーディングチームがAlchemyを選ぶのは、市場が動くときの低レイテンシーな読み取りと書き込み、そして出来高のピーク時でも資金が決済される際の信頼できる記録のためだ。

東京で構築するなら、どのRPCプロバイダーを選ぶべきか
東京を提供するRPCプロバイダー5社を、5つのチェーンでベンチマークした。比較結果と、レイテンシに敏感なチームにとって差が出るポイントを示す。