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

プログラムのデプロイ

このガイドでは、以下のトピックに関する知識があることを前提としています:

Loader-v3とLoader-v4

現在、loader-v3(programサブコマンド)からloader-v4(program -v4サブコマンド)への移行が進行中です。これはloader-v3が非推奨になっているためです。

新規デプロイメントには、solana program deployの代わりにsolana program-v4 deployを使用してください。

既存のプログラムを移行するには(基本的に再デプロイすることになります):

solana program migrate ./target/deploy/your_program-keypair.json

準備

まず、プログラムをビルド(コンパイル、リンク、ストリップ)する必要があります。

cargo +solana build --target sbpf-solana-solana --release

このステップは、再デプロイや新規デプロイの前に毎回実行する必要があります。

実行可能ファイルのサイズに比例して、デフォルトの支払いアカウントに十分な資金があることを確認してください:

du -h ./target/deploy/your_program.so
solana balance

さらに、各プログラムにはプログラムアカウントとプログラムID(そのプログラムアカウントのアドレス)があります。以下のコマンドでプログラムアカウント用のキーペアを生成します:

solana-keygen new -o ./target/deploy/your_program-keypair.json

これはプログラムごとに一度だけ実行する必要があり、同じプログラムの再デプロイ時に再利用されます。

ツールチェーンにはショートカットが含まれていましたが、現在は段階的に廃止/非推奨になっています:

cargo-build-sbf

初期デプロイ

これで実行可能ファイルをプログラムアカウントにアップロードできます:

Loader-v3

パラメータはprogram-idと呼ばれていますが、実際にはキーペアのファイルパスを指定します:

solana program deploy ./target/deploy/your_program.so --program-id ./target/deploy/your_program-keypair.json

Loader-v4

solana program-v4 deploy ./target/deploy/your_program.so --program-keypair ./target/deploy/your_program-keypair.json

再デプロイ

同じプログラムアカウントに異なる実行可能ファイルを再度アップロードすると、上書き/置換されます。ただし、再デプロイの場合、署名者はアップグレード権限のkeypairであるため、プログラムIDのみ(プログラムkeypairのpubkey)が必要で、keypair全体は必要ありません。

Loader-v3

これは初回デプロイとまったく同じです:

solana program deploy ./target/deploy/your_program.so --program-id ./target/deploy/your_program-keypair.json

古い実行可能ファイルが新しいものより短い場合、最初にprogramdataアカウントを拡張する必要があるかもしれません:

solana program extend ./target/deploy/your_program.so <ADDITIONAL_BYTES>

Loader-v4

初回デプロイではprogram-keypairを使用しましたが、再デプロイでは代わりにprogram-idを使用することに注意してください:

solana program-v4 deploy ./target/deploy/your_program.so --program-id ./target/deploy/your_program-keypair.json

アップロードの優先順位付け

混雑時には、プログラムのデプロイを支援するためにいくつかの追加フラグを使用できます:

  • --with-compute-unit-price: トランザクションのコンピュートユニット価格を設定します。コンピュートユニットあたり0.000001 lamport(マイクロlamport)単位で増加します。Heliusによる優先手数料APIを使用して、設定すべき優先手数料の見積もりを取得してください。
  • --use-rpc: 書き込みトランザクションをvalidator TPUではなく設定されたRPCに送信します。このフラグにはHeliusTritonなどのステーク加重RPC接続が必要です。このフラグはデフォルトとして設定することもできます:solana config set --url <RPC_URL>
  • --max-sign-attempts: blockhashの有効期限切れ後にトランザクションに署名または再署名する最大試行回数。プログラムデプロイ中に送信されたトランザクションが、最初に選択された最新のblockhashの有効期限が切れた後もまだ確認されていない場合、それらのトランザクションは新しい最新のblockhashで再署名され、再送信されます。このオプションを使用して、トランザクション署名の最大繰り返し回数を調整します。各blockhashは約60秒間有効であり、デフォルト値の5を使用すると、すべてのトランザクションが確認されるか、少なくとも5分間トランザクションを送信し続けることになります。

アップロードの再開

アップロードが停止したり中断されたりする可能性があります。

Loader-v3

プログラムのデプロイが失敗した場合、ゼロ以外の残高を含む中間バッファアカウントが残ります。その残高を回収するために、同じ中間バッファを新しい deploy の呼び出しに提供することで、失敗したデプロイを再開することができます。

デプロイ失敗時には、生成された中間バッファのキーペアを回復するために必要なシードフレーズを指定するエラーメッセージが表示されます:

==================================================================================
Recover the intermediate account's ephemeral keypair file with
`solana-keygen recover` and the following 12-word seed phrase:
==================================================================================
valley flat great hockey share token excess clever benefit traffic avocado athlete
==================================================================================
To resume a deploy, pass the recovered keypair as
the [BUFFER_SIGNER] to `solana program deploy` or `solana program write-buffer'.
Or to recover the account's lamports, pass it as the
[BUFFER_ACCOUNT_ADDRESS] argument to `solana program drain`.
==================================================================================

キーペアを回復するには:

solana-keygen recover -o ./target/deploy/buffer-keypair.json

指示されたら、12語のシードフレーズを入力してください。

その後、新しい deploy コマンドを発行し、バッファを指定します:

solana program deploy ./target/deploy/your_program.so --program-id ./target/deploy/your_program-keypair.json --buffer ./target/deploy/buffer-keypair.json

Loader-v4

指定したバイトオフセットからアップロードを再開することが可能です:

solana program deploy ./target/deploy/your_program.so --program-id ./target/deploy/your_program-keypair.json --start-offset <BYTES_UPLOADED_SO_FAR>

確定

これは元に戻せないアクションです。

プログラムはアップグレード権限を削除することで不変にすることができます。

Loader-v3

solana program set-upgrade-authority ./target/deploy/your_program-keypair.json --final

Loader-v4

solana program finalize --program-id ./target/deploy/your_program-keypair.json

プログラムを上書きする代わりに、確定されたプログラムのリンクリストを構築することで、ユーザーに使用したいプログラムのバージョンを選択する機会を提供することも可能です:

solana program finalize --program-id ./target/deploy/your_program-keypair.json --next-version ../your_newer_program/target/deploy/your_newer_program-keypair.json

クローズ

loader-v3でデプロイされたプログラムについては、programdataアカウント、バッファアカウント、およびそれらにロックされた資金のみを回収できます。プログラムアカウント、プログラムID、およびプログラムアカウントに特にロックされた資金は回収できません。

loader-v4でデプロイされたプログラムは、プログラムアカウント、プログラムIDおよびロックされた資金と共に閉じることができ、すべてが再び他の用途に利用可能になります。

Loader-v3

loader-v3を使用してデプロイされたプログラムの場合、これは元に戻せないアクションです。

プログラムが閉じられると、そのプログラムIDは再利用できなくなることに注意してください。以前に閉じられたプログラムIDでプログラムをデプロイしようとするとエラーが発生します。プログラムを閉じた後に再デプロイする必要がある場合は、新しいプログラムのkeypairファイルを生成する必要があります。

単一のprogramdataアカウントを閉じるには:

solana program close ./target/deploy/your_program-keypair.json

現在の権限に関連付けられているすべてのバッファアカウントを閉じるには:

solana program close --buffers

Loader-v4

solana program-v4 close --program-id ./target/deploy/your_program-keypair.json

メタデータの検査

show サブコマンドはプログラムのメタデータを一覧表示します。

出力例は次のようになります:

Program Id: 3KS2k14CmtnuVv2fvYcvdrNgC94Y11WETBpMUGgXyWZL
Owner: BPFLoaderUpgradeab1e11111111111111111111111
ProgramData Address: EHsACWBhgmw8iq5dmUZzTA1esRqcTognhKNHUkPi4q4g
Authority: FwoGJNUaJN2zfVEex9BB11Dqb3NJKy3e9oY3KTh9XzCU
Last Deployed In Slot: 63890568
Data Length: 5216 (0x1460) bytes
  • Program Id は、プログラムを呼び出す際に命令の program_id フィールドで参照できるアドレスです。
  • Owner:このプログラムがデプロイされたローダー。
  • ProgramData Address は、プログラムの実行可能ファイルを保持するプログラムアカウントに関連付けられたprogramdataアカウントです(loader-v3のみ)。
  • Statusretracteddeployed または finalized(loader-v4のみ)。
  • Authority はプログラムのアップグレード権限です。
  • Last Deployed In Slot はプログラムが最後にデプロイされたslotです。
  • Data Length はデプロイメント用に予約されたスペースのサイズです。現在デプロイされているプログラムが実際に使用するスペースはこれより少ない場合があります。

Loader-v3

特定のプログラムを表示するには:

solana program show ./target/deploy/your_program-keypair.json

デフォルトの権限でデプロイされたプログラムのリストを表示するには:

solana program show --programs

権限に関係なくすべてのバッファアカウントを表示するには:

solana program show --buffers --all

異なる権限を指定するには:

solana program show --programs --buffer-authority ~/.config/solana/authority-keypair.json
solana program show --buffers --buffer-authority ~/.config/solana/authority-keypair.json

Loader-v4

特定のプログラムを表示するには:

solana program-v4 show --program-id ./target/deploy/your_program-keypair.json

デフォルトの権限で展開されたプログラムのリストを表示するには:

solana program-v4 show --all

特定の権限で展開されたプログラムのリストを表示するには:

solana program-v4 show --authority ~/.config/solana/authority-keypair.json

実行ファイルのダウンロード

プログラムをダウンロードして比較し、既知の実行ファイルが含まれていることを確認することが役立つ場合があります。ダウンロードしたファイルを切り詰め、ハッシュ化し、元のプログラムファイルのハッシュと比較することができます。

Loader-v3

solana program dump ./target/deploy/your_program-keypair.json ./target/deploy/your_program.so

Loader-v4

solana program download ./target/deploy/your_program.so --program-id ./target/deploy/your_program-keypair.json

高度な使用法:権限の移転

特定のプログラムを変更する権利はその権限者にあります。この権限は、プログラムのkeypairを変更せずに別のkeypairに移転することができるため、プログラムIDは同じままです。さらに、単一の権限者が複数のプログラムアカウントを制御することができます。

初期展開時に明示的に指定されていない場合、デフォルトのkeypairが権限者として使用されます。これが、上記の手順でプログラムを再展開する際に権限者を明示的に指定する必要がなかった理由です。

明示的な権限者は、オフライン署名や複数エンティティによって管理されるプログラムに役立ちます。

まず、権限者用のkeypairを生成する必要があります:

solana-keygen new -o ~/.config/solana/authority-keypair.json

Loader-v3

権限者は展開時に指定できます:

solana program deploy ./target/deploy/your_program.so --upgrade-authority ~/.config/solana/authority-keypair.json

または展開後に、現在の権限者としてデフォルトのkeypairを使用して:

solana program set-upgrade-authority ./target/deploy/your_program-keypair.json --new-upgrade-authority ~/.config/solana/authority-keypair.json

またはデプロイ後に現在の権限を指定する場合:

solana program set-upgrade-authority ./target/deploy/your_program-keypair.json --upgrade-authority ~/.config/solana/authority-keypair.json --new-upgrade-authority ~/.config/solana/new_authority-keypair.json

Loader-v4

デプロイ中に権限を指定できます:

solana program-v4 deploy ./target/deploy/your_program.so --program-keypair ./target/deploy/your_program-keypair.json --authority ~/.config/solana/authority-keypair.json

またはデプロイ後にデフォルトのkeypairを現在の権限として使用する場合:

solana program-v4 transfer-authority --program-id ./target/deploy/your_program-keypair.json --new-authority ~/.config/solana/authority-keypair.json

またはデプロイ後に現在の権限を指定する場合:

solana program-v4 transfer-authority --program-id ./target/deploy/your_program-keypair.json --authority ~/.config/solana/authority-keypair.json --new-authority ~/.config/solana/new_authority-keypair.json

高度な使用法:バッファを使用した二段階再デプロイ

実行可能ファイルをプログラムアカウントに直接アップロードする代わりに、まず一時的なバッファアカウントにアップロードし、その後二段階目(実際の再デプロイ/デプロイ)でプログラムアカウントに転送することができます。これはオフライン署名やDAOの投票など、複数のエンティティによって管理されるプログラムで、実際の再デプロイの前にアップロードされた実行可能ファイルを選択または拒否するのに役立ちます。

バッファアカウントを使用すると、2つのアカウントが同時に1つずつ実行可能ファイルを保持するため、アップロードプロセス中に必要な資金がおおよそ2倍になることに注意してください。

まず、バッファアカウント用のkeypairを作成する必要があります:

solana-keygen new -o ~/.config/solana/buffer-keypair.json

バッファアカウントは異なるアップロードに再利用でき、特定のプログラムアカウントに縛られることはありません。

Loader-v3

solana program write-buffer ./target/deploy/your_program.so --buffer ~/.config/solana/buffer-keypair.json
solana program deploy --program-id ./target/deploy/your_program-keypair.json --buffer ~/.config/solana/buffer-keypair.json

Loader-v4

solana program-v4 deploy ./target/deploy/your_program.so --buffer ~/.config/solana/buffer-keypair.json
solana program-v4 deploy --program-id ./target/deploy/your_program-keypair.json --buffer ~/.config/solana/buffer-keypair.json

高度な使用法:オフライン署名

一部のセキュリティモデルでは、署名キーがネットワークから完全に切断されるように、署名プロセスとトランザクションのブロードキャストを分離する必要があります。これはオフライン署名としても知られています。

再デプロイのみがオフラインモードで実行できることに注意してください。初期プログラムのデプロイは必ずオンラインマシンから実行する必要があり、その後のプログラム再デプロイのみがオフライン署名を活用できます。

典型的なセットアップは、2つの異なる署名者で構成されます:

  • オンライン署名者(手数料支払い者およびバッファアカウントの権限者)
  • オフライン署名者(プログラムアカウントの権限者)

一般的なプロセスは、いくつかの追加ステップを含む2段階の再デプロイメントです:

  1. (オンライン) 新しいプログラムを作成する
  2. (オンライン) 権限をオフラインの署名者に転送する
  3. (オンライン) バッファを作成し、実行可能ファイルをアップロードする
  4. (任意) バッファのオンチェーン内容を検証する
  5. (オフライン) バッファを使用してプログラムを再デプロイするトランザクションに署名する --blockhash <VALUE> --sign-only
  6. (オンライン) この署名を使用して再デプロイメントトランザクションをブロードキャストする --blockhash <VALUE> --signer <OFFLINE_SIGNER_PUBKEY>:<OFFLINE_SIGNER_SIGNATURE>

最新の blockhash を調べて貼り付け、オフライントランザクション署名を生成します。blockhash は約60秒後に期限切れになります。間に合わなかった場合は、新しいハッシュを取得して成功するまで繰り返すか、永続的なトランザクションノンスの使用を検討してください。

Is this page helpful?