読了時間:10分
このガイドは、Solana Web3.js 2.0の新しい名称「Solana Kit」を反映するよう更新されました。皆様が常に最新の状態を維持できるよう、最新のベストプラクティスに従っています。Solana Kit の詳細については、こちらをご覧ください。
概要
Solanaは先日、Solanaブロックチェーンと連携するためのJavaScriptライブラリの大型アップデートである「Solana Kit」を発表しました。このガイドでは、この新しいライブラリを使用してトランザクションを送信するための基本について解説します。
さっそく始めましょう!
主な業務内容
Solana Kit を使用して、Solana の基本的なトランザクションを実行するスクリプトを作成してください:
- ネイティブRPCメソッドとファクトリ関数を使用したSOLのエアドロップ
- 新しいAPIを使用して送金取引を作成・送信する
必要なもの
- Solanaの基礎知識(ガイド:Solana入門)
- Node.js(バージョン 19 以降)がインストールされていること
- TypeScriptとts-nodeがインストールされました
- Solana CLIがインストールされました
このガイドで使用されている依存関係
| 依存関係 | バージョン |
|---|---|
| @solana/kit | >=2.0 |
| @solana-program/system | ^0.5.0 |
| Solana CLI | 1.18.8 |
さあ、始めましょう!
Solana Kitとは何ですか?
Solana Kit は、Solana ブロックチェーンと連携するための JavaScript ライブラリの重要なアップデートです。このアップデートでは、組み合わせやすさ、モジュール性、および開発者体験の向上に重点を置いた新しい API 設計が導入されています。主な機能は以下の通りです:
- 関数型API:新しいAPIは関数型プログラミングのスタイルを採用しており、複雑な操作を組み合わせて実行しやすくなっています。
- TypeScript サポートの強化:型推論の精度向上と型の厳格化により、コードの安全性が向上しました。
- モジュール式設計:機能をより小さく、より特化したモジュールに分割することで、ツリーシェイクが可能になり、バンドルのサイズを小さくすることができます。
- エラー処理の強化:より詳しいエラーメッセージと、改良されたエラータイプ。
APIの変更に関する詳細については、当社のブログ記事「Solana Kitの新機能」をご覧ください。
基本的な送金取引を実行するスクリプトを作成して、これらの機能を詳しく見ていきましょう。
新しいプロジェクトを作成する
まず、プロジェクトを設定しましょう:
mkdir solana-transfer-demo && cd solana-transfer-demo
次に、プロジェクトを Node.js プロジェクトとして初期化します:
npm init -y
依存関係をインストールします:
npm install @solana/kit @solana-program/system && npm install --save-dev @types/node
注:Node.js バージョン 18 より前のバージョンを使用している場合は、
@solana-program/systemパッケージを使用して--legacy-peer-depsflag.
[追加] tsconfig.json 次のコマンドでプロジェクトにファイルを追加します resolveJsonModule 有効:
tsc --init --resolveJsonModule true
「」という名前の新しいファイルを作成します。 transfer.ts プロジェクトディレクトリ内で。
echo > transfer.ts
いいね。さあ、コードを書いてみよう!
依存関係のインポート
あなたの transfer.ts ファイルでは、まず必要な依存関係をインポートすることから始めましょう:
import {
airdropFactory,
createKeyPairSignerFromBytes,
createSolanaRpc,
createSolanaRpcSubscriptions,
generateKeyPairSigner,
lamports,
sendAndConfirmTransactionFactory,
pipe,
createTransactionMessage,
setTransactionMessageFeePayer,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstruction,
signTransactionMessageWithSigners,
getSignatureFromTransaction,
address,
} from "@solana/kit";
import { getTransferSolInstruction } from "@solana-program/system";
const LAMPORTS_PER_SOL = BigInt(1_000_000_000);
ここでは、Solana Kit ライブラリからさまざまな関数をインポートしています。インポートの関数型スタイルに注目してください。各関数は特定のタスクを担当しており、これによりモジュール性と組み合わせやすさが促進されています。この LAMPORTS_PER_SOL この定数はSDKからは利用できなくなったため、自分で定義する必要があります。以前のSDKとは異なり、新しいSDKではすべての金額にbigintが使用されています(Rustプログラミングとの互換性を高めるためです。Rustは u64(Solanaのプログラムでよく使われる型です)。
main関数を作成する
それでは、次に、私たちの メイン スクリプトのロジックを実装する関数:
async function main() {
// 1 - Establish connection to Solana cluster
// 2 - Generate signers
// 3 - Airdrop SOL to accounts
// 4 - Create transfer transaction
// 5 - Sign and send transaction
}
main();
Solanaクラスターへの接続を確立する
内部の メイン 関数では、まずローカルのSolanaクラスターへの接続を確立しましょう:
// 1 - Establish connection to Solana cluster
const httpProvider = 'http://127.0.0.1:8899';
const wssProvider = 'ws://127.0.0.1:8900';
const rpc = createSolanaRpc(httpProvider);
const rpcSubscriptions = createSolanaRpcSubscriptions(wssProvider);
console.log(`✅ - Established connection to ${httpProvider}`);
ここでは、 createSolanaRpc そして createSolanaRpcSubscriptions RPC接続を確立するための関数です。以前のSDKに慣れている方なら、新しいSDKでは接続の確立方法が異なっていることに気づくかもしれません。このガイドではlocalhostを使用しますが、リモートのSolanaクラスターに接続する準備ができている場合は、QuicknodeのHTTPプロバイダーおよびWSSプロバイダーのエンドポイントを Quicknode ダッシュボード.

まだQuicknodeのアカウントをお持ちでない場合は、こちらから無料で作成できます。
署名者を生成する
それでは、このトランザクションの署名者を2人生成してみましょう:
// 2 - Generate signers
const user1 = await generateKeyPairSigner();
console.log(`✅ - New user1 address created: ${user1.address}`);
const user2 = await createKeyPairSignerFromBytes(new Uint8Array([/* your secret key bytes here */]));
console.log(`✅ - user2 address generated from file: ${user2.address}`);
学習を目的として、2つの方法で鍵ペアを生成します。まず、 generateKeyPairSigner user1用の新しい鍵ペアを作成し、 createKeyPairSignerFromBytes 既存のシークレットキーから user2 用のキーペアを作成します。シークレットキーをまだお持ちでない場合は、Solana CLI を使用して生成することができます:
solana-keygen new --no-bip39-passphrase --outfile ./my-keypair.json
ファイルからシークレットを読み込みたい場合は、 インポート ステートメント(ここでは --resolveJsonModule 私たちの tsconfig.json (ファイル):
// インポートに追加してください
import secret from './my-keypair.json';
// 以下の `user2` の行を次のように置き換えてください:
const user2 = await createKeyPairSignerFromBytes(new Uint8Array(secret));
アカウントへのSOLのエアドロップ
SOLを送金するには、まずアカウントに資金を入金する必要があります。ここでも、説明のために2つの異なる方法(1つはネイティブの airdropのリクエスト 方法と、もう一方は airdropFactory 関数)。以下のコードを メイン 関数:
// 3 - Airdrop SOL to accounts
// Using RPC method
const tx1 = await rpc.requestAirdrop(
user1.address,
lamports(LAMPORTS_PER_SOL),
{ commitment: 'processed' }
).send();
console.log(`✅ - user1 airdropped 1 SOL using RPC methods`);
console.log(`✅ - tx1: ${tx1}`);
// Using factory function
const airdrop = airdropFactory({ rpc, rpcSubscriptions });
const tx2 = await airdrop({
commitment: 'processed',
lamports: lamports(LAMPORTS_PER_SOL),
recipientAddress: user2.address
});
console.log(`✅ - user2 airdropped 1 SOL using Factory Function`);
console.log(`✅ - tx2: ${tx2}`);
どちらの方法も同様に有効ですので、ご自身の利用シーンに最も適した方法をお選びください。どちらのアプローチを採用する場合でも、送付先アドレスとエアドロップするSOLの数量を指定する必要があります(なお、新しいSDKでは、 ラムポート この関数は、実質的に bigint タイプ)、およびコミットメントレベル。このケースでは、 ラムポート SOLを、Solanaで使用されている測定単位である「ラムポート」に変換する関数。
振替取引の作成と送信
それでは、送金トランザクションを作成して送信してみましょう。このプロセスでは、新しい Solana Kit SDK のいくつかの重要な機能が紹介されています:
// 4 - Create transfer transaction
const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
const transactionMessage = pipe(
createTransactionMessage({ version: 0 }),
tx => setTransactionMessageFeePayer(user1.address, tx),
tx => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),
tx => appendTransactionMessageInstruction(
getTransferSolInstruction({
amount: lamports(LAMPORTS_PER_SOL / BigInt(2)),
destination: user2.address,
source: user1,
}),
tx
)
);
これを詳しく見ていきましょう:
-
RPC呼び出しと
.send()方法: 新しいSDKでは、.send()手法。これは、getLatestBlockhash()call:const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
このパターンでは、RPCリクエストの構築と実行を分離することで、リクエストの作成においてより高い柔軟性と組み合わせやすさを実現します。
-
パイプを用いたトランザクションの構築: その
パイプ関数は、関数型プログラミングの概念を取り入れた、新しいSDKの重要な機能です。パイプについてご存じない方のために説明すると、パイプを使用すると、複数の操作を連結し、各操作の結果を次の操作の入力として渡すことができます。const transactionMessage = pipe(
createTransactionMessage({ version: 0 }),
tx => setTransactionMessageFeePayer(user1.address, tx),
// ... more operations
);
パイプ内の各関数は、前の関数の結果を入力として受け取り、トランザクションメッセージを段階的に変更していきます。このアプローチにより、特に複雑なトランザクションにおいて、トランザクションの構築プロセスがより読みやすく、保守しやすくなります。
-
別のライブラリからのプログラムの指示: その
getTransferSolInstruction関数は、@solana-program/systemライブラリ:import { getTransferSolInstruction } from "@solana-program/system";
プログラム固有の命令を専用のライブラリに分離するというこの手法は、Kitにおける新しいパターンです。これにより、コードの整理が容易になり、さまざまなSolanaプログラムの管理も簡素化されます。今後、このパターンに従ったプログラム固有のライブラリがさらに増えることが予想され、さまざまなSolanaプログラムとの連携がより容易になるでしょう。
- トランザクションの詳細な構成:
トランザクションが段階的に組み立てられていく様子に注目してください:
createTransactionMessage({ version: 0 }): 新しいトランザクションメッセージを初期化します。setTransactionMessageFeePayer: 取引の手数料支払者を設定します。setTransactionMessageLifetimeUsingBlockhash: 直近のブロックハッシュを使用して、トランザクションの有効期間を設定します。appendTransactionMessageInstruction: トランザクションに転送命令を追加します。
このきめ細かなアプローチにより、開発者はトランザクションの各側面をより細かく制御できるようになり、複数の命令を含む複雑なトランザクションを容易に構築できるようになります。
- 型安全性と不変性: トランザクションの構築における各ステップに個別の関数を使用し、TypeScriptと組み合わせることで、型安全性が向上し、エラーを早期に検出できるようになります。各関数は既存のトランザクションオブジェクトを変更するのではなく、新しいトランザクションオブジェクトを返すため、不変性が促進され、意図しない副作用が発生する可能性が低減されます。
これらの機能を活かすことで、新しいSolana Kit SDKは、Solanaブロックチェーンと連携するための、より堅牢で柔軟性が高く、開発者に優しい手段を提供することを目指しています。SDKを使い続けるうちに、これらのパターンによって、Solanaアプリケーション向けの明確で保守性が高く、エラーに強いコードを容易に記述できるようになることがお分かりいただけるでしょう。
取引への署名と送信
// 5 - Sign and send transaction
const signedTransaction = await signTransactionMessageWithSigners(transactionMessage);
const sendAndConfirmTransaction = sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions });
try {
await sendAndConfirmTransaction(
signedTransaction,
{ commitment: 'confirmed', skipPreflight: true }
);
const signature = getSignatureFromTransaction(signedTransaction);
console.log('✅ - Transfer transaction:', signature);
} catch (e) {
console.error('Transfer failed:', e);
}
このセクションでは、Kitの主な機能をいくつか紹介します:
- 当社では
signTransactionMessageWithSigners指示アカウントのアカウントメタデータに保存されている署名者を任意に指定して、取引に署名します。先ほどのgetTransferSolInstruction関数を見ると、その内容は出典パラメータとして、user1鍵ペア(送信元アカウントの署名者)。そのsignTransactionMessageWithSignersその後、その署名者を使用してトランザクションに署名します。 - 私たちは、
sendAndConfirmTransaction関数を使用してsendAndConfirmTransactionFactory関数。 - 最後に、署名済みのトランザクションを
sendAndConfirmTransaction関数を使用し、以下の方法で取得したトランザクションの署名を返します。getSignatureFromTransaction関数。
ローカル環境のセットアップ
このガイドでは、ローカルのSolanaバリデーターを使用します。新しいターミナルウィンドウを開き、バリデーターを起動してください:
solana-test-validator -r
スクリプトを実行する
スクリプトを実行するには、次のコマンドを実行してください:
ts-node transfer.ts
接続、エアドロップ、および送金取引が正常に完了したことを示す出力が表示されるはずです:

よくやった!
手順を追加する
ご希望であれば、送金取引に追加の指示を自由に付記してください。例えば、次のような指示を パイプ SOLを別のアカウントに送金するには:
tx => appendTransactionMessageInstruction(
getTransferSolInstruction({
amount: lamports(LAMPORTS_PER_SOL / BigInt(3)),
destination: address('SOME_OTHER_ADDRESS'),
source: user1,
}),
tx
)
スキルを向上させるには実践が最善の方法です。ぜひ、さまざまな命令やトランザクションを自由に試してみてください。このガイドのソースコードをご覧になりたい場合は、こちらからご確認ください。 プログラミングを楽しんでください!
まとめ
このガイドでは、基本的な送金トランザクションを実行するスクリプトを作成することで、新しいSolana Kitライブラリについて解説しました。この新しいAPIは、関数型プログラミングのスタイルとファクトリ関数の活用を通じて、モジュール性や組み合わせやすさを促進し、開発者の体験を向上させています。
主なポイント:
- この新しいAPIにより、トランザクションの作成や署名について、よりきめ細かな制御が可能になります。
- ファクトリ関数を使用することで、再利用可能でカスタマイズ可能な関数を作成することができます。
- その
パイプこの関数により、操作を明確かつ読みやすい形で記述することができます。
Kitを使い続けていくうちに、さらに強力な機能や改良点が見つかるはずです。プログラミングを楽しんでください!
皆様からのフィードバックを心よりお待ちしております!❤️
ご意見や新しいトピックに関するご要望などがありましたら、ぜひお知らせください。皆様からのご連絡を心よりお待ちしております。
