SolanaのPlaygroundで遊ぼう
1. はじめに
Solanaを使ったサービスが世に多く出回っています。そこでエンジニアとして気になるのが、どうやってこういったサービスを作るのか?です。私もこの辺初心者で継続学習中の身です。いろいろ調べていく中でまずはSolanaが用意しているPlaygroundを使ってブラウザ上でいじってみるのが良さそうだということがわかりました。この記事ではPlaygroundを使って最低限のコーディングを試せたらと思います。
内容としては、Walletを作成して、WalletにSOLを入金、Walletの情報をTypeScriptで確認してみる、となります。
この記事は、下記Solana公式のクイックスタートを参考にしています。詳細を知りたい方はぜひご覧ください。
2. Playgroundにアクセスする
Playgroundは下記URLでアクセスができます。

Playgroundにアクセス時の画面
3. PlaygroundのWalletを作る
Playgroundの左下の「● Not connected」をクリックします。

「● Not connected」をクリックする
下記のようなダイアログが表示されます。「Save keypair」をクリックして、「Continue」をクリックします。

このダイアログは日本語にすると下記です。
これは何?
Playground Wallet は、トランザクションを自動承認して開発をスピードアップするネイティブウォレットです。
セットアップ方法
将来のためにキーペアを保存する以外、特に操作は不要です。既存のウォレットをインポートすることもできます。
注意
ウォレット情報はブラウザのローカルストレージに保存されます。キーペアを保存しておかない限り、ブラウザの履歴を消去するとウォレットを失います。
ボタン
* Save keypair:キーペアを保存
* Import keypair:キーペアをインポート
* Cancel:キャンセル
* Continue:続行
ウォレットが作成されます。ウォレットのアドレスとSOL残高、接続されているクラスターが表示されます。

ウォレットのアドレスはマスキングしています
4. Walletに開発用のSOLを入金する
Devnet SOLを取得します。
開発者として、SOLは下記2つのユースケースで必要だそうです。
- ネットワーク上でデータを保存したりプログラムをデプロイしたりするための新しいアカウントの作成
 - Solanaネットワークと対話する際のトランザクション手数料の支払い
 
下記SolanaのFaucetのサイトからSOLを取得します。取得にはGitHubアカウントとの接続が必要となります。

5SOLから10SOLに増えましたね。

5. コードを動かすProjectを作る
「+ Create a new project」をクリックします。

「Project name」に任意の名称を入力して、「Native(Rust)」を選択して「Create」をクリックします。

6. TypeScriptファイルを作成する
「New File」をクリックします。

任意のファイル名を入力してキー「Enter」を打鍵します。

これで、TypeScriptファイルが作成されました。
7. コーディング(ブロックチェーン上の情報を見る)
それでは実際にコーディングしてみましょう。今回は作成したWalletやアカウントの情報を表示します。

具体的なソースコードは下記です。
import { LAMPORTS_PER_SOL } from "@solana/web3.js";
// Playgroundの既存ウォレットを使う
const connection = pg.connection;
const wallet = pg.wallet;
console.log(`Playground Wallet: ${wallet.publicKey}`);
// ウォレットの残高を確認
const balance = await connection.getBalance(wallet.publicKey);
console.log(`Balance: ${balance / LAMPORTS_PER_SOL} SOL`);
// アカウント情報を取得
const accountInfo = await connection.getAccountInfo(wallet.publicKey);
console.log(JSON.stringify(accountInfo, null, 2));
ソースコードの詳細解説を下記アコーディオンにまとめています。興味がある方はクリックしてご確認ください。
ソースコードの詳細解説
1行目:必要なツールをインポート
import { LAMPORTS_PER_SOL } from "@solana/web3.js";
- 
何をしているか:Solanaのライブラリから
LAMPORTS_PER_SOLという定数を取り込んでいます - lamportsとは:Solanaの最小単位(円で言う「銭」のようなもの)
 - LAMPORTS_PER_SOL:1 SOL = 1,000,000,000 lamportsという変換定数
 - 例え:1ドル = 100セントの関係と同じです
 
3-4行目:接続の準備
const connection = pg.connection;
- 何をしているか:Playground環境が提供する「Solanaネットワークへの接続」を使います
 - connectionとは:インターネット回線のようなもの。これを通じてブロックチェーンと通信します
 - pgとは:Playgroundの略。ブラウザ環境で自動的に用意されている便利ツール
 
5行目:ウォレットの取得
const wallet = pg.wallet;
- 何をしているか:Playground環境のウォレット(財布)を使います
 - walletとは:仮想通貨を保管する電子財布のようなもの
 - 実際には:公開鍵と秘密鍵のペア(銀行口座番号と暗証番号のような関係)
 
7行目:ウォレットアドレスの表示
console.log(`Playground Wallet: ${wallet.publicKey}`);
- 何をしているか:ウォレットの「公開鍵」(アドレス)を画面に表示
 - publicKeyとは:銀行口座番号のようなもの。他人に教えても安全
 - 用途:他の人があなたにSOLを送るときに使うアドレス
 
10行目:残高の取得
const balance = await connection.getBalance(wallet.publicKey);
- 何をしているか:ブロックチェーンに「このアドレスの残高は?」と問い合わせ
 - awaitとは:「返事が来るまで待つ」という指示
 - getBalanceとは:残高照会機能(ATMの残高照会ボタンのようなもの)
 - 結果:lamports単位で残高が返ってきます
 
11行目:残高をSOL単位で表示
console.log(`Balance: ${balance / LAMPORTS_PER_SOL} SOL`);
- 何をしているか:lamports単位の残高をSOL単位に変換して表示
 - 計算:10,000,000,000 lamports ÷ 1,000,000,000 = 10 SOL
 - 例え:1000セントを100で割って10ドルと表示するのと同じ
 
14行目:アカウントの詳細情報を取得
const accountInfo = await connection.getAccountInfo(wallet.publicKey);
- 何をしているか:アカウントの全情報を取得(残高だけでなく、その他のデータも)
 - getAccountInfoとは:「このアドレスの詳細データをください」という要求
 - 結果:アカウントの完全な情報が返ってきます
 
15行目:JSON形式で整形して表示
console.log(JSON.stringify(accountInfo, null, 2));
- 何をしているか:取得したデータを見やすく整形して表示
 - JSON.stringifyとは:JavaScriptのオブジェクトを文字列に変換
 - null, 2の意味:2スペースでインデント(段差)をつけて見やすくする
 
8. 実行する
実行は、コーディングしたファイルを右クリックして、「Run」をクリックします。

すると下記のようにターミナルに実行結果が出力されます。

具体的な実行結果は下記です。
Running client...
  test.ts:
    Playground Wallet: XXX
$     Balance: 10 SOL
    {
  "data": {
    "type": "Buffer",
    "data": []
  },
  "executable": false,
  "lamports": 10000000000,
  "owner": "11111111111111111111111111111111",
  "rentEpoch": 18446744073709552000,
  "space": 0
}
$ 
実行結果の詳細解説を下記アコーディオンにまとめています。興味がある方はクリックしてご確認ください。
実行結果の詳細解説
1-2行目:実行開始メッセージ
Running client...
  test.ts:
- 意味:「test.ts」というファイルを実行中です
 - client:あなたのブラウザ側で動くプログラムという意味
 
3行目:ウォレットアドレス
Playground Wallet: XXX
- 意味:あなたのウォレットの公開アドレス
 - 形式:Base58という特殊な文字列(大文字小文字の英数字)
 - 用途:このアドレスに他の人がSOLを送ることができます
 
4行目:残高
Balance: 10 SOL
- 意味:ウォレットに10 SOLが入っています
 - 価値:テスト用の仮想通貨なので実際の価値はありません
 
5-16行目:アカウントの詳細情報
dataフィールド
"data": {
  "type": "Buffer",
  "data": []
}
- 意味:このアカウントが保存しているデータ
 - 空の理由:ウォレットは「お金を持つだけ」なのでデータは不要
 - Buffer:バイトデータを扱うための形式
 
executableフィールド
"executable": false
- 意味:このアカウントは実行可能なプログラムではありません
 - false:「いいえ、プログラムではなく、ただのウォレットです」という意味
 
lamportsフィールド
"lamports": 10000000000
- 意味:残高(最小単位)
 - 計算:10,000,000,000 lamports = 10 SOL
 - 重要:これが実際の残高データ
 
ownerフィールド
"owner": "11111111111111111111111111111111"
- 意味:このアカウントを管理するプログラム
 - System Program:Solanaの基本プログラム(すべて1のアドレス)
 - 役割:送金などの基本機能を提供
 
rentEpochフィールド
"rentEpoch": 18446744073709552000
- 意味:レント(保管料)に関する古い仕組みの名残
 - 現在:ほぼ使われていません(歴史的な理由で残っています)
 - 無視してOK:初心者は気にしなくて大丈夫です
 
spaceフィールド
"space": 0
- 意味:dataフィールドのサイズ(バイト数)
 - 0の理由:ウォレットはデータを保存しないため
 
9. おわりに
この記事では、Walletを作成して、WalletにSOLを入金、Walletの情報をTypeScriptで確認してみる方法を記載しました。これはHello World的なもので、「ブロックチェーン上の自分の口座情報を確認する」という、最も基本的な操作を行っています。この記事を参考にして、Solanaのプログラム(一般的にはスマートコントラクトと呼ばれています)を作るきっかけになれば幸いです。
Discussion