Débogage des Programmes Solana
Il existe un certain nombre d'options et d'outils de support pour tester et déboguer un programme Solana.
Faits
Fiche d'Informations
- La crate
solana-program-test
permet l'utilisation d'éléments de base de local runtime où vous pouvez tester et déboguer votre programme de manière interactive (par exemple dans vscode). - La crate
solana-validator
permet d'utiliser l'implémentationsolana-test-validator
pour des tests plus robustes qui se font sur un noeud validateur local. Vous pouvez exécuter depuis l'éditeur mais les points d'arrêt dans le programme sont ignorés. - L'outil CLI
solana-test-validator
exécute et charge votre programme et traite l'exécution des transactions à partir d'applications Rust en ligne de commande ou d'applications Javascript/Typescript utilisant web3. - Pour tout ce qui précède, il est recommandé d'utiliser la macro
msg!
dans votre programme au début, puis de la supprimer au fur et à mesure que vous testez et vous assurez d'un comportement sûr. Rappelez-vous quemsg!
consomme des Unités de Calcul qui peuvent éventuellement faire échouer votre programme en atteignant les plafonds du budget des Unités de Calcul.
Les étapes des sections suivantes utilisent solana-program-bpf-template. Clonez-le sur votre machine :
git clone git@github.com:mvines/solana-bpf-program-template.git
cd solana-bpf-program-template
code .
Tests d'Exécution et Débogage dans l'éditeur
Ouvrez le fichier src/lib.rs
Vous constaterez que le programme est assez simple et se contente d'enregistrer le contenu reçu par la fonction d'entrée du programme : process_instruction
1.Allez dans la section #[cfg(test)]
et cliquez sur Run Tests
. Cela va compiler le programme et ensuite exécuter le test async fn test_transaction()
. Vous verrez les messages de log (simplifiés) dans le terminal vscode sous la source.
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
- Fixer un point d'arrêt sur la ligne
msg!
du programme (11) - De retour dans le module de test, cliquez sur
Debug
et en quelques secondes, le débogueur s'arrêtera sur le point d'arrêt et vous pourrez maintenant examiner les données, parcourir les fonctions, etc.
Ces tests peuvent également être exécutés en ligne de commande avec : cargo test
ou cargo test-bpf
. Bien sûr, les points d'arrêt seront ignorés.
On ne peut pas faire plus groovy !
Remarque
Gardez à l'esprit que vous n'utilisez pas un nœud de validation et que les programmes par défaut, les hashs de blocs, etc. ne sont pas représentés ou ne se comporteront pas comme ils le feraient s'ils étaient exécutés dans un nœud de validation. C'est pourquoi il est possible d'utiliser un Nœud de Validation Local pour faire des tests.
Test avec un Nœud de Validation Local dans l'éditeur
Les tests d'intégration utilisant le chargement programmé d'un nœud de validateur local sont définis dans le fichier tests/integration.rs
.
Par défaut, le template des tests d'intégration du répertoire ne seront exécutables qu'en ligne de commande en utilisant cargo test-bpf
. Les étapes suivantes vous permettront d'exécuter dans l'éditeur, d'afficher les logs du validateur de programme et les sorties msg!
de votre programme :
- Dans le répertoire du repo, exécutez
cargo build-bpf
pour compiler le programme d'exemple - Dans l'éditeur, ouvrez
tests/integration.rs
- Commentez la ligne 1 ->
// #![cfg(feature = "test-bpf")]
- A la ligne 19, modifiez comme suit :
.add_program("target/deploy/bpf_program_template", program_id)
- Insérez ce qui suit à la ligne 22
solana_logger::setup_with_default("solana_runtime::message=debug");
- Cliquez sur
Run Test
au-dessus de la fonctiontest_validator_transaction()
Ceci chargera le noeud de validation et vous permettra de construire une transaction (à la manière de Rust) et de la soumettre au noeud en utilisant le RcpClient
.
La sortie du programme apparaîtra également dans le terminal de l'éditeur. Par exemple (simplifié) :
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
Le débogage ici vous permettra de déboguer les fonctions et méthodes utilisées dans le test body mais ne fera pas de point d'arrêt dans votre programme.
Test avec un Nœud de Validation Local à partir des Applications Clients
Enfin, vous pouvez démarrer un nœud de validation local et charger votre programme et tous les comptes en utilisant le solana-test-validator
depuis la ligne de commande.
Dans cette approche, vous aurez besoin d'une application client, soit en utilisant Rust RcpClient ou en utilisant les clients JavaScript ou Typescript
Voir solana-test-validator --help
pour plus de détails et d'options. Pour le programme d'exemple, voici la configuration :
- Ouvrez un terminal dans le dossier repo
- Exécutez
solana config set -ul
pour définir la configuration pour pointer vers le local - Exécutez
solana-test-validator --bpf-program target/deploy/bpf_program_template-keypair.json target/deploy/bpf_program_template.so
- Ouvrez un autre terminal et lancez
solana logs
pour démarrer le flux des logs - Vous pouvez alors exécuter votre programme client et observer la sortie du programme dans le terminal où vous avez démarré le flux de logs