Solanaドキュメントプログラム開発

プログラムのデプロイ

このセクションでは、Solana CLIを使用してSolanaプログラムをデプロイする基本的なプロセスについて説明します。

CLIコマンドリファレンス

タスクコマンド
プログラムのビルドcargo build-sbf
新規プログラムのデプロイsolana program deploy <path_to_program.so>
既存プログラムの更新solana program deploy <path_to_program.so> (デプロイと同じ)
プログラム情報の表示solana program show <program-id>
プログラム権限の移譲solana program set-upgrade-authority <program-id> --new-upgrade-authority <path_to_keypair>
プログラムを不変にするsolana program set-upgrade-authority <program-id> --final
プログラムのクローズsolana program close <program-id> --bypass-warning
ウォレット残高の確認solana balance
エアドロップのリクエスト (devnet/localhost)solana airdrop 2

主要な概念

詳細に入る前に、いくつかの用語を明確にしておきましょう:

  • プログラムID:プログラムのオンチェーンアドレス。ユーザーはプログラムIDを参照することでプログラムと対話します。
  • program account:プログラムのメタデータを格納するオンチェーンアカウント。program accountのアドレスがプログラムIDとなります。program accountはprogramdata accountのアドレスも保存します。
  • programdata account:デプロイされたプログラムの実行可能コードを格納するオンチェーンアカウント。
  • プログラム権限:プログラムを更新または閉じる権限を持つアカウント。デフォルトでは、これはCLIウォレットです。

前提条件

ウォレットの設定

インストール後、ローカルのkeypairウォレットを作成します。このウォレットのアドレスは、プログラムをデプロイする際のデフォルトのプログラム権限として設定されます:

Terminal
$
solana-keygen new

これによりデフォルトで ~/.config/solana/id.json にkeypairが作成されます。

クラスターの設定

デプロイ先のSolanaクラスターを選択します。solana config getコマンドを使用して現在の設定を確認してください:

Terminal
$
solana config get

必要に応じてクラスターを切り替えます:

Terminal
$
solana config set --url mainnet-beta
$
solana config set --url devnet
$
solana config set --url localhost
$
solana config set --url testnet
$
solana config set --url "https://your-rpc-url.com"

ウォレットへの資金提供

プログラムのデプロイには SOL が必要です。必要な量はプログラムのサイズによって異なります。

devnetまたはlocalhostの場合、solana airdropコマンドを使用してウォレットに資金を提供します:

Terminal
$
solana airdrop 2

ウォレットの残高を確認します:

Terminal
$
solana balance

基本操作

プログラムのビルド

プログラムをビルドするには、cargo build-sbfコマンドを使用します:

Terminal
$
cargo build-sbf

サンプルプログラム

これは「Hello, Solana!」をプログラムログに出力する最小限のSolanaプログラムです。

src/lib.rs
use solana_program::{
account_info::AccountInfo, entrypoint, entrypoint::ProgramResult, msg, pubkey::Pubkey,
};
entrypoint!(process_instruction);
pub fn process_instruction(
_program_id: &Pubkey,
_accounts: &[AccountInfo],
_instruction_data: &[u8],
) -> ProgramResult {
msg!("Hello, Solana!");
Ok(())
}

ビルド出力

cargo build-sbfコマンドを使用してプログラムをビルドします:

Terminal
$
cargo build-sbf

これによりtarget/deploy/に2つの重要なファイルが作成されます:

  1. hello_world-keypair.json:公開鍵がプログラムIDとして使用されるkeypairファイル
  2. hello_world.so:コンパイルされたプログラム実行ファイル

サンプルプログラム

これは「Hello, Solana!」をプログラムログに出力する最小限のSolanaプログラムです。

ビルド出力

cargo build-sbfコマンドを使用してプログラムをビルドします:

Terminal
$
cargo build-sbf

これによりtarget/deploy/に2つの重要なファイルが作成されます:

  1. hello_world-keypair.json:公開鍵がプログラムIDとして使用されるkeypairファイル
  2. hello_world.so:コンパイルされたプログラム実行ファイル
lib.rs
Cargo.toml
use solana_program::{
account_info::AccountInfo, entrypoint, entrypoint::ProgramResult, msg, pubkey::Pubkey,
};
entrypoint!(process_instruction);
pub fn process_instruction(
_program_id: &Pubkey,
_accounts: &[AccountInfo],
_instruction_data: &[u8],
) -> ProgramResult {
msg!("Hello, Solana!");
Ok(())
}

プログラムサイズとコストの確認

プログラムをデプロイするには、プログラムのサイズに基づいてプログラムアカウントにSOLを割り当てる必要があります。プログラムが大きいほど、デプロイに必要なSOLも多くなります。

プログラムのサイズを確認します:

Terminal
$
wc -c < ./target/deploy/hello_world.so

このサイズ(バイト)に必要なSOLを計算します:

Terminal
$
solana rent 18504

デプロイトランザクション手数料をカバーするために、表示されている金額よりも少し多めのSOLが必要です。

プログラムのデプロイ

solana program deployコマンドを使用してプログラムをデプロイします:

Terminal
$
solana program deploy ./target/deploy/hello_world.so

表示されるプログラムIDは、ネットワーク上のプログラムの永続的なアドレスです。

(自動生成されたものではなく)特定のプログラムIDでデプロイするには、次のようにします:

Terminal
$
solana program deploy ./target/deploy/hello_world.so --program-id ./custom-keypair.json

solana-keygenコマンドを使用して新しいkeypairを生成できます:

Terminal
$
solana-keygen new -o ./custom-keypair.json

プログラムの更新

同じ solana program deploy コマンドを使用してプログラムを更新します:

  1. プログラムコードに変更を加える
  2. プログラムを再ビルドする: cargo build-sbf
  3. 更新をデプロイする:
Terminal
$
solana program deploy ./target/deploy/hello_world.so

更新したプログラムが現在割り当てられているよりも多くのスペース(バイト)を必要とする場合、デプロイメントは自動的にプログラムアカウントを拡張します。これは新しいプログラムが前のバージョンより大きい場合に発生します。プログラムアカウントは新しいプログラムを格納するために追加のバイトが必要です。CLIは必要なSOLを計算し、自動的にあなたのウォレットから差し引きます。

手動でプログラムを拡張してより多くのバイトを割り当てることもできます:

Terminal
$
solana program extend 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE 1000

プログラム管理

プログラムがデプロイされると、プログラムアカウントを管理するためのいくつかの一般的なコマンドがあります。

プログラムメタデータの表示

プログラムメタデータを確認するには、solana program show コマンドを使用します:

Terminal
$
solana program show 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE

出力例:

$ solana program show 7283x8k8fyBcfaFLyPsxbd2VV1AMmZFP7FNoyTXVKJw7
Program Id: 7283x8k8fyBcfaFLyPsxbd2VV1AMmZFP7FNoyTXVKJw7
Owner: BPFLoaderUpgradeab1e11111111111111111111111
ProgramData Address: Gqn7YQVCP8NtYV1qkEqR4Udhj8EJ3fkikvS7HskCNQ7c
Authority: 5kh6HxYZiAebF8HWLsUWod2EaQQ6iWHpHYCz8UcmFbM1
Last Deployed In Slot: 6573
Data Length: 18504 (0x4848) bytes
Balance: 0.12999192 SOL

プログラム権限の移譲

プログラム権限を別のアカウントに移譲するには、solana program set-upgrade-authorityコマンドを使用します:

Terminal
$
solana program set-upgrade-authority 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE --new-upgrade-authority ./new-authority-keypair.json

プログラム権限を移譲した後は、新しい権限のキーペアにアクセスできない限り、プログラムを更新することはできなくなります。

プログラムを不変にする

プログラムを不変にするには、solana program set-upgrade-authorityコマンドに--finalフラグを付けてプログラム権限を削除します:

Terminal
$
solana program set-upgrade-authority 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE --final

プログラムが不変になると、二度と更新やクローズができなくなります。

プログラムをクローズする

プログラムをクローズしてプログラムアカウントに割り当てられたSOLを回収するには、solana program closeコマンドを使用します:

Terminal
$
solana program close 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE --bypass-warning

クローズすると、Program IDは再利用できなくなります。同じアドレスに新しいプログラムをデプロイすることはできません。

ユーティリティコマンド

すべてのプログラムを一覧表示

現在のウォレットが権限を持つすべてのプログラムを表示します:

Terminal
$
solana program show --programs

出力例:

Program Id | Slot | Authority | Balance
-------------------------------------------------|------------|------------------------------------------------|-------------
7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE | 249885434 | 5kh6HxYZiAebF8HWLsUWod2EaQQ6iWHpHYCz8UcmFbM1 | 0.12999192
3KSGCk4m5hqJkTjPHBXUCPcqMwJnK3VmkqEsFUKKGJPK | 249883212 | 5kh6HxYZiAebF8HWLsUWod2EaQQ6iWHpHYCz8UcmFbM1 | 0.28654328

デプロイされたプログラムをダウンロードする

デプロイされたプログラムをダウンロードするには、solana program dumpコマンドを使用します:

Terminal
$
solana program dump 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE ./downloaded_program.so

高度なオプション

デプロイメントフラグ

Solanaネットワークが混雑している場合、これらのフラグを使用してプログラムのデプロイをサポートします。

使用例:

Terminal
$
solana program deploy ./target/deploy/hello_world.so \
--with-compute-unit-price 10000 \
--max-sign-attempts 10 \
--use-rpc

オプションの説明:

  • --with-compute-unit-price: コンピュートユニットあたりのマイクロラムポート(0.000001 SOL)で優先手数料を設定します。現在のレートについてはHelius優先手数料APIを確認してください。優先手数料は、トランザクションを優先するために現在のリーダーに支払われる追加手数料です。
  • --max-sign-attempts: トランザクションが期限切れになった場合に新しいブロックハッシュで再試行する回数。(デフォルト: 5)
  • --use-rpc: 設定されたRPCにトランザクションを送信します。このフラグにはTritonHeliusなどのプロバイダーからのステーク加重 RPC接続が必要です。

Is this page helpful?