Solanaプログラムのデバッグ
Solana プログラムをテストおよびデバッグするためのオプションとサポート ツールが多数あります。
Facts
Fact Sheet
- クレート
solana-program-test
を使用すると、必要最小限の local runtime ローカル ランタイムを使用して、プログラムを対話的に(vscodeなどで)テストおよびデバッグできます。 - クレート
solana-validator
を使用すると、solana-test-validator
実装を使用して、**ローカルバリデータノード**で行われるより堅牢なテストを実行できます。エディターから実行できますが、プログラム内のブレークポイントは無視されます。 solana-test-validator
CLI ツールは、は、プログラムを実行およびロードし、コマンドライン Rust アプリケーションまたは web3 を使用する Javascript/Typescript アプリケーションからのトランザクション実行を処理します。- 上記のすべてについて、
msg!
を自由に使用してくださいプログラム内のマクロは、最初は削除することをお勧めします。その後、テストを行って堅実な動作を確認するときに削除します。msg!
を覚えておいてください。計算ユニットを消費し、最終的に計算ユニットの予算上限に達してプログラムが失敗する可能性があります。
以下のセクションの手順ではsolana-program-bpf-templateを使用します。それを自分のマシンにクローンします:
git clone git@github.com:mvines/solana-bpf-program-template.git
cd solana-bpf-program-template
code .
Runtime Testing and Debugging in editor
src/lib.rs
ファイルを開く
プログラムは非常に単純で、基本的にはプログラムのエントリポイント関数によって受信されたコンテンツをログに記録するだけであることがわかります: process_instruction
#[cfg(test)]
セクションに移動し、Run Test
をクリックします。 これにより、プログラムがビルドされ、async fn test_transaction()
テストが実行されます。ソースの下の vscode ターミナルにログ メッセージ (simplified)が表示されます。
running 1 test
"bpf_program_template" program loaded as native code
Program 4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM invoke [1]
Program log: process_instruction: 4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM: 1 accounts, data=[1, 2, 3]
Program 4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM success
test test::test_transaction ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 33.41s
- ブレイクポイントをプログラムの
msg!
がある(11)列目に設定します。 - テストモジュールに戻り、
Debug
をクリックすると、数秒以内にデバッガーがブレークポイントで停止し、データを調べたり、関数をステップ実行したりなどができるようになります。
これらのテストは、コマンド ラインからも実行できます: cargo test
または cargo test-bpf
。 もちろん、ブレークポイントがあっても無視されます。
How groovy can you get!
Note
バリデータノードを使用していないため、デフォルトのプログラム、ブロックハッシュなどは表示されないか、バリデータノードで実行したときのように動作しないことに注意してください。 これが、Solana のギャングが Local Validator Node のテストを提供してくれた理由です!
Local Validator Node Testing in editor
ローカル バリデータ ノードのプログラムによる読み込みを使用した統合テストは、tests/integration.rs
ファイルで定義されています。
デフォルトでは、テンプレートリポジトリの統合テストは、cargo test-bpf
を使用してコマンド ラインからのみ実行できます。 次の手順を実行すると、エディタ内で実行できるだけでなく、プログラムバリデータログとmsg!
を表示することもできます。プログラムからの出力:
- repoディレクトリで
cargo build-bpf
を実行してサンプル プログラムをビルドします。 - エディターで
tests/integration.rs
を開きます。 - 1行目の
// #![cfg(feature = "test-bpf")]
をコメントアウトします。 - 19行目を次のように変更します
.add_program("target/deploy/bpf_program_template", program_id)
- 22行目に以下を挿入
solana_logger::setup_with_default("solana_runtime::message=debug");
test_validator_transaction()
の上にあるRun Test
をクリックします。
これはバリデータノードをロードし、トランザクションを構築し(Rustの方法)、RcpClient
を使用してノードに送信できるようにします。
プログラムの出力は、エディター ターミナルにも出力されます。例、(simplified):
running 1 test
Waiting for fees to stabilize 1...
Waiting for fees to stabilize 2...
Program 4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM invoke [1]
Program log: process_instruction: 4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM: 1 accounts, data=[1, 2, 3]
Program 4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM consumed 13027 of 200000 compute units
Program 4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM success
test test_validator_transaction ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 6.40s
ここでデバッグすると、**テスト本体**で使用されている関数とメソッドをデバッグできますが、プログラムのブレークポイントはできません。
The bee's knees eh?
Local Validator Node Testing from Client Apps
最後に、ローカルの検証ノードを開始し、コマンドラインからsolana-test-validator
を使用してプログラムとアカウントをロードできます。
このアプローチでは、Rust RcpClientを使用するか、 JavaScript または Typescript clientsでクライアント アプリケーションが必要になります。
詳細とオプションについては、solana-test-validator --help
を参照してください。サンプルプログラムの場合、ここにバニラのセットアップがあります:
- repoフォルダーでターミナルを開きます。
solana config set -ul
を実行して、構成がローカルを指すように設定します。solana-test-validator --bpf-program target/deploy/bpf_program_template-keypair.json target/deploy/bpf_program_template.so
を実行します。- 別のターミナルを開き、
solana logs
を実行してログ ストリーマーを開始します。 - その後、クライアント プログラムを実行し、ログ ストリーマーを開始したターミナルでプログラムの出力を確認できます。
Now that is the cat's pajamas YO!